PowerShell脚本无法扫描进程且未进入二级循环问题求助
PowerShell脚本排查:读取PC列表检查远程进程失败问题
问题现象
脚本从CSV读取PC列表后,仅输出"Looking for process..."提示,未进入进程检查的第二个foreach循环,无后续日志或结果输出。
核心问题与修复点
- 未远程获取目标PC进程:原脚本中
get-process默认读取本地进程,而非CSV指定的远程PC进程。若本地无nscp.exe,$Processes会为空,自然无法进入循环。需改用远程进程查询方式。 - 变量名拼写错误:
Import-Csv $ipmCsvLocation中的变量名应为$CsvLocation(与前面定义的变量一致),虽当前输出显示循环了PC列表,但该错误可能导致后续运行异常。 - 进程名称判断逻辑错误:
Get-Process返回的ProcessName不含.exe后缀,nscp.exe的实际ProcessName是nscp,原脚本中$Proc.ProcessName -eq $IcingaProc(值为nscp.exe)永远不成立。 - 日志换行写法错误:
LogWritern会将转义字符作为字符串写入日志,应利用Add-Content的默认换行特性,或直接在日志内容中添加分隔符。
修正后的脚本
Function LogWrite { Param ([string]$logstring) # 自动添加换行,无需手动处理转义字符 Add-content $Logfile -value "$(Get-Date -Format yyyyMMdd-HHmmss) - $logstring" } $LogFile = "Path\to\log.txt" # 本地日志文件路径 $CsvLocation = "\\path\to\CSV\File\Table.csv" # CSV文件路径 $csvdata = Import-Csv $CsvLocation # 修正变量名拼写错误 foreach($pc in $csvdata) { $targetProcExe = "nscp.exe" $pcname = $pc.Name Write-Host "Looking for process $targetProcExe in $pcname..." try { # 远程查询目标PC进程,Get-CimInstance兼容性更强(依赖WMI服务) $Processes = Get-CimInstance -ClassName Win32_Process -ComputerName $pcname -ErrorAction Stop | Where-Object {$_.Name -eq $targetProcExe} if ($Processes) { Write-Host "$targetProcExe is running on $pcname" LogWrite "$targetProcExe is running on $pcname" } else { Write-Host "$targetProcExe not found on $pcname" LogWrite "$targetProcExe not found on $pcname" } # 添加日志分隔线,便于区分不同PC的记录 LogWrite "-------------------------" } catch { Write-Host "Failed to connect to $pcname : $_" LogWrite "Failed to connect to $pcname : $_" LogWrite "-------------------------" } }
额外说明
- 运行脚本需具备目标PC的管理员权限,且目标PC需开启WMI服务(默认开启)。
- 若偏好使用
Get-Process,需确保目标PC配置了WinRM服务,语法为Get-Process -Name nscp -ComputerName $pcname -ErrorAction Stop。 - CSV文件需包含
Name列,每行对应一个目标PC的名称或IP地址。
内容的提问来源于stack exchange,提问作者Aviad
相关产品推荐
相关产品推荐

