强制 powershell 脚本停止并检索信息
force powershell script to stop and retrieve info
我有一个脚本可以列出远程服务器列表中位于 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
我需要能够显示 "the script crashed on this server" 之类的消息并完成其执行。完成它的执行并知道它崩溃的原因对我来说非常重要。我不知道如何在 PowerShell 中执行此操作,所以我正在寻求建议。
感谢大家。
您应该使用 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"
}
您可以获得更高级的错误处理,实际上 return 如果需要还可以返回收到的错误,请查看此处了解更多信息:
很确定 Test-Connection
使用 wmi 来获取 Win32_PingStatus。由于您看到很多 wmi 错误,请扩展 Try...Catch
以将其也包括在内。
如果所有其他方法都失败了,请在一开始就设置 $ErrorActionPreference = 'SilentlyContinue'
,您至少可以了解正在发生的事情以帮助隔离问题。
我有一个脚本可以列出远程服务器列表中位于 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
我需要能够显示 "the script crashed on this server" 之类的消息并完成其执行。完成它的执行并知道它崩溃的原因对我来说非常重要。我不知道如何在 PowerShell 中执行此操作,所以我正在寻求建议。
感谢大家。
您应该使用 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"
}
您可以获得更高级的错误处理,实际上 return 如果需要还可以返回收到的错误,请查看此处了解更多信息:
很确定 Test-Connection
使用 wmi 来获取 Win32_PingStatus。由于您看到很多 wmi 错误,请扩展 Try...Catch
以将其也包括在内。
如果所有其他方法都失败了,请在一开始就设置 $ErrorActionPreference = 'SilentlyContinue'
,您至少可以了解正在发生的事情以帮助隔离问题。