Benutzer mit den meisten Antworten
Variablen Übernehmen aus einem anderen Script.

Frage
-
Hallo,
Wüsste evtl. einen ansatz oder hat eine Idee wie man aus einem anderen ps1 Script variablen übernehmen kann?
Also als beispiel
testScript1.ps1
#Standard Varibalen
$test1 = 'User1' $Test2 = 'Software A' $test3 = 'test.msi' Diverse Funktionen und abfragen kommen nach den Standard setzten der Variablen.
Nun möchte ich gern, wenn dies geht das in einem anderen Script nur die Variablen ausgelsen werden.
testScript2.ps1
Die Werte bzw- Variablen aus dem Script 1 wären dann
Wüsste nicht wie ich das anders beschrieben sollte, daher hoffe ich das dies so aussreicht.$User = 'User1' $SoftA = 'Software A' $MSIFile = 'test.msi'
Der Sinn dahinter besteht darin das ich ein Powershell Tool geschrieben habe, was man als Package Builder
nutzen kann. Wenn ich nun ein altes Paket öffne würde ich gern die Werte übernehmen wollen.
Gruß
Markus
Antworten
-
Moin Markus,
innerhalb einer Sitzung geht es, wenn Du die Variablen als global deklarierst:
$global:var_one = 1 $global:var_two = 2
und dann auch so adressierst:
Write-Host "Die Summe: $($global:var_one + $global:var_two)"
HTH
Evgenij Smirnov
msg services ag, Berlin -> http://www.msg-services.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com
- Als Antwort markiert Denniver ReiningMVP, Moderator Sonntag, 8. Mai 2016 21:00
-
Hallo,
deine Fragestellung ist ziemlich vage; jedenfalls ist mir noch nicht klar, was du genau willst.
Ich würde vorschlagen, dass du deine Variablensetzungen in eine Art Config-Datei schreibst.
Config.ps1:
$User = 'User1' $SoftA = 'Software A' $MSIFile = 'test.msi'
Diese Config.ps1 kannst du dann in anderen Skripten intern ausführen und so die Variablen in den Speicher laden:
. "Pfad\zu\deiner\Datei\Config.ps1"
$User, $SoftA
Der Pfad kann natürlich auch eine Variable sein oder ".\Config.ps1" falls das Skript im gleichen Ordner liegt. Zum Lernen kannst du auch mal recherchieren: der Unterschied zwischen dot-sourcing mit dem Punkt (wie oben) und dem Ausführen-Operator '&'.
Viele Grüße
Christoph
- Bearbeitet hpotsirhc Dienstag, 26. April 2016 11:47
- Als Antwort vorgeschlagen hpotsirhc Mittwoch, 4. Mai 2016 10:09
- Nicht als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Mittwoch, 4. Mai 2016 10:42
- Als Antwort markiert Denniver ReiningMVP, Moderator Sonntag, 8. Mai 2016 21:00
-
Mir ist nicht ganz klar was du eigentlich genau vorhast. Insbesondere dein Kommentar "dann müsste das Script ja durchlaufen" wundert mich. Wie sollen die Werte denn zum ersten Mal zugewiesen werden wenn Script 1 nicht läuft? :)
Falls du aber sowas wie Default-Werte oder Settings speichern und für folgende Scripte verfügbar halten willst, würde ich ganz einfach über ein Settings-File gehen.
Das hat keine Nachteile, aber diverse Vorteile beim Debugging und Testen (einfaches Werte ändern) und Logging:# einmalig $DefaultValues = [pscustomobject]@{ User = $User Soft1 = $Soft1 MsiFile = $MsiFile } Export-Clixml -Path D:\tmp\settings.xml -InputObject $DefaultValues -Force # in folgenden Scripten $DefaultValues = Import-Clixml -Path D:\tmp\settings.xml $User = $DefaultValues.User $Soft1 = $DefaultValues.Soft1 $MsiFile = $DefaultValues.MsiFile
Das DefaultValues-Objekt kannst du beliebig und unbegrenzt um Werte erweitern.
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
(Schneller, besser + komfortabler scripten.)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 28. April 2016 12:57
- Als Antwort markiert Denniver ReiningMVP, Moderator Sonntag, 8. Mai 2016 21:00
Alle Antworten
-
Moin Markus,
innerhalb einer Sitzung geht es, wenn Du die Variablen als global deklarierst:
$global:var_one = 1 $global:var_two = 2
und dann auch so adressierst:
Write-Host "Die Summe: $($global:var_one + $global:var_two)"
HTH
Evgenij Smirnov
msg services ag, Berlin -> http://www.msg-services.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com
- Als Antwort markiert Denniver ReiningMVP, Moderator Sonntag, 8. Mai 2016 21:00
-
Hallo,
deine Fragestellung ist ziemlich vage; jedenfalls ist mir noch nicht klar, was du genau willst.
Ich würde vorschlagen, dass du deine Variablensetzungen in eine Art Config-Datei schreibst.
Config.ps1:
$User = 'User1' $SoftA = 'Software A' $MSIFile = 'test.msi'
Diese Config.ps1 kannst du dann in anderen Skripten intern ausführen und so die Variablen in den Speicher laden:
. "Pfad\zu\deiner\Datei\Config.ps1"
$User, $SoftA
Der Pfad kann natürlich auch eine Variable sein oder ".\Config.ps1" falls das Skript im gleichen Ordner liegt. Zum Lernen kannst du auch mal recherchieren: der Unterschied zwischen dot-sourcing mit dem Punkt (wie oben) und dem Ausführen-Operator '&'.
Viele Grüße
Christoph
- Bearbeitet hpotsirhc Dienstag, 26. April 2016 11:47
- Als Antwort vorgeschlagen hpotsirhc Mittwoch, 4. Mai 2016 10:09
- Nicht als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Mittwoch, 4. Mai 2016 10:42
- Als Antwort markiert Denniver ReiningMVP, Moderator Sonntag, 8. Mai 2016 21:00
-
Aber dann müsste doch das erste Script ja durchlaufen, oder?
Schon. Hast Du dir das irgendwie anders vorgestellt? Vielleicht habe ich Dich falsch verstanden.
Wenn Du einen Satz von Variablen möchtest, die in jedem Skript mit den gleichen Werten initialisiert warden, mach ein Modul daraus und binde es in alle Skripte ein. Oder ein Profil, aber das ist eher mit Vorsicht zu genießen.
Evgenij Smirnov
msg services ag, Berlin -> http://www.msg-services.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com
-
-
Mir ist nicht ganz klar was du eigentlich genau vorhast. Insbesondere dein Kommentar "dann müsste das Script ja durchlaufen" wundert mich. Wie sollen die Werte denn zum ersten Mal zugewiesen werden wenn Script 1 nicht läuft? :)
Falls du aber sowas wie Default-Werte oder Settings speichern und für folgende Scripte verfügbar halten willst, würde ich ganz einfach über ein Settings-File gehen.
Das hat keine Nachteile, aber diverse Vorteile beim Debugging und Testen (einfaches Werte ändern) und Logging:# einmalig $DefaultValues = [pscustomobject]@{ User = $User Soft1 = $Soft1 MsiFile = $MsiFile } Export-Clixml -Path D:\tmp\settings.xml -InputObject $DefaultValues -Force # in folgenden Scripten $DefaultValues = Import-Clixml -Path D:\tmp\settings.xml $User = $DefaultValues.User $Soft1 = $DefaultValues.Soft1 $MsiFile = $DefaultValues.MsiFile
Das DefaultValues-Objekt kannst du beliebig und unbegrenzt um Werte erweitern.
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
(Schneller, besser + komfortabler scripten.)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 28. April 2016 12:57
- Als Antwort markiert Denniver ReiningMVP, Moderator Sonntag, 8. Mai 2016 21:00
-
> dein Kommentar "dann müsste das Script ja durchlaufen" wundert mich. WieWenn ich es richtig verstehe: Wenn er sein externes Script mitDotSourcing laufen lassen würde, hätte er dessen Variablen in seinemScope. Allerdings natürlich auch alle Funktionen, und der Hauptblockwürde auch ausgeführt.> sollen die Werte denn zum ersten Mal zugewiesen werden wenn Script 1> nicht läuft? :)IMHO möchte er die Variablen, aber nicht den ganzen Rest.Quick hack für ein aktuell in der ISE geladenes Skript:$AbstractSyntaxTree =[System.Management.Automation.Language.Parser]::ParseInput($psISE.CurrentFile.Editor.Text,[ref]$null, [ref]$null)$vars = $AbstractSyntaxTree.FindAll( {$args[0] -is$VariableExpressionAst}, $false )Jetzt könnte man durch $Vars.Parent loopen - aber das ist natürlichfehleranfällig, wenn da auch Funktionen verwendet werden.> ein Settings-File gehen.Das ist die eleganteste Lösung :-)
-
Ja, an AST habe ich auch sofort gedacht bei dieser Fragestellung. Aber ich bin ja letzte Woche auch auf demselben Event gewesen wie Martin ;-)
CLIXML-Dateien sind für solche gemeinsam genutzten Settings wirklich eine der elegantesten Lösungen. Vor allem habe ich sie schätzen glernt in Umgebungen wo man Skripte signiert und damit nicht ohne weiteres ausführbaren Code verändern kann.
Evgenij Smirnov
msg services ag, Berlin -> http://www.msg-services.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com
-
Markus, ist deine Frage damit beantwortet?
Blog: http://bytecookie.wordpress.com
Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
(Schneller, besser + komfortabler scripten.)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort. -
Ja, AST ist wirklich sehr cool für die abstrakte Scriptanalyse, aber sich damit passiv Variablen aus einem Script auszulesen, wäre wirklich von hinten durch die Brust und dann sehr deutlich am Auge vorbei. :)
Das Problem geht schon damit los, das du nicht die endgültigen Werte der Variablen angezeigt bekommst. Wenn die nämlich z.b. aus anderen Variablen zusammengebaut werden oder gar aus Scriptblöcken bestehen, bekommst du passiv von außen den Wert nie heraus.Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
(Schneller, besser + komfortabler scripten.)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.- Bearbeitet Denniver ReiningMVP, Moderator Dienstag, 3. Mai 2016 11:23