如何将字符串数组作为参数传入Get-Process/Where-Object
解决PowerShell中用字符串数组匹配进程名的问题
你的问题核心是直接用字符串数组作为-match的匹配源时,PowerShell的运算符行为不符合正则“或”的预期,加上你执行的-replace操作没有保存结果,导致筛选逻辑失效。
问题根源
- 你执行
$Procs -replace '","','|'只是在控制台输出拼接后的字符串,但没有把结果赋值给变量,$Procs仍然是原始的字符串数组。 - 当
-match运算符右边是数组时,它会对数组中的每个元素单独匹配,返回一个布尔值数组,而Where-Object需要单个布尔值来判断是否保留当前对象,这就导致没有进程被正确筛选。
修正方案
需要先把字符串数组拼接成一个符合正则“或”逻辑的字符串,再传入-match:
[string[]]$Procs = "notepad","mspaint" # 将数组元素用|拼接成正则匹配模式 $procMatchPattern = $Procs -join '|' # 使用拼接后的模式进行匹配 $Processes = Get-Process | Where-Object {$_.Name -match $procMatchPattern} | Select-Object Name, ID $Processes2 = Get-Process | Where-Object {$_.Name -match "notepad|mspaint"} | Select-Object Name, ID Write-Host "-------- Processes --------" $Processes Write-Host "-------- Processes2 --------" $Processes2
进阶处理(针对含正则特殊字符的进程名)
如果你的进程名包含正则特殊字符(比如notepad++里的+,.等),需要先转义每个元素再拼接,避免正则语法干扰匹配:
[string[]]$Procs = "notepad","mspaint","notepad++" # 转义每个元素的正则特殊字符后再拼接 $procMatchPattern = $Procs | ForEach-Object { [Regex]::Escape($_) } -join '|' $Processes = Get-Process | Where-Object {$_.Name -match $procMatchPattern} | Select-Object Name, ID
这样修改后,$Processes就能得到和$Processes2完全一致的输出结果。
内容的提问来源于stack exchange,提问作者Matt Williamson
相关产品推荐
相关产品推荐

