Pregunta

Estoy intentando ejecutar un archivo cmd en una lista de 48 equipos. No quiero para ejecutar y esperar a la finalización de forma secuencial, ya que cada cmd tarda unos 10 minutos para completar. WinRM no es una opción. Tampoco es WMI. PsExec es una opción .... pero me parece que no puede hacer que funcione dentro de Start-Job.

que estoy haciendo algo como:

$sb = {
    param
    (
        $computer = "serverw01",
        $userid = "domain2\serviceid",
        $password = 'servicepw',
        $command = "cd /d d:\ && updateAll.cmd"
    )

    d:\eps\pstools\PsExec.exe -u $userid  -p $password "\\$($computer)" cmd /c $command
}

foreach ($computer in Get-Content "D:\Data\serverlist.txt") {
    Start-Job $sb -ArgumentList $computer
}

Esto crea un montón de puestos de trabajo .... pero el nunca es completa y si recibo-Trabajo en cualquiera de ellos que vuelva

    PS> get-job | receive-job -Keep

    + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com

se ejecuta muy bien si me quedo la función como:

& $sb -computer "serverw01"

El inicio de secuencia de comandos se ejecuta en Powershell v2.0 en el servidor cuadro 2008R2 Yo lo he probado en una caja en domain2 mientras está conectado con un ID de usuario administrador de dominio (mismo resultado).

¿Fue útil?

Solución

Probar para el comando psexec, asegurando que incluya "-d" para no esperar la respuesta, y poner la variable de equipo justo después de psexec:

d:\eps\pstools\psexec "\\$($computer)" /accepteula -u $userid -p $password -d cmd /c $command

Otros consejos

Este problema se produce en los servidores que cuelga Win2003 y Win2008.

La mayoría de las personas a resolver este problema con una solución como eco y la tubería de manera que PowerShell consigue una cierta entrada de STDIN.

Pero no existe una solución dentro de PowerShell. Simplemente comienza a PowerShell con la opción -inputformat ninguno como:

powershell -inputformat none -command ...

Por favor, intente el parámetro -accepteula a psexec como

d:\eps\pstools\PsExec.exe -accepteula -u $userid  -p $password

de

$computerList = Get-Content "D:\Data\serverlist.txt"      
$sb = 
{ 
    param($name)
        }
            $computer = $name
            $userid = "domain2\serviceid"
            $password = 'servicepw'
            $command = "cd /d d:\ && updateAll.cmd"
            d:\eps\pstools\PsExec.exe -u $userid -p $password \\$computer cmd /c $command
         {
}
foreach ($computer in $computerLinst) {
    Start-Job $sb -ArgumentList $computer
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top