You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符串数组作为参数传入Get-Process/Where-Object

解决PowerShell中用字符串数组匹配进程名的问题

你的问题核心是直接用字符串数组作为-match的匹配源时,PowerShell的运算符行为不符合正则“或”的预期,加上你执行的-replace操作没有保存结果,导致筛选逻辑失效。

问题根源

  1. 你执行$Procs -replace '","','|'只是在控制台输出拼接后的字符串,但没有把结果赋值给变量,$Procs仍然是原始的字符串数组。
  2. 当-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:27:38