首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列出所有打开的资源管理器窗口的Powershell脚本

列出所有打开的资源管理器窗口的Powershell脚本
EN

Stack Overflow用户
提问于 2019-11-09 21:11:21
回答 1查看 2.4K关注 0票数 6

This question显示了一个Powershell脚本来生成打开的文件资源管理器窗口的列表及其路径。我的目标是捕获当前打开的资源管理器窗口集,并写出一个CMD文件,命令如下: C:\WINDOWS\explorer.exe /e、“C:\ open \this\文件夹”

因此,我希望有完整的路径和文件夹名称的正常路径符号。这是资源管理器Windows的标题栏中显示的内容:“C:\open\ This \收藏夹”

拟议的守则是:

代码语言:javascript
运行
复制
function Get-WindowTitle($handle) {
  Get-Process |
    Where-Object { $_.MainWindowHandle -eq $handle } |
    Select-Object -Expand MainWindowTitle
}

$app = New-Object -COM 'Shell.Application'
$app.Windows() |
  Select-Object LocationURL, @{n='Title';e={Get-WindowTitle $_.HWND}}

如上所示,LocationURL以转义的URL样式提供了完整的路径:

代码语言:javascript
运行
复制
file:///C:/open/this/Favorite%20%folder"

@{n='Title';e={Get-WindowTitle $_.HWND}}组件生成一个列"Title“,该列被截断为5个字符:

代码语言:javascript
运行
复制
C:\...

一个资源管理器窗口的完整输出如下:

代码语言:javascript
运行
复制
LocationURL                                                 Title
-----------                                                 -----
file:///C:/open/this/Favorite%20%folder                     C:...

我发现我可以通过在字符串'Title‘中填充许多空格来避免截断。该字符串的宽度似乎决定了输出的最大宽度。不过,我发现打开的资源管理器窗口中只有大约60%列出了路径。剩下的只是空白行。

我尝试了"$app.Windows() \x{e76f}选择对象LocationName",但是输出只包含资源管理器文件夹名,而不是显示在资源管理器标题中的完整路径和文件夹。

另一个谜是为什么脚本运行这么慢。如果打开了10个资源管理器窗口,脚本将运行30秒,每次路径运行大约3秒。

对于此脚本:

代码语言:javascript
运行
复制
function Get-WindowTitle($handle) {
  Get-Process |
    Where-Object { $_.MainWindowHandle -eq $handle } |
    Select-Object -Expand MainWindowTitle
}

$app = New-Object -COM 'Shell.Application'
$app.Windows() |
  Select-Object LocationName,@{n='              ------------Title----------------                                   ';e={Get-WindowTitle $_.HWND}}

这是输出(为了隐私起见,有些人用*进行编辑)

代码语言:javascript
运行
复制
PS C:\E***> .\OpenExplorer.ps1

LocationName               ------------Title----------------
------------ ----------------------------------------------------------------------------------
2019-07
Ame****
2019 Priv...
2019-10-3... C:\E\Event Presentations\2019-10-31 Priv**********bcast
E            C:\E
5G Brief ... C:\E\Tech************ing\5G Brief (2018)
36 Series...
2019 DE* ... C:\E\16*****N\2019 DE*******************
Newsletters  C:\E\Newsletters
Reports      C:\E\Tech************ing\Reports
2019-10-2... C:\E\16**********s\2019-10-29 *********************
2019-11      C:\Data\Docs\Stand*********24\2019-11
UB****
Financial... C:\E\Financ************
Expenses     C:\E\Internal\Expenses
E            C:\E
E***
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-09 21:46:44

我想您真正感兴趣的是打开的Explorer窗口的本地文件系统路径,而不一定是窗口标题(不能保证反映完整的路径)。

有些模糊的是,.Windows()方法返回的窗口对象在其.Document.Folder.Self.Path属性中包含本地路径表示。

代码语言:javascript
运行
复制
(New-Object -ComObject 'Shell.Application').Windows() | ForEach-Object { 
  $localPath = $_.Document.Folder.Self.Path 
  "C:\WINDOWS\explorer.exe /e, `"$localPath`""
}

上述结果产生的输出如下:

代码语言:javascript
运行
复制
C:\WINDOWS\explorer.exe /e, "C:\Users\jdoe"
C:\WINDOWS\explorer.exe /e, "C:\Program Files"

您可以根据需要将其输出到批处理文件中,例如将| Set-Content file.cmd附加到上面的命令中。

注意:窗口是按照创建的顺序列出的,因此您无法推断其中哪些是最近激活的。请参阅this answer以获得找到最顶层文件资源管理器窗口并确定其中显示的路径的解决方案。

我发现我可以避免截断

截断只是一个显示工件-数据仍然在那里。

您可以通过以下两种方式之一使数据可见:

  • 管道到Format-Table -AutoSize以确保列值不被截断,空间允许

  • 管道到Format-List,它将在自己的行上显示每个属性(行包装过长的值).
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58783530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档