我希望腳本找到當前正在運行的兩個相同的行程,并$procName使用該If($_.Path -eq $procName){命令通過管道傳輸與變數中定義的路徑匹配的行程的 PID 。
根據之前找到的完整檔案路徑確定正確的行程后,我想使用它的唯一 PID 來檢查它當前是否為suspended or not suspended.
如果當前管道中一切順利,則使用它的輸出值運行以下兩個命令之一:
If($_.Path -eq $procName) {
Start-Process cmd.exe -WindowStyle Maximized -ArgumentList "/D /K pssuspend.exe -nobanner $myPID"
} Else {
Start-Process cmd.exe -WindowStyle Maximized -ArgumentList "/D /K pssuspend.exe -nobanner -r $myPID"
}
我的問題是無論行程當前是否暫停,輸出都是相同的結果
Start-Process cmd.exe -WindowStyle Maximized -ArgumentList /D /K pssuspend.exe -nobanner -r 18960
這是我到目前為止:
$procName = 'C:\Program Files (x86)\Steam\steamapps\common\rocketleague\Binaries\Win64\RocketLeague.exe'
$procID = Get-Process -Name 'RocketLeague' | Select-Object -Property Id,Path | ForEach-Object {
If($_.Path -eq $procName){
$myPID = $_.Id
If(Get-ChildItem | Where-Object -FilterScript {$_.Responding -eq $false}) {
Write-Host Start-Process cmd.exe -WindowStyle Maximized -ArgumentList "/D /K pssuspend.exe -nobanner $myPID"
} Else {
Write-Host Start-Process cmd.exe -WindowStyle Maximized -ArgumentList "/D /K pssuspend.exe -nobanner -r $myPID"
}
}
}
uj5u.com熱心網友回復:
根據代碼并尊重 Santiago 已經指出的內容,您似乎正在嘗試根據特定行程是否回應來采取某些操作。如果我有這個權利,我認為不需要Get-ChildItem. 您可以附加Select-Object命令以包含Responding屬性,然后執行如下邏輯:
$procName = 'C:\Program Files (x86)\Steam\steamapps\common\rocketleague\Binaries\Win64\RocketLeague.exe'
$procID =
Get-Process -Name 'RocketLeague' |
Select-Object -Property Id, Path, Responding |
ForEach-Object {
If($_.Path -eq $procName){
$myPID = $_.Id
If( !$_.Responding ) {
Write-Host Start-Process cmd.exe -WindowStyle Maximized -ArgumentList "/D /K pssuspend.exe -nobanner $myPID"
}
Else {
Write-Host Start-Process cmd.exe -WindowStyle Maximized -ArgumentList "/D /K pssuspend.exe -nobanner -r $myPID"
}
}
}
但是,除非腳本有更多內容,否則我認為您根本不需要該Select-Object命令:
$procName = 'C:\Program Files (x86)\Steam\steamapps\common\rocketleague\Binaries\Win64\RocketLeague.exe'
$procID =
Get-Process -Name 'RocketLeague' |
ForEach-Object {
If($_.Path -eq $procName){
$myPID = $_.Id
If( !$_.Responding ) {
Write-Host Start-Process cmd.exe -WindowStyle Maximized -ArgumentList "/D /K pssuspend.exe -nobanner $myPID"
}
Else {
Write-Host Start-Process cmd.exe -WindowStyle Maximized -ArgumentList "/D /K pssuspend.exe -nobanner -r $myPID"
}
}
}
此外,$procID變數中不會有任何內容,因為后續代碼不會向管道寫入任何內容。我把它留在里面只是因為我不知道它的全部意圖。
您還可以通過將某些 If Logic 移到Where-Object子句中來稍微縮短代碼,請參閱下面的$ProcID已洗掉。
$procName = 'C:\Program Files (x86)\Steam\steamapps\common\rocketleague\Binaries\Win64\RocketLeague.exe'
Get-Process -Name 'RocketLeague' |
Where-Object{ $_.Path -eq $procName }|
ForEach-Object {
If( !$_.Responding ) {
Write-Host Start-Process cmd.exe -WindowStyle Maximized -ArgumentList "/D /K pssuspend.exe -nobanner $($_.Id)"
}
Else {
Write-Host Start-Process cmd.exe -WindowStyle Maximized -ArgumentList "/D /K pssuspend.exe -nobanner -r $($_.Id)"
}
}
注意:我還使用帶有子運算式的字串擴展,而不是分配$myPID變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/379735.html
