Sto cercando di eseguire uno script esistente su un server remoto e acquisire l'output in un file locale

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

Domanda

Voglio eseguire questo su più server (quasi 40-50 server) parallermente

$ username="utente"

$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
}
.

Questo codice funziona bene se rimuovo il lavoro di partenza, ma esegue uno dopo l'altro, che impiega molto tempo.

Non riesco a utilizzare il PSSession o Avvike-Command, poiché è limitato nel nostro ambiente.

Questo codice non esce mai.Si ferma in questa posizione:

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

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

È stato utile?

Soluzione

Per iniziare con te non passa la tua variabile nel lavoro.Ciò di cui hai bisogno è utilizzare la variabile $ args all'interno degli scriptblock e quindi passare le variabili che desideri 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
}
.

Probabilmente non ho bisogno di passare la variabile di ambiente, ma sembrava che tu avessi avuto un problema di ambito con le variabili.

In alternativa è possibile utilizzare un blocco di parametro nello scriptblock per denominare le variabili, che essenzialmente mappe positivamente gli argomenti passati nella variabile denominata.

$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
}
.

Spero che questo aiuti. Saluti, Chris.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top