none
Inhalt einer Variablen in einen "Kommandoblock" übergeben RRS feed

  • Frage

  • Hallo Community,

     

    folgender Aufruf ruft das unten stehende Script auf. Ich habe das Script absichtlich nur auf das Kernproblem gekürzt.

    powershell.exe -command "& C:\scripts\ext_shell.ps1 test"

    param([string]$testvar )
    
    $importCmdletBlock = { 
    
    	echo "mein"
    	echo $testvar
    	Start-Sleep -s 5
    	exit
    }
    
    	echo "~~~~~~~~~~~~~~"
    	echo $testvar
    	& powershell.exe -command $importCmdletBlock -NoExit -args $testvar
    


    Leider wird der Parameter "test" nicht an die Variable $testvar im importCmdletBlock übergeben. Die Ausgabe sollte wie folgt aussehen:

     

    ~~~~~~~~~~~~~~
    test
    mein
    test

     

    Was mache ich falsch oder übersehe ich? Vor lautem Scripten sehe ich den Wald vor lauter Bäumen nicht mehr.

     

    ---

    Vielen Dank für die Hilfe,

    Dudi


    Montag, 15. August 2011 16:01

Antworten

  • Moin,

    wahrscheinlich kennt Denniver noch eine schönere Lösung, aber auf die Elemente, die dem Script übergeben werden, kann man über das Array $args zugreifen:

    powershell.exe -command "& C:\scripts\ext_shell.ps1 test"
    PS C:\> $args[0]
    PS C:\> test

    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    • Als Antwort markiert Demondudi Montag, 15. August 2011 21:03
    Montag, 15. August 2011 16:10
  • Also die Übergabe von "test" an $testvar aus dem initialen Aufruf des Scriptes funktioniert. Das Ergebnis ist:

    ~~~~~~~~~~~~~~
    test
    mein

    Daraufhin erzeugst du aber ja einen weiteren PowerShell-Prozess und versuchst wieder auf die Variable zuzugreifen. An diesen zweiten Prozess hast du die Variable aber gar nicht wirklich übergeben.

    Du hast zwar "-args $testvar" im Aufruf stehen, aber im Code der dann ausgeführt wird (der Inhalt von $importCmdletBlock) hast du nicht mitgeteilt wie diese Daten zu behandeln sind. Was fehlt ist einfach ein weiterer Parameterblock innerhalb des Codeblocks:

    $importCmdletBlock = { 
    param([string]$testvar )
    echo "mein"
    echo $testvar
    Start-Sleep -s 5
    exit
    }

    dann erhältst du auch:

    ~~~~~~~~~~~~~~
    test
    mein
    test

     

    Was den grundsätzlichen Zugriff auf übergebene Parameter betrifft, geht Roberts Methode auch sehr gut. Ist einfach Geschmackssache.

    Grüße, Denniver

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".






    • Als Antwort markiert Demondudi Montag, 15. August 2011 21:03
    Montag, 15. August 2011 17:59
    Moderator

Alle Antworten

  • Moin,

    wahrscheinlich kennt Denniver noch eine schönere Lösung, aber auf die Elemente, die dem Script übergeben werden, kann man über das Array $args zugreifen:

    powershell.exe -command "& C:\scripts\ext_shell.ps1 test"
    PS C:\> $args[0]
    PS C:\> test

    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    • Als Antwort markiert Demondudi Montag, 15. August 2011 21:03
    Montag, 15. August 2011 16:10
  • Also die Übergabe von "test" an $testvar aus dem initialen Aufruf des Scriptes funktioniert. Das Ergebnis ist:

    ~~~~~~~~~~~~~~
    test
    mein

    Daraufhin erzeugst du aber ja einen weiteren PowerShell-Prozess und versuchst wieder auf die Variable zuzugreifen. An diesen zweiten Prozess hast du die Variable aber gar nicht wirklich übergeben.

    Du hast zwar "-args $testvar" im Aufruf stehen, aber im Code der dann ausgeführt wird (der Inhalt von $importCmdletBlock) hast du nicht mitgeteilt wie diese Daten zu behandeln sind. Was fehlt ist einfach ein weiterer Parameterblock innerhalb des Codeblocks:

    $importCmdletBlock = { 
    param([string]$testvar )
    echo "mein"
    echo $testvar
    Start-Sleep -s 5
    exit
    }

    dann erhältst du auch:

    ~~~~~~~~~~~~~~
    test
    mein
    test

     

    Was den grundsätzlichen Zugriff auf übergebene Parameter betrifft, geht Roberts Methode auch sehr gut. Ist einfach Geschmackssache.

    Grüße, Denniver

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".






    • Als Antwort markiert Demondudi Montag, 15. August 2011 21:03
    Montag, 15. August 2011 17:59
    Moderator
  • Vielen, vielen Dank Robert und Denniver! Beide Varianten haben mir weitergeholfen!

    ---

    Viele Grüße

    Dudi

    Montag, 15. August 2011 21:03