2016-10-06 4 views
1

Я бы хотел временно отобразить диск с powershell (я нашел this post, который дал мне нужные мне команды), а затем откройте окно проводника Windows, отображающее этот диск. Я думаю, что могу сделать это, используя ii MyDrive:\MyPath\.Могу ли я проверить состояние окна проводника Windows с помощью PowerShell?

Я бы хотел, чтобы окно моего окна окон было закрыто пользователем, чтобы отключить ранее подключенный сетевой диск, а затем остановить скрипт powershell.

Вопрос: Есть ли способ проверить состояние окна проводника Windows?


Следует упомянуть, что я никогда раньше не работал с powershell, поэтому у меня нет большого знания об этом.

+2

Это не так просто. Даже когда вы начинаете новый экземпляр, он будет только в ближайшее время, сообщая другому процессу, чтобы открыть это окно. Таким образом, вы не можете легко увидеть, все ли вокруг вас. Это зависит от настройки «Запуск окон папки в отдельном процессе», который по умолчанию отключен. Другим вариантом является поиск окна с соответствующим заголовком, но это хрупкий подход, который может сломаться в будущем, и если они откроют другую папку в этом окне, вы ошибочно поймете, что оно ушло. TL; DR: PowerShell или нет. Это не так, чтобы получить право и, скорее всего, пойти не так, как надо. – Joey

ответ

2

Эй я не получил решение, , но, может быть, мой подход является способом решения.

Я немного поиграл с функциями .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

+0

Вопрос: Я пробовал каждый ярлык, обычно используемый в другой среде IDE, такой как Ctrl + Space, но это не работает на моей PowerShell ISE, и я не понимаю, что вы подразумеваете под «Strg». Не могли бы вы понять, что вы имеете в виду? –

+0

oh sorry strg - это семя один xD i ment ctrl. Это своего рода автозаполнение. Если вы наберете get-, а затем нажмите ctrl + space, он должен предоставить вам список доступных команд. Но он работает только в том случае, если скрипт не запущен. –

+0

x) Это беспокоит меня тогда, потому что Ctrl + Space просто помещает пробел в мой скрипт ... У меня нет скрипта. Я знаю, что этот ярлык должен работать, потому что я использовал его раньше на виртуальной машине, работающей на сервере Windows 2008 R2 ... EDIT: Ctrl + Пробел не указан в списке ярлыков справки Windows PowerShell (отображается с F1) –

-1

Вы можете использовать сетевое использование. как это:

net use K: \\servername\sharename /persistent:no 

После выхода из системы диск не отображается больше

+0

Они хотят удалить отображение после закрытия окна проводника, а не при выходе из системы. – Joey

+0

Вы начинаете окно проводника с помощью powershell? – guiwhatsthat

+0

В основном я хочу подключить пользователя к диску, защищенному правами, но я не хочу давать ему разрешение. Поэтому мне нужно связать его с паролем, но я не хочу, чтобы он знал пароль. Я думал, что использование powershell позволит мне это сделать. –