我正在尝试在进程列表上运行,如果找到,则将进程名称放入值为 True 的哈希表中,如果不是 False,则 True 部分工作正常,如果找不到进程,则出现问题t 将搜索到的进程名称与 Flase 配对,只需为空
代码
$processStatus = $null
$processStatus = @{}
$processName = "firefox", "discord", "fgdfg"
[System.Diagnostics.Process[]]$processList = Get-Process $processName -ErrorAction SilentlyContinue |
Sort-Object -Property name -Unique
ForEach ($process in $processList) {
if($process -ne $null) {
$processStatus.Add($process.ProcessName,"True")
} else {
$processStatus.Add($process,"Flase")
}
}
结果
Name Value
---- -----
Discord True
firefox True
预期结果
Name Value
---- -----
Discord True
firefox True
fgdfg False
最佳答案
你很接近。您只需要循环遍历进程名称并运行 Get-Process
针对每个进程名称。然后在哈希表中设置状态之前检查进程是否存在。
$processNames = "firefox", "discord", "fgdfg"
$processStatus = @{}
foreach ($processname in $processNames) {
$processes = Get-Process -Name $processName -ErrorAction SilentlyContinue
if ($null -ne $processes) {
$processStatus[$processName] = $true
}
else {
$processStatus[$processName] = $false
}
}
还要确保输入 $null
进行比较时位于运算符的左侧。如果您使用 VSCode,PSScriptAnalyzer
将给出 PSPossibleIncorrectComparisonWithNull
如果您不这样做,则会发出警告。看看documentation了解有关为什么建议这样做的更多信息。
我们还可以使用.NET方法 System.Diagnostics.Process.GetProcessByName
获取共享相同名称的进程。此方法返回 System.Diagnostics.Process[]
,所以我们可以简单地检查计数是否大于 0。
$processNames = "firefox", "discord", "fgdfg", "notepad"
$processStatus = @{}
foreach ($processname in $processNames) {
$processes = [System.Diagnostics.Process]::GetProcessesByName($processName)
if ($processes.Count -gt 0) {
$processStatus[$processName] = $true
}
else {
$processStatus[$processName] = $false
}
}
关于如果未找到进程名称,则 Powershell 将进程名称放入哈希表时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61799898/