Jak przekazać dosłowny cytat z PowerShell do polecenia natywnego?
Chciałbym wydrukować literał łańcuchowy w AWK / gawk za pomocą wiersza poleceń PowerShell (określony program jest nieważny). Jednak myślę, że źle rozumiem zasady cytowania gdzieś wzdłuż linii - PowerShell najwyraźniej usuwa podwójne cudzysłowy w pojedynczych cudzysłowach dla poleceń natywnych, ale nie podczas przekazywania ich do poleceń.
To działa w Bash:
bash$ awk 'BEGIN {print "hello"}'
hello <-- GOOD
I to działa w PowerShell - ale co ważneNie mam pojęcia, dlaczego ucieczka jest potrzebna:
PS> awk 'BEGIN {print \"hello\"}'
hello <-- GOOD
To nie wyświetla niczego w PowerShell:
PS> awk 'BEGIN {print "hello"}'
<-- NOTHING IS BAD
Jeśli to naprawdę jest jedyny sposób na zrobienie tego w PowerShell, to chciałbym zrozumieć łańcuch reguł cytowania, który wyjaśnia dlaczego. Zgodnie z zasadami cytowania PowerShell na stronieO zasadach cytowania, to nie powinno być konieczne.
ROZPOCZNIJ ROZWIĄZANIE
Punktem wyjścia, dzięki uprzejmości Duncana poniżej, jest dodanie tej funkcji do profilu PowerShell:
filter Run-Native($command) { $_ | & $command ($args -replace'(\\*)"','To działa w Bash:1\"') }
Lub specjalnie dla AWK:
filter awk { $_ | gawk.exe ($args -replace'(\\*)"','To działa w Bash:1\"') }
ROZWIĄZANIE KOŃCOWE
Cytaty są poprawnie przekazywane do echa PowerShell:
PS> echo '"hello"'
"hello" <-- GOOD
Ale gdy dzwonisz do zewnętrznego programu „rodzimego”, cytaty znikają:
PS> c:\cygwin\bin\echo.exe '"hello"'
hello <-- BAD, POWERSHELL REMOVED THE QUOTES
Oto jeszcze czystszy przykład, na wypadek gdybyś obawiał się, że Cygwin może mieć z tym coś wspólnego:
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
PRZYKRYTY PRZYKŁAD do przekazywania do cmd, który wykonuje własne parsowanie (patrz komentarz Etana poniżej):
PS> cmd /c 'echo "hello"'
"hello" <-- GOOD
PRZYKRYTY PRZYKŁAD do przejścia do Basha, który wykonuje własne parsowanie (patrz komentarz Etana poniżej):
PS> bash -c 'echo "hello"'
hello <-- BAD, WHERE DID THE QUOTES GO
Wszelkie rozwiązania, bardziej eleganckie rozwiązania lub wyjaśnienia?