如何在PowerShell中删除文件之前检查程序是否正在运行?

问题描述 投票:0回答:1

我正在尝试创建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命令之前忽略了前两行(或3行)。

powershell
1个回答
2
投票

问题是双重的。首先,Get-Process获取-Name参数中的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"
© www.soinside.com 2019 - 2024. All rights reserved.