确定进程是否正在运行的正确方法是什么,例如FireFox,并停止它?
我做了一些环顾四周,我找到的最好的方法是:
if((get-process "firefox" -ea SilentlyContinue) -eq $Null){
echo "Not Running"
}
else{
echo "Running"
Stop-Process -processname "firefox"
}
这是理想的做法吗?如果没有,这样做的正确方法是什么?
答案 0 :(得分:68)
你这样做的方式是你要两次查询这个过程。林恩也首先提出了一个很好的观点。我可能会尝试以下内容:
# get Firefox process
$firefox = Get-Process firefox -ErrorAction SilentlyContinue
if ($firefox) {
# try gracefully first
$firefox.CloseMainWindow()
# kill after five seconds
Sleep 5
if (!$firefox.HasExited) {
$firefox | Stop-Process -Force
}
}
Remove-Variable firefox
答案 1 :(得分:8)
如果您不需要显示确切的结果"运行" /"没有跑步",你可以简单地说:
ps notepad -ErrorAction SilentlyContinue | kill -PassThru
如果流程未运行,您将无法获得任何结果。如果它正在运行,您将收到get-process
输出,并且该过程将停止。
答案 2 :(得分:1)
@ jmp242-通用text
类型不包含System.Object
方法,但是在收集CloseMainWindow
变量时静态转换System.Diagnostics.Process
类型对我有用。下面是采用这种强制转换的新代码(来自this answer)(并且更改为使用ProcessList
进行循环)。
ForEach-Object
答案 3 :(得分:0)
谢谢@Joey。这就是我要找的东西。
我只是带来了一些改进:
function Stop-Processes {
param(
[parameter(Mandatory=$true)] $processName,
$timeout = 5
)
$processList = Get-Process $processName -ErrorAction SilentlyContinue
if ($processList) {
# Try gracefully first
$processList.CloseMainWindow() | Out-Null
# Wait until all processes have terminated or until timeout
for ($i = 0 ; $i -le $timeout; $i ++){
$AllHaveExited = $True
$processList | % {
$process = $_
If (!$process.HasExited){
$AllHaveExited = $False
}
}
If ($AllHaveExited){
Return
}
sleep 1
}
# Else: kill
$processList | Stop-Process -Force
}
}
答案 4 :(得分:0)
从进程终止开始,这里python
,我的 2 美分:
Get-Process python3.9|Stop-Process