[英]Powershell script to list all open Explorer windows
此問題顯示了 Powershell 腳本,用於生成打開的文件資源管理器 windows 及其路徑的列表。 我的目標是捕獲當前打開的資源管理器集 windows,並使用以下命令寫出 CMD 文件:C:\WINDOWS\open\this\folder.exe:\WINDOWS\open\this\folder.exe:
所以我想用普通路徑表示法獲得完整路徑和文件夾名稱。 這是資源管理器 Windows 的標題欄中顯示的內容:“C:\open\this\Favorite folder”
建議的代碼是:
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 樣式的完整路徑:
file:///C:/open/this/Favorite%20%folder"
@{n='Title';e={Get-WindowTitle $_.HWND}} 組件生成一列“Title”,該列被截斷為 5 個字符:
C:\...
一個資源管理器 window 的完整 output 如下所示:
LocationURL Title
----------- -----
file:///C:/open/this/Favorite%20%folder C:...
我發現我可以通過用許多空格填充字符串“標題”來避免截斷。 該字符串的寬度似乎決定了 output 的最大寬度。 盡管如此,我觀察到只有大約 60% 的開放式資源管理器 windows 列出了路徑。 rest 只是一個空白行。
我嘗試了“$app.Windows() | Select-Object LocationName”,但 output 僅包含資源管理器文件夾名稱,而不包含資源管理器標題中顯示的完整路徑和文件夾。
另一個謎團是為什么腳本運行如此緩慢。 如果我有 10 個資源管理器 windows 打開,腳本運行 30 秒,每個路徑大約需要 3 秒。
對於這個腳本:
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}}
這是 output (為了隱私,有些用 *** 編輯)
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***
我假設您真正感興趣的是打開的 Explorer windows 的本地文件系統路徑,不一定是 window 標題(不能保證反映完整路徑)。
有點模糊的是, .Windows()
方法返回的 window 對象在其.Document.Folder.Self.Path
屬性中包含本地路徑表示。
(New-Object -ComObject 'Shell.Application').Windows() | ForEach-Object {
$localPath = $_.Document.Folder.Self.Path
"C:\WINDOWS\explorer.exe /e, `"$localPath`""
}
以上產生 output 如:
C:\WINDOWS\explorer.exe /e, "C:\Users\jdoe"
C:\WINDOWS\explorer.exe /e, "C:\Program Files"
您可以根據需要將 output 這添加到批處理文件文件中,例如通過附加| Set-Content file.cmd
| Set-Content file.cmd
為上述命令。
注意:windows 按創建順序列出,因此您無法推斷其中哪些是最近激活的。 有關找到最頂層文件資源管理器 window 並確定其中顯示的路徑的解決方案,請參閱此答案。
我發現我可以避免截斷
截斷只是一個顯示工件- 數據仍然存在。
您可以通過以下兩種方式之一使數據可見:
pipe 到Format-Table -AutoSize
以確保列值不被截斷,空間允許
pipe 到Format-List
,它將在自己的行上顯示每個屬性(換行過長的值)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.