web-dev-qa-db-fra.com

ajout d'un délai d'attente à batch/powershell

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

Si $winxp ne peut pas être trouvé, la commande sera bloquée. Puis-je utiliser un délai d'attente avec ceci pour le faire avancer après 5 à 10 secondes? Je ne sais pas où je le mettrais.

Edit- J'utilise ceci pour extraire le nom d'utilisateur:

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

$winxp est alors un nom de connexion tel que ajstepanik puis je le mets dans: $fullnamexp = ((Net User $winxp /domain | Select-String "Full Name") -replace "Full Name","").Trim();

Mise à jour du 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
6
Aaron

Alors que @mjolinor vous a peut-être fourni une approche alternative, voici une réponse directe à votre question générale: comment forcer l'expiration du délai dans PowerShell?

Enveloppez ce que vous souhaitez limiter dans un bloc de script, exécutez-le en tant que tâche, puis utilisez l'applet de commande Wait-Job pour limiter l'opération. Wait-Job retournera soit à la fin du délai d'attente ou lorsque le bloc de script sera terminé, selon ce qui se produira first . Une fois que Wait-Job est revenu, vous pouvez examiner l’état du travail ($j.state) pour déterminer s’il a été interrompu ou non, si cela vous importe.

$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

Mise à jour du 2014.01.18

Voici une approche un peu plus simple qui inclut également l'étape pratique consistant à extraire des informations du bloc de script avec Receive-Job, en supposant que ce que vous voulez soit généré sur 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
14
Michael Sorens

Vous pouvez utiliser Start-Sleep pour suspendre le script:

Start-Sleep -s 5
4
Roman O

Est-ce que cela aide?

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

net ne vous autorise pas explicitement à définir un délai d'expiration pour ses opérations, mais vous pouvez vérifier ce lien en modifiant le délai d'attente ipv4 pour vos sockets:

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

La seule chose que je puisse imaginer, c’est de créer un thread ouvrier, mais je ne sais même pas si c’est possible dans bash, je ne suis pas assez fluide pour y répondre; De plus, cela vous ouvre la voie à des problèmes de synchronisation et à toutes sortes de problèmes à threads multiples allant au-delà de ce que vous essayez d'accomplir rapidement dans un script bash pour commencer! : P

1
Dan H

Cette solution ne fonctionne pas pour moi. remove-job -force $j prend plus de 5 secondes dans cet exemple.

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