Powershell在两秒钟后超时



我是powershell的新手。我在www.powershell.com上读了一些文章。现在我需要你的帮助来解决一个问题。我想从网络中的客户端读取UUID。因此,我创建了一个文件"pcs.txt",所有电脑都存储在其中。

$pc = Get-Content pcs.txt #Read content of file
$cred = Get-Credential “domainuser” 
for ($i=0; $i -lt $pc.length; $i++)     {
    $Result=test-connection -ComputerName $pc[$i] -Count 1 -Quiet
    If ($Result -eq 'True')
    { 
        $uuid = (Get-WmiObject Win32_ComputerSystemProduct -ComputerName $pc[$i] -Credential $cred).UUID 
        $Ausgabe=$pc[$i] + ';'+$uuid
        $Ausgabe  

    } 
    else
    {
        $Ausgabe=$pc[$i] + '; UUID nicht erhalten'
        $Ausgabe 
    }
}

首先我测试ping是否有效。当ping工作时,我会尝试获取uuid。有时,即使ping有效,我也得不到uuid。所以我想编码一个超时,说->当你在2秒钟后没有uuid时,转到下一台电脑。

你能帮我吗?

唉,Get-WmiObject commandlet没有超时参数。MS Connect中有一个功能请求,但它是从2011年开始的,仍然开放。

使用System.Management可以获得我尚未测试过的解决方法。我会把它复制粘贴在这里,以防链接失效。(我讨厌只包含可能存在或不存在的资源链接的SO答案…)

Function Get-WmiCustom([string]$computername,[string]$namespace,[string]$class,[int]$timeout=15){
$ConnectionOptions = new-object System.Management.ConnectionOptions
$EnumerationOptions = new-object System.Management.EnumerationOptions 
$timeoutseconds = new-timespan -seconds $timeout
$EnumerationOptions.set_timeout($timeoutseconds) 
$assembledpath = "\" + $computername + "" + $namespace
#write-host $assembledpath -foregroundcolor yellow 
$Scope = new-object System.Management.ManagementScope $assembledpath, $ConnectionOptions
$Scope.Connect() 
$querystring = "SELECT * FROM " + $class
#write-host $querystring 
$query = new-object System.Management.ObjectQuery $querystring
$searcher = new-object System.Management.ManagementObjectSearcher
$searcher.set_options($EnumerationOptions)
$searcher.Query = $querystring
$searcher.Scope = $Scope 
trap { $_ } $result = $searcher.get() 
return $result
}

我找到了一个很好的解决方法!

http://theolddogscriptingblog.wordpress.com/2012/05/11/wmi-hangs-and-how-to-avoid-them/

这里是我的工作代码:

$pc = Get-Content pcs.txt #FILE FROM THE HARDDISK
$cred = Get-Credential “DOMAINUSER” #
for ($i=0; $i -lt $pc.length; $i++) 
{
$Result=test-connection -ComputerName $pc[$i] -Count 1 -Quiet 
If ($Result -eq 'True')
{ 
    $WMIJob = Get-WmiObject Win32_ComputerSystemProduct -ComputerName $pc[$i] -Credential $cred -AsJob     
    $Timeout=Wait-Job -ID $WMIJob.ID -Timeout 1 # the Job times out after 1 seconds.   
    $uuid = Receive-Job $WMIJob.ID
    if ($uuid -ne $null)
    {
        $Wert =$uuid.UUID 
        $Ausgabe=$pc[$i] + ';'+$Wert
        $Ausgabe  
    }
    else
    {
    <#$b = $error | select Exception       
    $E = $b -split (:)     
    $x = $E[1]   
    $Error.Clear()      #>
    $Ausgabe=$pc[$i] + '; got no uuid'
    $Ausgabe 
    }

} 
else
{
    $Ausgabe='PC not reached through ping.'
    $Ausgabe 
}

}

我希望我能帮助别人完成

相关内容

  • 没有找到相关文章

最新更新