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

Si $winxp no puede ser encontrado, el comando que se va a colgar, hay un tiempo de espera se puede utilizar con esto hacer que se mueva en después de 5 a 10 segundos? No estoy seguro de donde me lo puso.

Editar – yo uso esta para tirar el nombre de usuario:

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

$winxp es entonces un nombre de inicio de sesión como ajstepanik luego lo puse en: $fullnamexp = ((net user $winxp /domain | Select-String "Full Name") -replace "Full Name","").Trim();

1.21.2014 Actualización

 $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
Es esto algo que tu haciendo una sola instancia de, o se están haciendo varias iteraciones de diferentes usuarios en un bucle?
Estoy utilizando el comando anterior en una secuencia de comandos de powershell dos veces, una para windows xp, uno para windows 7, y la secuencia de comandos sólo será capaz de trabajar por 1 de los dos, así que uno va a colgar y lo quiero de tiempo de espera más rápido. El más grande de secuencia de comandos tira el nombre de inicio de sesión y esta línea que he publicado aquí se traduce en que el nombre de usuario el nombre completo de la persona, pero desde que tengo el más grande de secuencia de comandos de comprobar el registro de winxp y win7, solo va a encontrar uno o el otro, que es la razón por la que yo quería que el tiempo de espera si es posible..

OriginalEl autor Aaron | 2014-01-17

5 Comentarios

  1. 14

    Mientras que @mjolinor pueden haber proporcionado un enfoque alternativo, aquí es una respuesta directa a su pregunta general: ¿cómo se fuerza a que el tiempo de espera en PowerShell?

    Envolver lo desea límite de tiempo en un bloque de secuencia de comandos, ejecute que como un trabajo, a continuación, utilizar la Wait-Job cmdlet a plazo de la operación. Wait-Job devolverá al final del período de tiempo de espera o cuando el bloque de secuencia de comandos completa, lo que ocurra primera. Después de Wait-Job devuelve, puede examinar el estado del trabajo ($j.state) para determinar si se ha interrumpido o no, si es importante para usted.

    $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 Actualización

    Aquí es un poco más ágil enfoque que también incluye el paso práctico de obtención de información de la secuencia de comandos de bloque con Receive-Job, suponiendo que lo que quieres es generado en 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
    Así, en la línea 3 acabo de poner el comando que tengo de mi post original? (el primero en el post)
    Eso es correcto, con una pequeña salvedad. He actualizado mi respuesta sea un poco más útil para usted. En la actualización, rellene el $code bloque con sus comandos excepto para la asignación real de la salida a $fullnamexp. Donde ver Receive-Job, hacer su tarea, es decir,$fullnamexp = Receive-Job $j.
    Hola, he añadido una actualización del post original, me puede decir si esa es la forma correcta de decirlo? Yo lo tengo así, pero no de salida de la nada, pero no obstante, se espera que la cantidad de segundos que especifique.
    Cerrar; se necesitan dos correcciones: (1) La asignación debe ser en Receive-Job en lugar de Remove-Job. (2) El texto Get-ChildItem *.cs | select name era simplemente mi muestra–remove que a partir de su código.
    Hola, he actualizado mi post con el código fijo. Se puede verificar que es correcta? He probado con el código y no veo ninguna salida, pero solo quiero verificar que sea correcta.

    OriginalEl autor Michael Sorens

  2. 4

    Puede utilizar de Inicio de Sueño para detener la secuencia de comandos:

    Start-Sleep -s 5

    OriginalEl autor Roman O

  3. 1

    neto explícitamente no le permite establecer un tiempo de espera en sus operaciones, pero usted podría echa un vistazo a este enlace sobre el cambio de ipv4 tiempo de espera para su sockets:

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

    La única cosa que me podía imaginar es generar un subproceso de trabajo, pero ni siquiera sé si eso es posible en bash, yo no soy lo suficientemente fluida como para responder a eso; además de que te abre las puertas a los problemas de sincronización, y todo tipo de múltiples subprocesos cuestiones más allá de lo que estamos tratando de lograr rápidamente en un script de bash para empezar! 😛

    Tenía miedo de que no sería fácil … pero gracias

    OriginalEl autor Dan H

  4. 1

    Hace esta ayuda?

    $query = (dsquery user -samid $winxp) 
    if ($query) {$fullnamexp = ($query | dsget user -display)[1].trim()}
    $fullnamexp
    Soy yo para reemplazar lo que tengo con esto?
    Sí. Creo que va a producir el mismo resultado (la devolución el usuario nombre completo), pero no se bloquea si el usuario no se encuentra.
    el $winxp variable en, por ejemplo, es «ajstepanik» y de la línea en mi OP va a tomar eso y convertirlo en mi nombre(Stepanik, Aaron J., etc, etc) cuando lo encuentra. No parece hacerlo con el tuyo 🙁 voy a seguir intentando.
    He probado en mi dominio y funcionó OK.
    Sí, yo no puedo conseguir que funcione. No salida de la nada, sino un espacio en blanco. la entrada es sólo el nombre de usuario, se debe trabajar..

    OriginalEl autor mjolinor

  5. 0

    Esta solución no funciona para mí. remove-job -force $j tarda más de 5 segundos en este ejemplo.

    $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

    OriginalEl autor js2010

Dejar respuesta

Please enter your comment!
Please enter your name here