我有一个脚本列出位于远程服务器列表中C:\下的文件:
$Servers=Get-ADComputer -SearchBase $TerminalServersOU -Filter '*' | Sort-Object Name | Select -Exp Name
foreach ($Server in $Servers) {
$Server
#Check first if the terminal server is on
if (Test-Connection $Server -quiet) {
Invoke-Command -ComputerName $Server {
$output=dir C:\
}
}
else {
"`n$Server is disconnected"
}
除了名为" UKBTH05CTX03"的服务器外,该脚本在所有服务器上运行良好。当脚本在此服务器上运行时,它会崩溃并且永远不会完成:
UKBTH05CTX01
UKBTH05CTX01 is disconnected
UKBTH05CTX02
Directory: C:\
Mode LastWriteTime Length Name PSComputerName
---- ------------- ------ ---- --------------
d---- 11/09/2014 23:00 inetpub ukbth05ctx02
d---- 11/09/2014 23:00 log ukbth05ctx02
d---- 14/07/2009 04:20 PerfLogs ukbth05ctx02
d-r-- 16/07/2015 15:15 Program Files ukbth05ctx02
d-r-- 15/09/2015 13:01 Program Files (x86) ukbth05ctx02
UKBTH05CTX03
Provider load failure
+ CategoryInfo : InvalidOperation: (:) [Get-WmiObject], ManagementException
+ FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
Provider load failure
+ CategoryInfo : InvalidOperation: (:) [Get-WmiObject], ManagementException
+ FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
d---- 05/10/2014 15:18 inetpub ukbth05ctx03
Provider load failure
+ CategoryInfo : InvalidOperation: (:) [Get-WmiObject], ManagementException
+ FullyQualifiedErrorId : Get WMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
我需要能够显示一条消息,例如"脚本在此服务器上崩溃了#34;并完成执行。对我来说,完成它的执行并知道它崩溃的原因非常重要。我不知道如何在PowerShell中这样做,所以我正在寻找建议。
感谢所有人。
答案 0 :(得分:1)
您应该使用try / catch块来捕获错误,如下所示:
$Servers=Get-ADComputer -SearchBase $TerminalServersOU -Filter '*' | Sort-Object Name | Select -Exp Name
foreach ($Server in $Servers) {
$Server
#Check first if the terminal server is on
if (Test-Connection $Server -quiet) {
try
{
Invoke-Command -ComputerName $Server {
$output=dir C:\
}
}
catch
{
Write-Host "the script crashed on server: $server"
}
}
else {
"`n$Server is disconnected"
}
您可以获得更高级的错误处理,并在需要时实际返回收到的错误,请查看此处了解更多信息:
答案 1 :(得分:0)
非常确定Test-Connection
使用wmi来获取Win32_PingStatus。由于您发现了很多wmi错误,因此请展开Try...Catch
以包含该错误。
如果所有其他方法都失败了,请在开始时设置$ErrorActionPreference = 'SilentlyContinue'
,并且您至少可以了解正在发生的事情以帮助隔离问题。