使用本地账户执行Get-Service,如何合并输出为带计算机名的统一列表
实现统一格式的跨计算机服务列表输出
问题分析
原脚本存在两个核心问题:
- 使用
Enter-PSSession交互式远程会话,导致输出按计算机分段,无法直接合并; Get-Service的-ComputerName参数错误传入整个计算机数组,会在每台机器上重复查询所有目标计算机。
修正后的脚本(匹配期望输出格式)
$computers = @" computer1 computer2 "@ -split [Environment]::NewLine # 预创建凭据,避免循环内重复生成 $ServerUserId = "_$\user1" $ServerPassword = ConvertTo-SecureString -String 'complexpassword' -AsPlainText -Force $Credential = New-Object -TypeName PSCredential -ArgumentList $ServerUserId, $ServerPassword $computers | ForEach-Object { $currentPC = $_ # 远程执行服务查询,返回结果后拼接格式 Invoke-Command -ComputerName $currentPC -Credential $Credential -ScriptBlock { Get-Service -Name Service* } | ForEach-Object { "$($_.Name) $currentPC" } }
脚本修改说明
- 替换交互式会话为
Invoke-Command:批量远程执行更高效,直接返回服务对象而非分段文本; - 凭据移至循环外:减少重复操作,提升执行效率;
- 精准查询单台计算机:每轮循环仅查询当前目标计算机的服务;
- 自定义输出格式:通过
ForEach-Object拼接服务名与计算机名,完全匹配期望的纯文本列表。
输出示例
ServiceA computer1 ServiceB computer1 ServiceY computer2 ServiceZ computer2
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

