Sto cercando di eseguire uno script esistente su un server remoto e acquisire l'output in un file locale
-
22-12-2019 - |
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
. 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