sonny1895
Goto Top

Powershell - Werte von Variablen zwischen Skripten hin un her geben

Hallo zusammen,

Ich bin relativ neu in der Powershell Welt. Habe zwar schon einiges umgesetzt bekommen gelange jetzt aber an meine Grenzen und finde kein passendes Microsoft Doc zu meinem Thema/Problem.


Ich arbeite gerade an Skripten die auf 2 verschiedenen Computern ausgeführten werden sollen.

Die Skripte werden auf einem Netzlaufwerk gespeichert und beide Computer bzw. die Angemeldeten Benutzer haben darauf Vollzugriff.


Skript 1 auf Computer 1:

Hier sammel ich Informationen und Speicher diese in Variablen. Wenn das sammeln Erfolgreich ist öffne ich eine PS-Session zu Computer 2 und Starte dort ein Skript und Übergebe die Variablen (param).

Nun möchte ich in Sjript 1 warten bis ich eine Variable (Inhalt 0 = nicht Erfolgreich 1 = Erfolgreich) von Skript 2 zurück bekomme damit Skript 1 die PS-Session beendet und weiter Arbeiten kann.


Skript 2 auf Computer 2:

Mit den Übergebenen Informationen erstelle ich ein Postfach und prüfe dann ob das Postfach auch angelegt wurde. Je nach Ertfolg oder nicht wird eine Variable mit 0 oder 1 erstellt.

Diese soll an Skript 1 zurückgegeben werden.


Frage:

Funktioniert mein Plan überhaupt? Oder kann ich wahlweise aus dem Skript 1 heraus variablen in Skript 2 auf Inhalt prüfen?


Für jede Hilfe bin ich dankbar.

Viele Grüße
Patrick

Content-ID: 613118

Url: https://administrator.de/contentid/613118

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

TK1987
Lösung TK1987 15.10.2020 aktualisiert um 10:14:58 Uhr
Goto Top
Moin Patrick,

Zitat von @Sonny1895:
Wenn das sammeln Erfolgreich ist öffne ich eine PS-Session zu Computer 2 und Starte dort ein Skript und Übergebe die Variablen (param).
Wenn ich dich richtig verstehe, machst du das mit Enter-Pssession?! Dieser Befehl ist eigentlich nur dazu gedacht, um manuell Remote zu arbeiten.
Arbeite stattdessen mit Invoke-Command, dann bekommst du auch die Ausgaben zurück, die dir der Remote-Rechner liefert.

Wichtig ist nur, das du separierst, welche Variablen lokal ausgewertet werden (also übergeben) werden sollen; und welche erst auf dem Remoterechner ausgewertet werden sollen.
Beispiel:
# Zugangsdaten festlegen (falls erforderlich)
$Cred = Get-Credential 'Username'  

# Auszuführende Befehle
$Script = @(
  'write-host $Env:Computername' # Die Variable wird erst auf dem Remoterechner ausgewertet, da in Single-Qutoes  
  "write-host $Env:Computername" # Die Variable wird bereits lokal ausgewertet, da in Double-Quotes  
  )

Invoke-Command -ComputerName 'PC02' -Credential $Cred -ScriptBlock ([scriptblock]::Create($Script -Join ';'))  

Gruß Thomas
Sonny1895
Sonny1895 15.10.2020 um 12:49:42 Uhr
Goto Top
Hi Thomas,

danke für die Antwort.

ich habe ausprobiert und bei mit gibt er nur den 2ten Wert aus.

# Auszuführende Befehle
$Script = @(
'write-host $Env:Computername' # Die Variable wird erst auf dem Remoterechner ausgewertet, da in Single-Qutoes
"write-host $Env:Computername" # Die Variable wird bereits lokal ausgewertet, da in Double-Quotes
)

Invoke-Command -ComputerName 'PC02' -Credential $Cred -ScriptBlock ([scriptblock]::Create($Script -Join ';'))


invoke-command_scriptblock


Ein Problem was bei der Methode entsteht ist, das ich ein Com-Objekt erstellen muss um das Postfach per Powershell anlegen zu können, das aber über Invoke-Command in einen Fehler läuft. Da das Erstellen des Com-Objektes lokal auf der Maschine funktioniert, war die idee ein Script lokal auszuführen.

Wenn ich dich richtig verstehe Funktioniert meine erste Idee nicht oder ist sehr umständlich. Oder verstehe ich das Falsch?

Viele Grüße
Patrick
TK1987
TK1987 15.10.2020 aktualisiert um 13:10:17 Uhr
Goto Top
Zitat von @Sonny1895:
ich habe ausprobiert und bei mit gibt er nur den 2ten Wert aus.
invoke-command_scriptblock
Wenn ich das richtig sehe, hast auch bei -Join auch einen Doppelpunkt statt einem Semikolon verwendet.

Ein Problem was bei der Methode entsteht ist, das ich ein Com-Objekt erstellen muss um das Postfach per Powershell anlegen zu können, das aber über Invoke-Command in einen Fehler läuft. Da das Erstellen des Com-Objektes lokal auf der Maschine funktioniert, war die idee ein Script lokal auszuführen.
Du sollst natürlich auch genau das dann mit Invoke-Comand tun -> Skript auf dem Remoterechner ausführen, welches dir die gewünschten Informationen zurück liefert.