簡體   English   中英

Powershell 腳本列出所有打開的資源管理器 windows

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM