2014-01-17 3 views
5
$fullnamexp = ((net user $winxp /domain | Select-String "Full Name") -replace "Full Name","").Trim(); 

Если $winxp не может быть найден, то команда будет висеть, есть тайм-аут, я могу использовать с этим, чтобы заставить его двигаться дальше через 5-10 секунд? Не знаю, где бы я это сказал.добавив таймаут к партии/PowerShell

Edit- Я использую это, чтобы вытащить имя пользователя:

$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 
+0

Это что-то, что вы делаете в одном экземпляре, или вы делаете несколько итераций разных пользователей в цикле? – mjolinor

+0

Я использую вышеприведенную команду в одном скрипте powershell дважды, один для windows xp, один для Windows 7, и скрипт сможет работать только для одного из двух, поэтому один будет зависать, и я хочу, чтобы он таймаутом быстрее. Более крупный скрипт вытаскивает имя пользователя, и эта строка, которую я разместил здесь, переводит это имя пользователя на полное имя человека, но поскольку у меня есть большой скрипт, проверьте реестр winxp и win7, он найдет только тот или иной, который почему я хотел таймаут, если это возможно .. – Aaron

ответ

1

net не позволяет явно установить время на своих операциях, bu т вы можете проверить эту ссылку на изменение ipv4 тайм-аут для сокетов:

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

Единственное, иначе я мог себе представить, как нерест рабочий поток, но я даже не знаю, если это возможно в Баш, Я не достаточно жидкий, чтобы ответить на это; плюс он открывает вам проблемы с синхронизацией и всевозможные многопоточные проблемы, помимо того, что вы пытаетесь выполнить в сценарии bash для начала! : P

+0

Я боялся, что это будет нелегко .. но спасибо – Aaron

1

Помогает ли это?

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

Могу ли я заменить то, что у меня есть с этим? – Aaron

+1

Да. Я считаю, что он даст тот же результат (возвращающий полное имя пользователя), но не зависает, если пользователь не найден. – mjolinor

+0

переменная $ winxp, например, является «ajstepanik», и строка в моем OP примет это и превратит ее в мое имя (Stepanik, Aaron J. и т. Д. И т. Д.), Когда она ее найдет. Кажется, это не так с твоей :(Я все равно буду пытаться. – Aaron

10

Хотя @mjolinor может действительно предоставил вам альтернативный подход, здесь является прямым ответом на ваш общий вопрос: как вы вынуждаете тайм-аут в PowerShell?

Оберните все, что вы хотите ограничить время в блоке сценария, запустите это как задание, затем используйте командлет , чтобы ограничить действие. 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, предполагая, что вы хотите, генерируется на стандартный вывод:

$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 
+0

Итак, line 3 Я бы просто поместил команду, у меня есть мой мой оригинальный пост (самое первое в сообщении) – Aaron

+1

@ Аарон: Это правильно - с небольшим предостережением. Я обновил свой ответ, чтобы быть немного полезнее для вас. В обновлении заполните блок '$ code' вашими командами _except_ для фактического назначения вывода в' $ fullnamexp'. Где вы видите «Receive-Job», выполните ваше назначение там, то есть '$ fullnamexp = Receive- Работа $ j'. –

+0

Привет, я добавил обновление к оригинальному сообщению, можете ли вы сказать мне, правильно ли это сделать? У меня это так, но он ничего не выводит, но он, однако, дожидается количества секунд, которые я указываю. – Aaron

4

Вы можете использовать Start-Sleep, чтобы приостановить скрипт:

Start-Sleep -s 5 
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 
Смежные вопросы