PowerShell Das Ausführen einer Funktion innerhalb eines Skriptblocks mit Start-Process führt zu seltsamen Dingen mit doppelten Anführungszeichen

Ich habe ein PowerShell-Skript, das die Registrierung bearbeitet, sodass es als Administrator ausgeführt werden muss. Dazu starte ich einen neuen PowerShell-Prozess über mein ausgeführtes PowerShell-Skript und übergebe einen Teil des Registrierungsschlüsselpfads mithilfe eines Skriptblocks mit einer darin enthaltenen Funktion. Wenn ich in dieser Funktion doppelte Anführungszeichen verwende, versucht PowerShell, diese als Befehle und nicht als Zeichenfolge zu interpretieren. Wenn ich jedoch einfache Anführungszeichen verwende, funktioniert alles einwandfrei.

Ich habe ein kleines abgespecktes Beispiel-Powershell-Skript erstellt, das das Problem reproduziert. Hier ist der Ausschnitt:

$ScriptBlock = {
    function Test
    {
        $status = "This is a string"
        Write-Output $status
    }
}
Start-Process -FilePath PowerShell -ArgumentList "-NoExit -NoProfile -ExecutionPolicy Bypass -Command & {$ScriptBlock Test}"

Daher wird im neuen PowerShell-Prozess zuerst der Code im Skriptblock definiert und dann die Test-Methode aufgerufen. Dabei tritt der folgende Fehler auf:

Dies: Der Begriff "Dies" wird nicht als Name eines Cmdlets, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder überprüfen Sie, ob ein Pfad angegeben wurde, und versuchen Sie es erneut.

Es wird also versucht, die Zeichenfolge als Komma zu behandeln, als hätte ich gerade getipptThis is a string von selbst in einer neuen Zeile in meinem Skript.

Wenn ich die Leitung wechsle

$status = "This is a string"

zu

$status = 'This is a string'

Das Skript funktioniert wie erwartet und gibt einfach den String ausThis is a string.

Ein weiteres seltsames Problem, das mir aufgefallen ist, ist, dass ich, wenn ich keine Variable verwende, einfach Folgendes verwende:

Write-Output "This is a string"

dann gibt es jedes Wort in einer separaten Zeile aus:

Diese

ist

a

Zeichenfolge

aber wenn ich einfache Anführungszeichen wie folgt verwende:

Write-Output 'This is a string'

dann wird der gesamte Satz wie erwartet in einer Zeile ausgegeben.

Weiß jemand, warum sich PowerShell in diesen Situationen seltsam verhält?

Antworten

Wie TessellatingHeckler erwähnt, ist die Lösung, alles, was in doppelten Anführungszeichen oder einfachen Anführungszeichen steht, in Klammern zu setzen.

In meinem Beispiel würden Sie also Folgendes ändern:

$status = "This is a string"

dazu:

$status = """This is a string"""

oder dieses:

$status = '"This is a string"'

oder dieses:

$status = {"This is a string"}

Wenn Sie jedoch eine Variable in Ihrer Zeichenfolge auswerten möchten (d. H. Den Wert der Variablen sehen), müssen Sie die Methode der doppelten Anführungszeichen verwenden:

$status = """This is a string that evaluates $someVariable"""

Ich bin mir immer noch nicht sicher, ob dies ein Bug oder By Design ist, aber wir haben zumindest eine Problemumgehung, da hierdurch beide oben beschriebenen Probleme behoben werden.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage