none
Variablen Übernehmen aus einem anderen Script. RRS feed

  • 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

    $User = 'User1' $SoftA = 'Software A' $MSIFile = 'test.msi'

    Wüsste nicht wie ich das anders beschrieben sollte, daher hoffe ich das dies so aussreicht.

    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





    Dienstag, 26. April 2016 10:07

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

    Dienstag, 26. April 2016 10:36
  • 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



    Dienstag, 26. April 2016 11:44
  • 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.

    Donnerstag, 28. April 2016 10:52
    Moderator

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

    Dienstag, 26. April 2016 10:36
  • Hallo Evgenij,

    danke für die Antwort. Werde versuchen das heute mal zu testen.

    Aber dann müsste doch das erste Script ja durchlaufen, oder?

    gruss

    markus


    • Bearbeitet mku72 Dienstag, 26. April 2016 10:48
    Dienstag, 26. April 2016 10:46
  • 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



    Dienstag, 26. April 2016 11:44
  • 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

    Dienstag, 26. April 2016 11:48
  • > Wüsste evtl. einen ansatz oder hat eine Idee wie man aus einem anderen
    > ps1 Script variablen übernehmen kann?
     
    Wenn es etwas aufwändiger sein darf: Beschäftige Dich mal mit AST
    (Abstract Syntax Tree) - da steckt alles drin, was Du brauchst.
     
    Dienstag, 26. April 2016 15:04
  • 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.

    Donnerstag, 28. April 2016 10:52
    Moderator
  • > dein Kommentar "dann müsste das Script ja durchlaufen" wundert mich. Wie
     
    Wenn ich es richtig verstehe: Wenn er sein externes Script mit
    DotSourcing laufen lassen würde, hätte er dessen Variablen in seinem
    Scope. Allerdings natürlich auch alle Funktionen, und der Hauptblock
    wü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ürlich
    fehleranfällig, wenn da auch Funktionen verwendet werden.
     
    > ein Settings-File gehen.
     
    Das ist die eleganteste Lösung :-)
     
    Donnerstag, 28. April 2016 12:53
  • 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

    Donnerstag, 28. April 2016 13:44
  • > ich bin ja letzte Woche auch auf demselben Event gewesen wie Martin ;-)
     
    Ach guck an :-)) War ne coole Veranstaltung...!
     
    Donnerstag, 28. April 2016 14:25
  • 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.

    Dienstag, 3. Mai 2016 11:08
    Moderator
  • 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.


    Dienstag, 3. Mai 2016 11:21
    Moderator