向批处理/ powershell添加超时

时间:2014-01-17 01:52:41

标签: powershell command-line

$fullnamexp = ((net user $winxp /domain | Select-String "Full Name") -replace "Full Name","").Trim();

如果找不到$winxp,命令将会挂起,是否有超时我可以用它来使其在5-10秒后继续运行?不知道我会把它放在哪里。

编辑 - 我用它来提取用户名:

$reg  = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $tag1)
$key  = $reg.OpenSubKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon')
$winxp = $key.GetValue('DefaultUserName') -replace '^.*?\\'

$winxp是一个登录名,例如ajstepanik,然后我将其放入:$fullnamexp = ((net user $winxp /domain | Select-String "Full Name") -replace "Full Name","").Trim();

1.21.2014更新

 $timeoutSeconds = 5
$code = {
    ((net user $winxp /domain | Select-String "Full Name") -replace "Full Name","").Trim(); # your commands here, e.g.
}
$j = Start-Job -ScriptBlock $code
if (Wait-Job $j -Timeout $timeoutSeconds) { $fullnamexp = Receive-Job $j }
Remove-Job -force $j

5 个答案:

答案 0 :(得分:15)

虽然@mjolinor可能确实为您提供了另一种方法,但这里可以直接回答您的一般问题:如何在PowerShell中强制超时?

在脚本块中包装您希望限时的内容,将其作为作业运行,然后使用Wait-Job cmdlet对操作进行时间限制。 Wait-Job将在脚本块完成时以超时期限结束时返回,以先发生 为准。在Wait-Job返回后,您可以检查作业状态($j.state)以确定它是否被中断,如果它对您很重要。

$timeoutSeconds = 5 # set your timeout value here
$j = Start-Job -ScriptBlock {
    # your commands here, e.g.
    Get-Process
    }
"job id = " + $j.id # report the job id as a diagnostic only
Wait-Job $j -Timeout $timeoutSeconds | out-null
if ($j.State -eq "Completed") { "done!" }
elseif ($j.State -eq "Running") { "interrupted" }
else { "???" }
Remove-Job -force $j #cleanup

2014.01.18更新

这里有一个更简化的方法,其中还包括使用Receive-Job从脚本块中获取信息的实际步骤,假设您想要在stdout上生成:

$timeoutSeconds = 3
$code = {
    # your commands here, e.g.
    Get-ChildItem *.cs | select name
}
$j = Start-Job -ScriptBlock $code
if (Wait-Job $j -Timeout $timeoutSeconds) { Receive-Job $j }
Remove-Job -force $j

答案 1 :(得分:4)

您可以使用Start-Sleep暂停脚本:

Start-Sleep -s 5

答案 2 :(得分:1)

net没有明确允许你为它的操作设置超时,但你可以在更改套接字的ipv4超时时检查这个链接:

http://www.cyberciti.biz/tips/linux-increasing-or-decreasing-tcp-sockets-timeouts.html

我唯一可以想象的是产生一个工作线程,但我甚至不知道这是否可能在bash中,我不够流畅地回答它;加上它会打开你的同步问题和各种多线程问题,而不是你想要在bash脚本中快速完成的事情! :P

答案 3 :(得分:1)

这有帮助吗?

$query = (dsquery user -samid $winxp) 
if ($query) {$fullnamexp = ($query | dsget user -display)[1].trim()}
$fullnamexp

答案 4 :(得分:0)

此解决方案对我不起作用。在此示例中,remove-job -force $j需要5秒钟。

$timeoutseconds = 1

$start = get-date
$j = start-job -scriptblock { Resolve-DnsName  1.1.1.1 }
if (wait-job $j -timeout $timeoutseconds) { $fullnamexp = receive-job $j } 
remove-job -force $j 
(get-date) - $start


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 5
Milliseconds      : 342
Ticks             : 53426422
TotalDays         : 6.18361365740741E-05
TotalHours        : 0.00148406727777778
TotalMinutes      : 0.0890440366666667
TotalSeconds      : 5.3426422
TotalMilliseconds : 5342.6422