Скрипт Powershell для отображения всех открытых окон Explorer - PullRequest
0 голосов
/ 10 ноября 2019

В этом вопросе показан сценарий Powershell для создания списка открытых окон проводника и их пути. Моя цель - захватить открытый в настоящее время набор окон обозревателя и записать файл CMD с такими командами, как: C: \ WINDOWS \ explorer.exe / e, "C: \ open \ this \ folder"

Поэтому я хотел бы иметь полный путь и имя папки в обычной записи пути. Вот что отображается в заголовке окна Проводника 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 предоставляетполный путь в стиле escape-URL:

file:///C:/open/this/Favorite%20%folder"

Компонент @ {n = 'Title'; e = {Get-WindowTitle $ _. HWND}} создает столбец "Title", который усекается до5 символов:

C:\...

Полный вывод для одного окна проводника выглядит следующим образом:

LocationURL                                                 Title
-----------                                                 -----
file:///C:/open/this/Favorite%20%folder                     C:...

Я обнаружил, что могу избежать усечения, заполнив строку 'Title' многими пробелами. Ширина этой строки, кажется, определяет максимальную ширину вывода. Тем не менее, я наблюдаю, что только около 60% открытых окон проводника указывают путь. Остальные - просто пустая строка.

Я попытался "$ app.Windows () | Select-Object LocationName", но вывод содержит только только имя папки Explorer, но не полный путь и папку, отображаемую в заголовке Explorer.

Еще одна загадка - почему скрипт работает так медленно. Если у меня открыто 10 окон обозревателя, сценарий запускается в течение 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}}

Это вывод (с некоторыми изменениями с *** для конфиденциальности)

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***

1 Ответ

1 голос
/ 10 ноября 2019

Я предполагаю, что вы действительно заинтересованы в локальных путях файловой системы открытых окон Проводника, а не обязательно в заголовках окон (которые не обязательно отражают полные пути).

Немного неясно, что объекты окна, возвращаемые методом .Windows(), содержат локальное представление пути в свойстве .Document.Folder.Self.Path.

(New-Object -ComObject 'Shell.Application').Windows() | ForEach-Object { 
  $localPath = $_.Document.Folder.Self.Path 
  "C:\WINDOWS\explorer.exe /e, `"$localPath`""
}

Приведенный выше вывод выводит, например:

C:\WINDOWS\explorer.exe /e, "C:\Users\jdoe"
C:\WINDOWS\explorer.exe /e, "C:\Program Files"

Вы можете вывести это в файл командного файла по мере необходимости, например, добавив | Set-Content file.cmd к вышеуказанной команде.


Я обнаружил, что могу избежать усечения

Усечение - это просто артефакт отображения - данные все еще там.

Вы можете сделать данные видимыми одним из двух способов:

  • труба к Format-Table -AutoSize, чтобы убедиться, что значения столбцов не усекаются, пространство позволяет

  • труба к Format-List, которая будет показывать каждое свойство в отдельной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...