在batch/powershell中添加超时

svujldwt  于 2023-06-29  发布在  Shell
关注(0)|答案(6)|浏览(99)
$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
qncylg1j

qncylg1j1#

虽然@mjolinor可能确实为您提供了另一种方法,但以下是对您的一般问题的直接回答:* 如何在PowerShell中强制超时?*
将您希望进行时间限制的任何内容 Package 在脚本块中,将其作为作业运行,然后使用Wait-Jobcmdlet对操作进行时间限制。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
62lalag4

62lalag42#

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

Start-Sleep -s 5
to94eoyn

to94eoyn3#

net并不明确允许你在它的操作上设置超时,但是你可以查看这个链接来改变你的套接字的ipv4超时:
http://www.cyberciti.biz/tips/linux-increasing-or-decreasing-tcp-sockets-timeouts.html
我唯一能想到的是生成一个工作线程,但我甚至不知道这在bash中是否可能,我没有足够的流动性来回答这个问题;另外,它会让你面临同步问题和各种各样的多线程问题,这些问题超出了你在bash脚本中开始时试图快速完成的任务!:P

ff29svar

ff29svar4#

这样有用吗

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

pxy2qtax5#

这个解决方案对我不起作用。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

下面是一个简单的记事本超时示例:

notepad
if (-not $(wait-process notepad 10; $?)) { stop-process -name notepad }
oyxsuwqo

oyxsuwqo6#

$watchdog = 10 #seconds
    $start_time = Get-Date
    $j = Start-Job -ScriptBlock{
        #timeout command
        if ($true) {
            $i = 0
            while($true) {
                Write-Host "Count: $i"
                Start-Sleep -Milliseconds 100
                $i++
            }      
        }
        write-host "Hello"
    }
    while($true) {
        if ($j.HasMoreData) {
            Receive-Job $j
            Start-Sleep -Milliseconds 200
        }
        $current = Get-Date
        $time_span = $current - $start_time
        if ($time_span.TotalSeconds -gt $watchdog) {
            write-host "TIMEOUT!"
            Stop-Job $j
            break
        }
        if (-not $j.HasMoreData -and $j.State -ne 'Running') {
            write-host "Finished"
            break
        }
    }
    Remove-Job $j

相关问题