beta-way-of-life
Goto Top

Powershell: String in andere Session übergeben

Hallo Leute,

ich versuche eine Variable in eine zweite Session zu übergeben.

Grund ist folgender:

Für eine Fortschrittsanzeige wird eine neue Powershell Session erstellt.

Ich versuche einen String zu übergeben und diesen dann als Befehl auszuführen.
 $a = "wbadmin blablabla"  
Nun wird eine neue Session erzeugt und ich versuche den String $a auszuführen.
Start-Progress {Invoke-Expression -Command $a}
Dies klappt natürlich nicht weil die Variable $a nicht existiert bzw. leer ist.....
Ich würde gerne wissen wie/ob ich das zum laufen bringe. ;)

Hier noch der Code zum erzeugen der neuen Session:
function Start-Progress {
  param(
    [ScriptBlock]
    $code
  )
  
  $newPowerShell = [PowerShell]::Create().AddScript($code)
  $handle = $newPowerShell.BeginInvoke()
  
  while ($handle.IsCompleted -eq $false) {
    Write-Host '.' -NoNewline  
    Start-Sleep -Milliseconds 500
  }
  
  Write-Host ''  
  
  $newPowerShell.EndInvoke($handle)
  
  $newPowerShell.Runspace.Close()
  $newPowerShell.Dispose()
}
Ich hoffe das ist einigermaßen verständlich.
Vielleicht hat jemand eine Idee.

LG Joe

Content-ID: 219418

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

Ausgedruckt am: 22.11.2024 um 17:11 Uhr

colinardo
colinardo 15.10.2013 aktualisiert um 13:52:36 Uhr
Goto Top
Hallo Joe,
mach den Aufruf der function doch einfach so, dann klappt 's bei meinen Tests
Start-Progress -code $a
Grüße Uwe
beta-way-of-life
beta-way-of-life 15.10.2013 um 14:11:38 Uhr
Goto Top
Zitat von @colinardo:
Hallo Joe,
mach den Aufruf der function doch einfach so, dann klappt 's bei meinen Tests
> Start-Progress -code $a
> 
Grüße Uwe

Hallo,

danke, aber wie bekomm ich so die Invoke-Expression hin?

Lg
colinardo
colinardo 15.10.2013 um 14:15:11 Uhr
Goto Top
brauchst du doch nicht. Der Befehl wird doch direkt als String an AddScript($code) übergeben und als Befehl interpretiert.
Das wäre doch doppelt gemoppelt.

Grüße Uwe
beta-way-of-life
beta-way-of-life 15.10.2013 um 14:20:03 Uhr
Goto Top
Zitat von @colinardo:
brauchst du doch nicht. Der Befehl wird doch direkt als String an AddScript($code) übergeben und als Befehl
interpretiert.
Das wäre doch doppelt gemoppelt.

Grüße Uwe

Hab ich versucht, aber ich scheine zu blöd zu sein... ;)

$wbadminbefehl = "wbadmin start backup -backuptarget:$verzeichnis -include:$volumes -vssfull -allCritical -quiet >> $log"  
Start-Progress -code $wbadminbefehl

Ergibt:

Start-Progress : Die Argumenttransformation für den Parameter "code" kann nicht verarbeitet werden. Der Wert "wbadmin start backup   
-backuptarget:\\backup01\backup\joe\2013-10-15_14-17_joe01_windows-sicherung -include:C: -vssfull -allCritical -quiet >> 
\\backup01\backup\joe\2013-10-15_14-17_joe01_windows-sicherung\windows-sicherung.log" vom Typ "System.String" kann nicht in den Typ "System.Management.Automation.ScriptBlock"   
konvertiert werden.
In C:\Scripts\windows-sicherung-flexibel.ps1:222 Zeichen:38
+                 Start-Progress -code $wbadminbefehl
+                                      ~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Start-Progress], ParameterBindingArgumentTransformationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,Start-Progress
colinardo
colinardo 15.10.2013 aktualisiert um 14:32:53 Uhr
Goto Top
ach OK ich seh den Fehler, du hast den Parameter $code als Typ [ScriptBlock] definiert, dann musst du um den eigentlichen Befehl geschweifte Klammern setzen anstatt Anführungszeichen.
$wbadminbefehl = {wbadmin start backup -backuptarget:$verzeichnis -include:$volumes -vssfull -allCritical -quiet >> $log}
Start-Progress -code $wbadminbefehl

oder als Alternative in deiner Function das [ScriptBlock] entfernen, dann kannst du die Variable mit Anführungszeichen verwenden.

Grüße Uwe
beta-way-of-life
beta-way-of-life 15.10.2013 aktualisiert um 15:00:50 Uhr
Goto Top
Danke, jetzt ist der Fehler weg.
Funktionieren tuts trotzdem nicht.... Jetzt wird gar kein wbadmin mehr gestartet.

            if ($tempcopy -eq $true) {
                wbadmin start backup -backuptarget:$tempcopyverzeichnis -include:$volumes -vssfull -allCritical -quiet >> $log
            }
            elseif ($tempcopy -eq $false) {
                $wbadminbefehl = {wbadmin start backup -backuptarget:$verzeichnis -include:$volumes -vssfull -allCritical -quiet >> $log}
                Start-Progress -code $wbadminbefehl
                #wbadmin start backup -backuptarget:$verzeichnis -include:$volumes -vssfull -allCritical -quiet >> $log
            }
            else {
                echo Ungültiger tempcopy Wert! >> $log
            }

Mit dem Auskommentierten Befehl funktionierts Problemlos.... So leider nicht. Wird einfach übersprungen.
colinardo
colinardo 15.10.2013 aktualisiert um 15:33:00 Uhr
Goto Top
Die Variablen im Script-Block werden nicht aufgelöst, da müsstest du diese vorher mit Scope definieren. Am einfachsten machst du es wie ich oben als Alternative geschrieben habe :
[ScriptBlock] aus der Function entfernen und den Befehl nur in Anführungszeichen setzen.
function Start-Progress {
  param(
    $code
  )
  ...
....
...
}

$wbadminbefehl = "wbadmin start backup -backuptarget:$verzeichnis -include:$volumes -vssfull -allCritical -quiet >> $log"  
Start-Progress -code $wbadminbefehl
...oder als weitere Option via [ScriptBlock]::Create("deinBefehl") definieren
function Start-Progress {
  param(
    [ScriptBlock] $code
  )
  
 ....
....
}

$wbadminbefehl = [ScriptBlock]::Create("wbadmin start backup -backuptarget:$verzeichnis -include:$volumes -vssfull -allCritical -quiet >> $log")  
Start-Progress -code $wbadminbefehl

Grüße Uwe
beta-way-of-life
beta-way-of-life 15.10.2013 um 15:43:38 Uhr
Goto Top
Bestens, jetzt läuft es.
Vielen Dank. face-smile