为什么这个使用 Get-Service 的 powershell 命令如果遇到错误就无法继续?

为什么这个使用 Get-Service 的 powershell 命令如果遇到错误就无法继续?

我的任务是审核 Windows 服务器,查看安装了哪些服务和程序。我认为 PowerShell 是理想的选择,尽管我对 PowerShell 脚本还不熟悉。

我在一个 txt 文件中有一个服务器列表,并且一直在使用以下命令。

Get-CimInstance -ComputerName (Get-Content .\servers.txt) -ClassName win32_product | Select-Object PSComputerName, Name, PackageName, InstallDate, IdentifyingNumber | Export-CSV -Path .\programs.csv

Get-Service -ComputerName (Get-Content .\servers.txt) -ErrorAction Continue | Select-Object MachineName, Name, DisplayName, Status, StartType | Export-CSV .\services.csv

.\servers.txt 是一个包含服务器 FQDN 的简单文本文件。

如果服务器无法访问或找不到,第一个语句会打印错误消息并继续。据我了解,ErrorAction 默认是继续。但是,第二个语句失败并停止执行。我预计会出现错误,我可以逐个处理它们,但为什么语句没有按预期在出现错误时继续?

如果我从列表中删除有问题的服务器,Get-Services 就可以正常运行。我宁愿在脚本中出现错误并单独处理。

更新以包含 Powershell 输出

Get-Service:无法在计算机“computer_name”上打开服务控制管理器。此操作可能需要其他权限。在 .\get-service.ps1:1 char:1 + Get-Service -ComputerName (Get-Content .\servers.txt) -ErrorAction Co ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:未指定:(:) [Get-Service],InvalidOperationException + FullyQualifiedErrorId:System.InvalidOperationException,Microsoft.PowerShell.Commands.GetServiceCommand

答案1

只是为了向您展示我想象如何使用try-catch-statement。

$serverList = Get-Content .\servers.txt
foreach ($server in $serverLists)
{
  try
  {
    Get-CimInstance -ComputerName $server -ClassName win32_product | Select-Object PSComputerName, Name, PackageName, InstallDate, IdentifyingNumber | Export-CSV -Path .\programs.csv -Append
    Get-Service -ComputerName $server | Select-Object MachineName, Name, DisplayName, Status, StartType | Export-CSV .\services.csv -Append
  }
  catch
  {
    "Error on server $server occurred." | Out-File -FilePath .\errors.log -Append
  }
}

您可以调整 catch 块来区分 CimInstance 和服务,或者您可以转发通用错误消息$_.Exception.Message

相关内容