Wie übergebe ich ein buchstäbliches Anführungszeichen von PowerShell an einen nativen Befehl?

Ich möchte ein String-Literal in AWK / gawk über die PowerShell-Befehlszeile drucken (das jeweilige Programm ist unwichtig). Ich glaube jedoch, dass ich die Anführungszeichen-Regeln irgendwo auf der ganzen Linie falsch verstehe - PowerShell entfernt anscheinend doppelte Anführungszeichen in einfachen Anführungszeichen für native Befehle, aber nicht, wenn sie an Commandlets übergeben werden.

Das funktioniert in Bash:

bash$ awk 'BEGIN {print "hello"}'
hello    <-- GOOD

Und das funktioniert in PowerShell - aber wichtigIch habe keine Ahnung, warum die Flucht notwendig ist:

PS> awk 'BEGIN {print \"hello\"}'
hello    <-- GOOD

In PowerShell wird nichts gedruckt:

PS> awk 'BEGIN {print "hello"}'
    <-- NOTHING IS BAD

Wenn dies in PowerShell wirklich der einzige Weg ist, dies zu tun, würde ich gerne die Kette von Anführungszeichen verstehen, die erklärt, warum. Gemäß den PowerShell-Zitierregeln unterÜber AngebotsregelnDies sollte nicht notwendig sein.

LÖSUNG BEGINNEN

Die Pointe, mit freundlicher Genehmigung von Duncan, lautet, dass Sie diese Funktion zu Ihrem PowerShell-Profil hinzufügen sollten:

 filter Run-Native($command) { $_ | & $command ($args -replace'(\\*)"','Das funktioniert in Bash:1\"') }

Oder speziell für AWK:

 filter awk { $_ | gawk.exe ($args -replace'(\\*)"','Das funktioniert in Bash:1\"') }

END LÖSUNG

Die Anführungszeichen werden ordnungsgemäß an das PowerShell-Echo übergeben:

PS> echo '"hello"'
"hello"    <-- GOOD

Wenn Sie jedoch ein externes "natives" Programm aufrufen, verschwinden die Anführungszeichen:

PS> c:\cygwin\bin\echo.exe '"hello"'
hello    <-- BAD, POWERSHELL REMOVED THE QUOTES

Hier ist ein noch übersichtlicheres Beispiel, falls Sie befürchten, dass Cygwin etwas damit zu tun haben könnte:

echo @"
>>> // program guaranteed not to interfere with command line parsing
>>> public class Program
>>> {
>>>    public static void Main(string[] args)
>>>    {
>>>       System.Console.WriteLine(args[0]);
>>>    }
>>> }
>>> "@ > Program.cs
csc.exe Program.cs
.\Program.exe '"hello"'
hello    <-- BAD, POWERSHELL REMOVED THE QUOTES

VERRINGERTES BEISPIEL für die Übergabe an cmd, das seine eigene Analyse durchführt (siehe Etans Kommentar unten):

PS> cmd /c 'echo "hello"'
"hello"     <-- GOOD

VERRINGERTES BEISPIEL für die Übergabe an Bash, das seine eigene Analyse durchführt (siehe Etans Kommentar unten):

PS> bash -c 'echo "hello"'
hello    <-- BAD, WHERE DID THE QUOTES GO

Irgendwelche Lösungen, elegantere Problemumgehungen oder Erklärungen?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage