Эй я не получил решение, , но, может быть, мой подход является способом решения.
Я немного поиграл с функциями .net и получил этот процесс. Процесс сразу пошел после вызова проводника ...
Так базовая функция является
[System.Diagnostics.Process]::Start("explorer.exe", "C:\")
, что возвращает процесс:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id SI ProcessName
------- ------ ----- ----- ----- ------ -- -- -----------
4 2 392 1140 10 0,00 6328 1 explorer
Там еще некоторые функции в нем например:
[System.Diagnostics.Process]::Start("explorer.exe", "C:\").WaitForExit()
Но ничего не происходит :(
Если поместить результат в переменную, вы можете открыть для себя функции и атрибуты:
$tmp = [System.Diagnostics.Process]::Start("explorer.exe", "C:\")
Тип $ TMP. и нажмите Strg + Space в ISE
Тогда я взял процесс CMD
$process = get-process -Id ([System.Diagnostics.Process]::Start("explorer.exe", "C:\")).Id
с помощью Get-Process Это приводит меня процесс, как:
> $process
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id SI ProcessName
------- ------ ----- ----- ----- ------ -- -- -----------
0 1 384 120 6 8396 1 explorer
Но тот же: этот процесс ушел immidiatly :(
Я играл и получил эту резолюцию:
$path = "C:\temp\test"
$split = $path.split("\\")
$mainWindowTitle = $split[$split.Length - 1]
$tmp = [System.Diagnostics.Process]::Start("explorer.exe", $path)
sleep -Seconds 2
Get-Process | ? ProcessName -eq explorer | select * | ? MainWindowTitle -eq $mainWindowTitle | select Id
С помощью этого кода я получаю процесс, который вы ищете. Позвольте мне объяснить это вам.
Сначала мне нужен путь и последний подкаталог в нем. Каждый исследовательский процесс имеет mainWindowTitle, а его значение - это имя открытого каталога.
Итак, я начал исследовать определенный путь и разделил последний подкаталог. Вам нужно спать в течение 1 или 2 секунд, потому что процесс займет некоторое время, прежде чем попасть в список процессов. Затем я искал каждого исследователя с помощью windowMainTitle, равным последнему подкаталогу.
Итак, теперь у вас есть processId, с помощью которого вы можете создать цикл while со сном в нем, где вы проверяете, существует ли процесс.
Единственная проблема заключается в том, что окно нельзя открыть дважды или каталог с тем же именем.
Но, возможно, вы можете использовать этот код. Просто поиграйте и посмотрите, что вы можете понять.
Edit:
Этот код работает для меня :)
$path = "C:\temp\test"
$split = $path.split("\\")
$mainWindowTitle = $split[$split.Length - 1]
$tmp = [System.Diagnostics.Process]::Start("explorer.exe", $path)
sleep -Seconds 2
$processId = (Get-Process | ? ProcessName -eq explorer | select * | ? MainWindowTitle -eq $mainWindowTitle | select Id).Id
while((get-process -Id $processId).Length -gt 0){
sleep -Seconds 1
$processId = (Get-Process | ? ProcessName -eq explorer | select * | ? MainWindowTitle -eq $mainWindowTitle | select Id).Id
}
# All code after will be executed after window was closed
write-host "Window Closed"
Greetz Eldo.Ob
Это не так просто. Даже когда вы начинаете новый экземпляр, он будет только в ближайшее время, сообщая другому процессу, чтобы открыть это окно. Таким образом, вы не можете легко увидеть, все ли вокруг вас. Это зависит от настройки «Запуск окон папки в отдельном процессе», который по умолчанию отключен. Другим вариантом является поиск окна с соответствующим заголовком, но это хрупкий подход, который может сломаться в будущем, и если они откроют другую папку в этом окне, вы ошибочно поймете, что оно ушло. TL; DR: PowerShell или нет. Это не так, чтобы получить право и, скорее всего, пойти не так, как надо. – Joey