PowerShell - Invoke-Command in neuem PowerShell-Fenster ausführen und Variablenname übergeben, ohne diesen zu expandieren
Hi,
wie der Titel schon sagt, will ich mit Invoke-Command auf einem anderen Computer einen ScriptBlock ausführen lassen. Das funktioniert auch soweit. Nun will ich diesen Block aber in einem separaten PowerShell-Fenster ausführen. Und da komme ich gerade nicht weiter.
Mit
bekomme ich die Ausgabe des Remote-Servernamens
Mit
Gibt er mir in neuem Fenster "Hallo Welt!" aus.
Prima. Aber wir bekomme ich das jetzt zusammen?
Dieser Versuch
liefert mir im neuen Fenster den Namen des lokalen Rechners, nicht den des entfernten Rechners, wie gewünscht. Weil er die Variable erst expandiert und dann das Kommando als Argument an Start-Process übergibt. Schon klar.
Nur, wie muss ich das nun anstellen, wenn ich einen Variablennamen ohne Expansion übergeben will?
E.
wie der Titel schon sagt, will ich mit Invoke-Command auf einem anderen Computer einen ScriptBlock ausführen lassen. Das funktioniert auch soweit. Nun will ich diesen Block aber in einem separaten PowerShell-Fenster ausführen. Und da komme ich gerade nicht weiter.
Mit
Invoke-Command -ComputerName 'Server1' -ScriptBlock {
Write-Host "$env:ComputerName"
}
Server1
Mit
Start-Process powershell.exe -argument "-NoExit -Command ""
Write-Host ""Hallo Welt!""
""
"
Prima. Aber wir bekomme ich das jetzt zusammen?
Dieser Versuch
Start-Process powershell.exe -argument "-NoExit -Command ""
Invoke-Command -ComputerName 'Server1' -ScriptBlock {
Write-Host '$env:ComputerName'
}
""
"
Nur, wie muss ich das nun anstellen, wenn ich einen Variablennamen ohne Expansion übergeben will?
E.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 564895
Url: https://administrator.de/forum/powershell-invoke-command-in-neuem-powershell-fenster-ausfuehren-und-variablenname-uebergeben-ohne-diesen-zu-564895.html
Ausgedruckt am: 31.03.2025 um 15:03 Uhr
12 Kommentare
Neuester Kommentar
Moin,
Gruß Thomas
Zitat von @emeriks:
Dieser Versuch
liefert mir im neuen Fenster den Namen des lokalen Rechners, nicht den des entfernten Rechners, wie gewünscht. Weil er die Variable erst expandiert und dann das Kommando als Argument an Start-Process übergibt. Schon klar.
Nur, wie muss ich das nun anstellen, wenn ich einen Variablennamen ohne Expansion übergeben will?
Wie wäre es denn damit:Dieser Versuch
Start-Process powershell.exe -argument "-NoExit -Command ""
Invoke-Command -ComputerName 'Server1' -ScriptBlock {
Write-Host '$env:ComputerName'
}
""
"
Nur, wie muss ich das nun anstellen, wenn ich einen Variablennamen ohne Expansion übergeben will?
Start-Process powershell.exe -argument "-NoExit -Command ""
Invoke-Command -ComputerName 'Server1' -ScriptBlock {
Write-Host $('$env:ComputerName')
}
""
"
Gruß Thomas

start powershell -ArgumentList "-NoExit -Command `"invoke-command -ComputerName Server1 -ScriptBlock {`$env:Computername}`""
Erst wenn ich den ScriptBlock ändere, dann geht das. Das will ich eigentlich vermeiden.
oder auch$scriptblock = {
$env:Computername
}
start powershell -ArgumentList "-NoExit -Command `"invoke-command -ComputerName Server1 -ScriptBlock $($scriptblock.StartPosition.Content)`""
Zitat von @emeriks:
Aber verstehen tue ich das immer noch nicht ganz.
...
Nur in der Combi geht das dann nicht, egal wie ich in "" setze.
Das Problem ist folgendes: Wenn du einen Scriptblock in curly Brackets postest wie hierAber verstehen tue ich das immer noch nicht ganz.
...
Nur in der Combi geht das dann nicht, egal wie ich in "" setze.
Invoke-Command -ComputerName 'Server1' -ScriptBlock {
Write-Host "$($env:ComputerName): Hallo Welt"
}
Und Variablen in Double-Quotes werden dann halt interpretiert.
Zitat von @emeriks:
Das bekomme ich auch nicht auf die Reihe. Wie muss ich hier das "$A" verpacken, damit er das 1:1 übergibt, ohne es zu expandieren?
Auf die selbe Art und Weise Das bekomme ich auch nicht auf die Reihe. Wie muss ich hier das "$A" verpacken, damit er das 1:1 übergibt, ohne es zu expandieren?
Start-Process powershell.exe -argument "-NoExit -Command ""
Invoke-Command -ComputerName 'Server1' -ScriptBlock {
$('$A') = 1
Write-Host $('$A')
}
""
"
Edit: Eine weitere, gerade bei sehr vielen Variablen vielleicht deutlich einfachere Möglichkeit wäre, einfach den kompletten Scriptblock in $('') zu setzen, dann kannst du innerhalb wie gewohnt fortfahren
Start-Process powershell.exe -argument "-NoExit -Command ""
Invoke-Command -ComputerName 'Server1' -ScriptBlock $('{
$A = 1
Write-Host $A
}')
""
"

Zitat von @emeriks:
Das bekomme ich auch nicht auf die Reihe. Wie muss ich hier das "$A" verpacken, damit er das 1:1 übergibt, ohne es zu expandieren?
Siehe mein Kommentar oben, dann ist auch keine Anpassung nötig, den Skriptblock selbst einfach nur als String übergeben (inkl. geschweifter Klammern)...Das bekomme ich auch nicht auf die Reihe. Wie muss ich hier das "$A" verpacken, damit er das 1:1 übergibt, ohne es zu expandieren?

Sieh dir das oben nochmal genau an, du darfst den kompletten originalen Skriptblock nicht expandieren lassen sondern ihn nur als reinen String übergeben, du führst ihn mit der Subexpression ja bereits aus, deswegen kommt es zu den Fehlern...