如何在Powershell中超时REGQUERY命令?

如何在Powershell中超时REGQUERY命令?,powershell,registry,wait,Powershell,Registry,Wait,我正试图找到一种方法(可能有作业?)来超时系统作业。如果计算机不在线,并且代码无法到达注册表,我的regquery通常会在42秒后超时。我希望将查询时间限制在5秒左右,因为我们的环境中有一吨重的计算机。我曾尝试过创造就业机会、秒表等,但运气不佳:(请帮忙 $File = Import-Csv 'c:\temp\regcomplist.txt' $Results="" $text="Machine Name,Regkey Value, Runtime" $fileout = "C:\Temp\re

我正试图找到一种方法(可能有作业?)来超时系统作业。如果计算机不在线,并且代码无法到达注册表,我的regquery通常会在42秒后超时。我希望将查询时间限制在5秒左右,因为我们的环境中有一吨重的计算机。我曾尝试过创造就业机会、秒表等,但运气不佳:(请帮忙

$File = Import-Csv 'c:\temp\regcomplist.txt'
$Results=""
$text="Machine Name,Regkey Value, Runtime"
$fileout = "C:\Temp\regquery.csv"
Write-host $text
Out-File -FilePath $fileout -InputObject $text -Force
$timeout = new-timespan -Seconds 5
$swtotal = [Diagnostics.Stopwatch]::StartNew()
foreach ($line in $file)
{
TRY{
$regkey = ""
$keyValue = ""
$machinename = $line.machinename
#trap [Exception] {continue}    
$key = "SYSTEM\\CurrentControlSet\\Control\\Print\\Environments\\Windows x64\\Drivers\\Version-3\\Lexmark Universal v2 XL"
$sw = [Diagnostics.Stopwatch]::StartNew()   
#while ($sw.elapsed -lt $timeout){
    $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine",$MachineName)
    $regkey = $reg.opensubkey($key)
    $keyValue = $regKey.GetValue('Help File')

#   return
#}
#start-sleep -seconds 5
#if ($ok -ne "OK"){$keyValue = "TIMED OUT: "+$sw.elapsed}
}
Catch{
$keyValue = "Error Opening Registry"
}
$text = $machinename+","+$keyValue+","+$sw.elapsed
$Results += $text
#Output Below Here:
Write-host $text
Out-File -InputObject $text -FilePath $fileout -Append 

}
Write-host "Total time run:"$swtotal.elapsed

谢谢!这正是我所需要的。我将计数设置为1 ping,比42秒超时快得多。这是给任何可能有帮助的人的代码

$File = Import-Csv 'c:\temp\powershell\regcomplist.txt'
$Results=""
$text="Machine Name,Regkey Value, Runtime"
$fileout = "C:\Temp\powershell\regquery.csv"
Write-host $text
Out-File -FilePath $fileout -InputObject $text -Force
$timeout = new-timespan -Seconds 5
$swtotal = [Diagnostics.Stopwatch]::StartNew()
foreach ($line in $file){
$regkey = ""
$keyValue = ""
$machinename = $line.machinename
#trap [Exception] {continue} 
$key = "SYSTEM\\CurrentControlSet\\Control\\Print\\Environments\\Windows x64\\Drivers\\Version-3\\Lexmark Universal v2 XL"
$sw = [Diagnostics.Stopwatch]::StartNew()

$pingtest=Test-Connection -ComputerName $machinename -Quiet -Count 1
if ($pingtest -eq $true ){
    TRY{    
    #while ($sw.elapsed -lt $timeout){
    $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine",$MachineName)
    $regkey = $reg.opensubkey($key)
    $keyValue = $regKey.GetValue('Help File')

    #   return
    #}
    #start-sleep -seconds 5
    #if ($ok -ne "OK"){$keyValue = "TIMED OUT: "+$sw.elapsed}
    }
    Catch{
    $keyValue = "Error Opening Registry"
    }
    $text = $machinename+","+$keyValue+","+$sw.elapsed
    $Results += $text
    #Output Below Here:
    Write-host $text
    Out-File -InputObject $text -FilePath $fileout -Append 

}
else {write-host $machinename",doesn't ping!"}
}
Write-host "Total time run:"$swtotal.elapsed

我在查询注册表之前使用Tcp测试:

if((Test-ComputerPort $ComputerName 445)) {
    [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $ComputerName).OpenSubKey("SYSTEM\CurrentControlSet\Control\Session Manager\Environment").GetValue('TEMP')
}
使用Test-ComputerPort():


首先,如果机器不可用,我将使用测试连接甚至不尝试。OpenRemoteBaseKey使用Tcp Ip 445(smb),您可以在之前对其进行测试
function Test-ComputerPort($ComputerName,$port){
    try {
        $ip = [System.Net.Dns]::GetHostAddresses($ComputerName).IPAddressToString # confirm DNS resolving
        if([system.Net.Sockets.TcpClient]::new().BeginConnect($ComputerName, $port, $null, $null).AsyncWaitHandle.WaitOne(40, $false) -or [system.Net.Sockets.TcpClient]::new().BeginConnect($ComputerName, $port, $null, $null).AsyncWaitHandle.WaitOne(80, $false)){ # with retry if down
            return $ComputerName
        }
        return $false # tcp-port is down !
    } catch {
        return $null # conputername not resolved !
    }
}