如果未找到进程名称,则 Powershell 将进程名称放入哈希表时出现问题

标签 powershell

我正在尝试在进程列表上运行,如果找到,则将进程名称放入值为 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/

相关文章:

powershell - Powershell-十六进制至IEEE754单精度浮点

windows - 带有特殊字符的密码参数

Powershell可以说话,但如果我说话,它可以写吗?

powershell - 带空格的启动进程 powershell

javascript - 如何使用 Windows Powershell 和 IE11 注入(inject) JavaScript

powershell - ForEach-Object -Parallel 如何使用

powershell - 在Powershell中无需内置Get-FileHash cmdlet即可获取校验和

powershell - 在 DSC 中使用文件提供程序 - 确保目标仅包含来自源的文件

powershell - 如何将哈希表名称和值导出到 Excel 列中?

powershell - 使用 TOM 处理 SSAS 表格模型时减少并行度