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?

questionAnswers(3)

yourAnswerToTheQuestion