2017-12-27 876 views
0

我試圖創建一個PowerShell腳本,首先我想檢查程序是否正在運行,如果沒有,然後繼續刪除特定的文件。到目前爲止,我的內容如下:如何在PowerShell中刪除文件之前檢查程序是否正在運行?

$Prog = "C:\Program Files (x86)\xyz.exe" 
if ((Get-Process $Prog -EA SilentlyContinue) -eq $null) { 
} 
Remove-Item "C:\Program Files (x86)\abc\123.xml" 
Remove-Item "C:\Program Files (x86)\abc\456.xml" 

但是,即使程序正在運行,此代碼也會刪除文件。因此它會忽略Remove-Item命令之前的前2(或3)行。

+0

此代碼是否會產生錯誤或不符合預期的行爲? –

+0

我建議您在問題中添加該詳細信息,以及您自己嘗試修復它的任何嘗試。 –

回答

2

問題是雙重的。首先,Get-Process將參數-Name中的進程名稱取爲進程路徑。這意味着get-process $Prog -ea SilentlyContinue永遠不會返回一個進程,並且始終爲空。

您可以使用Get-ChildItem從完整路徑中獲取進程名稱。然後,如果它需要來自特定路徑,則可以在返回的對象上使用Path屬性和Where-Object進行過濾。

其次,即使你確實返回一個進程Get-Process。您在if聲明中沒有任何可以暫停執行的內容,因此它會繼續。您可以使用while循環和Start-Sleep cmdlet,這將允許您循環直到進程運行。

$Prog = "C:\Program Files (x86)\xyz.exe" 
$ProcessName = (Get-ChildItem $Prog).basename 
while (!(Get-Process $ProcessName | Where-Object {$_.Path -eq $Prog})) { 
    Start-Sleep 1 
} 
Remove-Item "C:\Program Files (x86)\abc\123.xml" 
Remove-Item "C:\Program Files (x86)\abc\456.xml" 
相關問題