向批处理/powershell添加超时

向批处理/powershell添加超时,powershell,command-line,Powershell,Command Line,如果找不到$winxp,该命令将挂起,我是否可以使用超时使其在5-10秒后继续运行?不知道我会把它放在哪里 编辑-我使用它来提取用户名: $fullnamexp = ((net user $winxp /domain | Select-String "Full Name") -replace "Full Name","").Trim(); $winxp是一个登录名,比如ajstepanik,然后我把它放在:$fullnamexp=((网络用户$winxp/domain |选择字符串“全名”)-

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

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

$fullnamexp = ((net user $winxp /domain | Select-String "Full Name") -replace "Full Name","").Trim();
$winxp
是一个登录名,比如
ajstepanik
,然后我把它放在:
$fullnamexp=((网络用户$winxp/domain |选择字符串“全名”)-替换为“全名”,”).Trim()

1.21.2014更新

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

net不明确允许您设置其操作的超时,但您可以在更改套接字的ipv4超时时查看此链接:

我唯一能想象的是产生一个工作线程,但我甚至不知道在bash中是否可能,我没有足够的流动性来回答这个问题;此外,它还为您带来了同步问题和各种多线程问题,这些问题超出了您在bash脚本中快速完成的范围!:这有帮助吗

 $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

虽然@mjolinor可能确实为您提供了一种替代方法,但下面是对您的一般问题的直接回答:如何在PowerShell中强制超时

在脚本块中封装任何您希望的时间限制,将其作为作业运行,然后使用
Wait job
cmdlet对操作进行时间限制<代码>等待作业
将在超时时间结束时或脚本块完成时返回,以先发生的为准。
Wait Job
返回后,您可以检查作业状态(
$j.state
),以确定它是否被中断,如果这对您很重要的话

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

$reg  = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $tag1)
$key  = $reg.OpenSubKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon')
$winxp = $key.GetValue('DefaultUserName') -replace '^.*?\\'
这里有一种更为精简的方法,它还包括使用
接收作业
从脚本块中获取信息的实际步骤,假设您想要的是在stdout上生成的:

$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

您可以使用“开始睡眠”暂停脚本:

$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

这个解决方案对我不起作用<代码>删除作业-在本例中,强制$j需要5秒钟以上

Start-Sleep -s 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

这是您在做的单个实例,还是在循环中对不同的用户进行多次迭代?我在一个powershell脚本中使用了上述命令两次,一次用于windows xp,一次用于windows 7,并且该脚本只能在两个脚本中的一个中工作,因此其中一个将挂起,我希望它超时更快。较大的脚本提取登录名,我在这里发布的这一行将用户名转换为此人的全名,但由于我让较大的脚本检查winxp和win7的注册表,它只会找到其中一个,这就是我希望超时的原因,如果可能的话..我要用这个替换我拥有的吗?是的。我相信它会产生相同的结果(返回用户全名),但如果找不到用户,则不会挂起。例如,输入的$winxp变量是“ajstepanik”,我的OP中的行将在找到它时将其转换为我的名字(Stepanik、亚伦J.等)。但你的似乎不是这样的:(我会继续尝试。是的,我无法让它工作。除了一个空格外,不会输出任何东西。输入的只是用户名,应该可以工作。我不知道出了什么问题。我可以将$winxp设置为samaccountname,并且它在我的系统上工作正常。所以在第3行,我只需输入命令我有我的原始帖子?(这篇文章的第一件事)@Aaron:是的,有一点需要注意。我已经更新了我的答案,让它对你更有用。在更新中,除了输出到
$fullnamexp
的实际分配之外,用你的命令填写
$code
块。在你看到
接收作业的地方,在那里做你的分配,即
$fullnamexp=Receive Job$j
。您好,我在原始帖子中添加了一个更新,您能告诉我这是否是正确的方式吗?我有这样的功能,但它不会输出任何内容,但它会等待我指定的秒数。关闭;您需要两个更正:(1)作业应该在
接收作业
上,而不是
删除作业
(2)文本
Get ChildItem*.cs | select name
仅仅是我的示例--从代码中删除它。嘿,我用固定代码更新了我的帖子。你能验证它是否正确吗?我已经用该代码测试过,没有看到任何输出,但我只想验证它的准确性。