derhoeppi
Goto Top

Powershell Übergabe von Variablen zwischen verschiedenen Skripten

Hallo,

folgende Thematik habe ich gerade. Ich habe ein Skript. In diesem habe ich eine Variable, die ich global definiert habe. In dem Skript wird ein weiteres Skript mit Invoke-Expression aufgerufen, damit ich innerhalb eines Gültigkeitsbereiches bleibe. Nun ist mein Problem beim Aufruf des zweiten Skriptes, dass ich dafür die Powershell erneut starten muss, weil ich es nur mit dem Pfad nicht hinbekommen habe. Mit dem erneuten Start der Powershell bin ich natürlich außerhalb des Gültigkeitsbereiches.

Gibt es eine Möglichkeit wie ich Variablen von einem Skript ins nächste Übergebe kann oder wie kann ich ein zweites Skript im selben Gültigkeitsbereich aufrufen.

Gruß
derhoeppi

Content-Key: 283878

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

Ausgedruckt am: 19.03.2024 um 09:03 Uhr

Mitglied: 114757
Lösung 114757 25.09.2015, aktualisiert am 28.09.2015 um 09:09:27 Uhr
Goto Top
Da gibts mehrere Möglichkeiten:

Via Skriptblock
$secondscript = {
   # hier dein zweites Skript als Skriptblock in deinem ersten
}
# Aufrufen des Skriptblocks mit "dot-sourcing" 
. $secondscript
Oder du übergibst deinem zweiten Skript Parameter (wichtig param() muss ganz am Anfang des Skriptes stehen)
Zweites Skript
param(
    $parameter1,
    $parameter2
)
write-host $parameter1
write-host $parameter2

Erstes Skript
# Aufruf des zweiten Skripts mit Parametern
&'C:\zweitesSkript.ps1' "Parameter1" "Parameter2"  
oder du nutzt einfach wieder Dot-Sourcing dann wandern deine lokalen Variablen (Vorsicht das du dir keine überschreibst) auch in die Session des zweiten Skripts:
. 'C:\zweitesSkript.ps1'  
https://www.sepago.de/blog/2013/12/23/powershell-scripts-funktionen-und- ...

Gruß jodel32
Mitglied: derhoeppi
derhoeppi 13.10.2015 um 11:50:07 Uhr
Goto Top
Hallo Jodel,

ich muss das Thema noch einmal auspacken. In dem damaligen Fall habe ich mich für das Dot-Sourcing entschieden, weil ich nicht nur das Skript ausführen wollte, sondern aus dem zweiten Skript einen Variablenwert an das erste übergeben wollte. Dabei hat es mir in die Arme gespielt, dass ich aus beiden Skripten auf die Variablen zugreifen konnte.
Nun habe ich aber die Anforderung ein weiteres Skript aufzurufen. Mein Skript 1 hat eine GUI und soll in Zukunft auch ohne einem PowerShell Fenster gestartet werden (über eine Desktopverknüpfung). Nun möchte ich in dem Skript1 Skript 2 aufrufen. Das Skript 2 ist CLI basierend, so dass sich dann ein neues PowerShell Fenster öffnen sollte. Und genau an dieser Stelle liegt mein Problem. Bisher startet das Skript2 im PowerShell Fenster von Skript1.

Wie kann ich das Problem lösen? Gibt es vielleicht auch für meinen Initialen Fall, den ich via Dot-Sourcing gelöst habe eine Möglichkeit aus Skript 2 einen Variablenwert an Skript 1 zurückzugeben ohne das ich Dot-Sourcing nutzen muss. Ich merke so langsam, dass es in den Skripten Überschneidungen der Variablen gibt. Ich kann diese zwar umbenennen, aber wenn ich die wenigen Variablen die von beiden Skripten genutzt werden, übergeben kann, könnte ich mir den Aufwand mit dem umbenennen sparen.

Gruß
derhoeppi
Mitglied: 114757
114757 13.10.2015 aktualisiert um 12:06:42 Uhr
Goto Top
Guckst du in mein Kommentar oben, nutze die Parameterübergabe , siehe zweiter Codeblock oben, das ist die vernünftigste Variante.

Eine ganz neue Powershell-Session kann man auch mit start-process Powershell starten wenn man es braucht. Damit lassen sich auch Skripte starten, indem man sie als Argument übergibt.
Mitglied: derhoeppi
derhoeppi 13.10.2015 um 14:26:14 Uhr
Goto Top
Zitat von @114757:

Guckst du in mein Kommentar oben, nutze die Parameterübergabe , siehe zweiter Codeblock oben, das ist die vernünftigste Variante.



Kann ich damit auch von dem Skript 2 Werte an Skript 1 übergeben? Im Skript 2 erfolgt ja kein expliziter Aufruf von Skript 1.

Gruß
derhoeppi
Mitglied: 114757
114757 13.10.2015 aktualisiert um 14:32:22 Uhr
Goto Top
Nein.

Dann arbeite mit globalen Variablen wenn du sie aus beiden Skripten brauchst und sie in der selben Session laufen ...
$global:var1 = "xyz"

Erste Stunde Powershell:
about_scopes
Mitglied: derhoeppi
derhoeppi 13.10.2015 um 15:11:56 Uhr
Goto Top
Okay mit den globalen Variablen arbeite ich bereits. Ich hätte gehofft, dass ich auch dieses umgehen kann.

Grß
dhoeppi
Mitglied: 114757
114757 13.10.2015 aktualisiert um 16:13:00 Uhr
Goto Top
Zitat von @derhoeppi:

Okay mit den globalen Variablen arbeite ich bereits. Ich hätte gehofft, dass ich auch dieses umgehen kann.
Wenn du in solche Zwickmühlen kommst ist meist der Aufbau/Aufteilung der Skripte suboptimal und sollte überdacht/konsolidiert werden.