2017-12-27 887 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" 
相关问题