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?