none
Remote Script mit Parametern ausführen RRS feed

  • Frage

  • Hallo zusammen,

    ich habe gerade ein Brett vor dem Kopf.

    Ich habe ein Script geschrieben und möchte das auf einer Sammlung von Servern ausführen. 

    Dieses Script hat einen Parameter den ich übergeben möchte und legt auf dem jeweiligen, lokalen Server ein Log ab.

    Ich wollte dieses Script jetzt von meinem Managementserver aus auf den jeweiligen Servern laufen lassen und mir morgen meine Logs einsammeln.

    OK, machst du eine invoke-command und lässt einen Scriptblock laufen dachte ich mir aber dann bekomme ich die Ausgabe in meiner Shell.

    OK, dann als Job, war mein nächster Gedanke. Aber dann legt er kein Log ab.

    Wo ist mein Fehler?

    Wichtig ist eben, dass ich dem Script noch einen Parameter des Standortes mitgeben möchte. Diesen leite ich mir aus dem Hostnamen ab.

    Könnt ihr mir weiterhelfen?

    #so in der Form hatte ich es probiert, ungetestet aber die Idee wird übermitteilt :-) $Serversammlung=get-adcomputer -Filter... $Scriptpfad="c:\temp\MeinScript.ps1" foreach ($Server in $Serversammlung) {

    $Standort=$hostname...# hierfür egal

    .\Robocopy.exe $Scriptpfad "\\$Server\d$" Invoke-Command -ComputerName $Server -ScriptBlock {?????}

    }


    Was muss in den Scriptblock, wenn es denn so funktioniert?

    Ich möchte eben mein Scriptblock inkl. Paramater aufrufen ...ungefähr so

    powershell.exe -executionpolicy bypass -file "\\server\d\MeinScript.ps1 -Standort "$Standort" "

    oder

    powershell.exe -executionpolicy bypass -file "\\server\d\MeinScript.ps1 -Standort "$using:Standort" "

    Danke für eure Hilfe


    Toni







    • Bearbeitet tonibert Donnerstag, 25. April 2019 09:06
    Donnerstag, 25. April 2019 08:44

Antworten

  • Deine Lösung scheint mir unötig kompliziert. Invoke-Command akzeptiert beim Parameter -ComputerName auch ein Array von ComputerNamen. Wenn Du also Dein Script-Code in einen Scriptblock packst, sparst Du Dir so die Foreach-Schleife und das ganze Hin- und Herkopieren des Scriptes.

    Wenn Du die Log-Dateien sowieso später wieder einsammeln willst, warum willst Du sie dann unbedingt erst auf den Ziel-Servern erstellen?

    Edit: Ach ja noch was ... wenn Du Dir den Standort aus dem Servernamen erzeugst, kannst Du das auch in Deinem Code auf die gleiche Weise tun und bräuchtest das nicht als Parameter übergeben ... nur dass Du dann eben den Hostnamen des Servers nimmst, auf dem der Code läuft ... das hatte mich vorhin auch noch gewundert.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''



    • Bearbeitet BOfH-666 Donnerstag, 25. April 2019 10:50
    • Als Antwort markiert tonibert Donnerstag, 25. April 2019 11:47
    Donnerstag, 25. April 2019 10:46
  • Hi BOfH,

    $ServerSammlung=Get-ADComputer....
    $datei="D:\Skripte\MeinScript\Testmode.ps1"
    
    foreach ($Server in $ServerSammlung)
    {
    
    $SplitServer=$Server.Split("-")
    $Standort=$SplitServer[1]
    
    .\xcopy.exe $datei "\\$Server\d$\install"
    Invoke-Command -ComputerName $Server -ScriptBlock { . d:\install\testmode.ps1 -standort $using:Standort} -AsJob
    
        
    }

    So konnte ich es lösen.

    Du kannst die Ausgabe des Scriptes auch auf Deinem "lokalen" Server einsammeln und dort das Log schreiben. Du solltest dann natürlich den Ziel-Server-Namen in die Ausgabe einschließen ...  so kannst Du Dir das spätere Einsammeln sparen.

    Ich wollte das Log gerne lokal schreiben. Danke aber für den Hinweis

    Warum nicht?

    Mein Log hatte ein Problem und deine Nachfrage hat mich stutzig werden lassen :-) 

    Hmmm ... das verstehe ich nicht. Das sind zwei verschiedene Sachen, oder? Einmal als Paramter mitgeben oder aus dem Hostnamen ableiten!? ... ich bin verwirrt. ;-)

    Ja, der Hostname beinhaltet den Standort und die Variable fülle ich im Scriptdurchlauf.

    Danke für deine schnelle Hilfe!

    Schöne Woche!


    Toni


    • Bearbeitet tonibert Donnerstag, 25. April 2019 10:30
    • Als Antwort markiert tonibert Donnerstag, 25. April 2019 10:31
    Donnerstag, 25. April 2019 10:30

