强制PowerShell脚本来停止和检索信息

时间:2015-10-16 10:12:05

标签: powershell error-handling command remote-server

我有一个脚本列出位于远程服务器列表中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中这样做,所以我正在寻找建议。

感谢所有人。

2 个答案:

答案 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"
    }

您可以获得更高级的错误处理,并在需要时实际返回收到的错误,请查看此处了解更多信息:

Try Catch Finally and error handling in PowerShell

答案 1 :(得分:0)

非常确定Test-Connection使用wmi来获取Win32_PingStatus。由于您发现了很多wmi错误,因此请展开Try...Catch以包含该错误。

如果所有其他方法都失败了,请在开始时设置$ErrorActionPreference = 'SilentlyContinue',并且您至少可以了解正在发生的事情以帮助隔离问题。