J'essaie d'exécuter un script existant sur un serveur distant et de capturer la sortie dans un fichier local

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

Question

Je veux exécuter ceci sur plusieurs serveurs (près de 40 à 50 serveurs) parallèles

$ nom d'utilisateur="utilisateur"

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

Ce code fonctionne bien si je supprimais le début-emploi, mais s'exécute l'un après l'autre, ce qui prend beaucoup de temps.

Je ne peux pas utiliser la commande psession ou invoke, car elle est limitée dans notre environnement.

Ce code ne sort jamais.Il s'arrête à cette position:

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

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

Était-ce utile?

La solution

Pour commencer avec vous ne transmettez aucune de vos variables dans le travail.Ce dont vous avez besoin est d'utiliser la variable $ ARGS dans le scriptblock, puis transmettez les variables souhaitées avec -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
}

Je n'ai probablement pas besoin de passer la variable d'environnement, mais cela semblait être un problème de cadrage avec les variables.

Vous pouvez également utiliser un bloc de paramètres dans le scriptBlock pour nommer vos variables, ce qui correspond essentiellement positionnement les arguments passés dans la variable nommée.

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

J'espère que cela vous aidera. Cheers, Chris.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top