Alle Antworten

  • Ich wollte dieses Script jetzt von meinem Managementserver aus auf den jeweiligen Servern laufen lassen und mir morgen meine Logs einsammeln.

    OK, machst du eine invoke-command und lässt einen Scriptblock laufen dachte ich mir aber dann bekomme ich die Ausgabe in meiner Shell.

    Du kannst die Ausgabe des Scriptes auch auf Deinem "lokalen" Server einsammeln und dort das Log schreiben. Du solltest dann natürlich den Ziel-Server-Namen in die Ausgabe einschließen ...  so kannst Du Dir das spätere Einsammeln sparen.

    OK, dann als Job, war mein nächster Gedanke. Aber dann legt er kein Log ab.

    Warum nicht?

    Wichtig ist eben, dass ich dem Script noch einen Parameter des Standortes mitgeben möchte. Diesen leite ich mir aus dem Hostnamen ab.

    Hmmm ... das verstehe ich nicht. Das sind zwei verschiedene Sachen, oder? Einmal als Paramter mitgeben oder aus dem Hostnamen ableiten!? ... ich bin verwirrt. ;-)

    Vielleicht noch ne andere Idee. Du könntest auf den jeweilen Zielservern in das Eventlog schreiben und das dann später wieder einsammeln ... oder .... wenn das eine regelmäßige Geschichte ist, auf den Zielservern jeweils eine geplante Aufgabe einrichten, die ihre Logdateien alle in eine zentrale Freigabe schreiben ... zB. auf Deinem Management-Server. ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 25. April 2019 09:20
  • Hi BOfH,

    $ServerSammlung=Get-ADComputer....
    $datei="D:\Skripte\MeinScript\Testmode.ps1"
    
    foreach ($Server in $ServerSammlung)
    {
    
    $SplitServer=$Server.Split("-")
    $Standort=$SplitServer[1]
    
    .\xcopy.exe $datei "\\$Server\d$\install"
    Invoke-Command -ComputerName $Server -ScriptBlock { . d:\install\testmode.ps1 -standort $using:Standort} -AsJob
    
        
    }

    So konnte ich es lösen.

    Du kannst die Ausgabe des Scriptes auch auf Deinem "lokalen" Server einsammeln und dort das Log schreiben. Du solltest dann natürlich den Ziel-Server-Namen in die Ausgabe einschließen ...  so kannst Du Dir das spätere Einsammeln sparen.

    Ich wollte das Log gerne lokal schreiben. Danke aber für den Hinweis

    Warum nicht?

    Mein Log hatte ein Problem und deine Nachfrage hat mich stutzig werden lassen :-) 

    Hmmm ... das verstehe ich nicht. Das sind zwei verschiedene Sachen, oder? Einmal als Paramter mitgeben oder aus dem Hostnamen ableiten!? ... ich bin verwirrt. ;-)

    Ja, der Hostname beinhaltet den Standort und die Variable fülle ich im Scriptdurchlauf.

    Danke für deine schnelle Hilfe!

    Schöne Woche!


    Toni


    • Bearbeitet tonibert Donnerstag, 25. April 2019 10:30
    • Als Antwort markiert tonibert Donnerstag, 25. April 2019 10:31
    Donnerstag, 25. April 2019 10:30
  • Vielleicht noch ne andere Idee. Du könntest auf den jeweilen Zielservern in das Eventlog schreiben und das dann später wieder einsammeln ... 

    Gute Idee, werde ich im Auge behalten.Das war erstmal ein einmalige Geschichte....erstmal ;-)...du weißt was das heißt!


    Toni

    Donnerstag, 25. April 2019 10:32
  • Deine Lösung scheint mir unötig kompliziert. Invoke-Command akzeptiert beim Parameter -ComputerName auch ein Array von ComputerNamen. Wenn Du also Dein Script-Code in einen Scriptblock packst, sparst Du Dir so die Foreach-Schleife und das ganze Hin- und Herkopieren des Scriptes.

    Wenn Du die Log-Dateien sowieso später wieder einsammeln willst, warum willst Du sie dann unbedingt erst auf den Ziel-Servern erstellen?

    Edit: Ach ja noch was ... wenn Du Dir den Standort aus dem Servernamen erzeugst, kannst Du das auch in Deinem Code auf die gleiche Weise tun und bräuchtest das nicht als Parameter übergeben ... nur dass Du dann eben den Hostnamen des Servers nimmst, auf dem der Code läuft ... das hatte mich vorhin auch noch gewundert.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''



    • Bearbeitet BOfH-666 Donnerstag, 25. April 2019 10:50
    • Als Antwort markiert tonibert Donnerstag, 25. April 2019 11:47
    Donnerstag, 25. April 2019 10:46
  • Danke für den Tipp.

    Da hab ich den Wald vor lauter Bäumen nicht gesehen!



    Toni


    • Bearbeitet tonibert Donnerstag, 25. April 2019 11:48
    Donnerstag, 25. April 2019 11:48