2016-10-06 53 views
1

我想臨時映射一個驅動器與powershell(我發現this post給了我需要的命令),然後打開一個Windows資源管理器窗口顯示該驅動器。我想我可以用ii MyDrive:\MyPath\來做到這一點。可以使用PowerShell檢查Windows資源管理器窗口的狀態嗎?

我想,當我的Windows資源管理器窗口被用戶關閉,dismap映射先前映射的網絡驅動器,然後停止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 +空格在ISE

然後我通過get-過程歷時過程CMD

$process = get-process -Id ([System.Diagnostics.Process]::Start("explorer.exe", "C:\")).Id 

這導致我像一個過程:

> $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循環,並在其中進行睡眠,在那裏你檢查過程是否仍然存在。

唯一的問題是,該窗口無法打開兩次或具有相同名稱的目錄。

但也許你可以使用這段代碼。只是玩耍,看看你能弄清楚什麼。

編輯:

此代碼對我的作品:)

$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" 

格爾茨Eldo.Ob

+0

問題:我嘗試了其他IDE中通常使用的每個快捷方式,例如Ctrl + Space,但它不適用於我的PowerShell ISE,並且我不明白「Strg」是什麼意思。你能開發你的意思嗎? –

+0

哦對不起strg是germen一個xD我ment ctrl。這是一種自動完成。如果你輸入get-然後按下ctrl + space,它應該給你一個可用命令列表。但只有在沒有腳本運行的情況下才有效。 –

+0

x)然後它讓我感到困擾,因爲Ctrl + Space只是在腳本中放了一個空格......我沒有腳本運行。我知道這個快捷方式應該工作,因爲我之前在運行Windows Server 2008 R2的虛擬機上使用它... 編輯:Ctrl +空格未列在Windows的快捷鍵列表中PowerShell幫助(顯示F1) –

-1

您可以使用淨使用。像這樣:

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

註銷後,驅動器沒有映射了

+0

他們想在資源管理器窗口關閉後刪除映射,而不是註銷。 – Joey

+0

您是否使用PowerShell啓動資源管理器窗口? – guiwhatsthat

+0

基本上我想將用戶連接到受權限保護的驅動器,但我不想授予他許可。因此我需要連接密碼,但我不想讓他知道密碼。我認爲使用PowerShell可以讓我做到這一點。 –

相關問題