Estoy tratando de ejecutar un script existente en un servidor remoto y capturar la salida en un archivo local

StackOverflow https://stackoverflow.com//questions/24055009

Pregunta

Quiero ejecutar esto en varios servidores (casi 40-50 servidores) paralelamente

$ username="usuario"

$Password = "Password"

$servers = get-content "c:\temp\servers.txt"

$sb = {c:\temp\PsExec.exe -h \\$server -u $Username -p $password cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$env:userprofile\Desktop\output.txt"} 

foreach($server in $servers)
{
    start-job -ScriptBlock $sb
}

Este código funciona bien si quito el trabajo de inicio, pero ejecuta uno después del otro, lo que lleva mucho tiempo.

No puedo usar Pssession o Invoke-Command, ya que está restringido en nuestro entorno.

Este código nunca sale.Se detiene en esta posición:

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

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

¿Fue útil?

Solución

para comenzar con usted no está pasando ninguna de sus variables al trabajo.Lo que necesita es usar la variable de $ args dentro del scriptblock y luego pasar las variables que desee con -argumentlist.

$Password = "Password"

$servers = get-content "c:\temp\servers.txt"

$sb = {
  c:\temp\PsExec.exe -h \\$args[0] -u $args[1] -p $args[2] cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$args[3]\Desktop\output.txt"
} 

foreach($server in $servers)
{
    start-job -ScriptBlock $sb -ArgumentList $server,$Username,$password,$env:userprofile
}

Probablemente no necesitaba pasar la variable de entorno, pero parecía que tenía un problema de alcance con las variables.

Alternativamente, podría usar un bloque de param en el bloqueador de script para nombrar sus variables, lo que esencialmente mapea posicionadamente los argumentos pasados a la variable nombrada.

$Password = "Password"

$servers = get-content "c:\temp\servers.txt"

$sb = {
  Param ($Server,$UserName,$Password,$UserProfile)

  c:\temp\PsExec.exe -h \\$Server -u $UserName -p $Password cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$UserProfile\Desktop\output.txt"
} 

foreach($server in $servers)
{
    start-job -ScriptBlock $sb -ArgumentList $server,$Username,$password,$env:userprofile
}

Espero que esto ayude. Saludos, Chris.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top