我尝试创建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 :(得分:2)
问题是双重的。首先,Get-Process
采用-Name
参数中的进程名称而不是进程路径。这意味着get-process $Prog -ea SilentlyContinue
永远不会返回进程,并且始终为null。
您可以使用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"