Drugi dokument zacytowany przez Petera Mortensena w jego komentarzu do odpowiedzi Codesmitha wyjaśnił mi sprawę. Ten dokument został napisany przez windowsinspired.com. Link powtórzył się: Lepszy sposób na zrozumienie cytowania i ucieczki argumentów wiersza poleceń systemu Windows .
Dalsze metody prób i błędów prowadzą do następujących wytycznych:
Ucieczka każdy podwójny cudzysłów "
z karetki ^
. Jeśli chcesz inne znaki o specjalnym znaczeniu dla powłoki poleceń systemu Windows (na przykład <
, >
, |
, &
) należy interpretować jako zwykłe znaki zamiast je następnie uciec z karetki, too.
Jeśli chcesz, aby program foo odbierał tekst wiersza poleceń "a\"b c" > d
i przekierowywał swoje dane wyjściowe do pliku out.txt , uruchom program w następujący sposób z powłoki poleceń systemu Windows:
foo ^"a\^"b c^" ^> d > out.txt
Jeśli foo interpretuje \"
jako literał podwójny cudzysłów i oczekuje, że cudzysłowy bez znaku zmiany znaczenia będą ograniczać argumenty zawierające białe znaki, to foo interpretuje polecenie jako określające jeden argument a"b c
, jeden argument >
i jeden argument d
.
Jeśli zamiast tego foo interpretuje podwójny cudzysłów ""
jako dosłowny podwójny cudzysłów, to uruchom program jako
foo ^"a^"^"b c^" ^> d > out.txt
Kluczowym wnioskiem z cytowanego dokumentu jest to, że w powłoce poleceń systemu Windows podwójny cudzysłów bez znaku zmiany znaczenia wyzwala przełączanie między dwoma możliwymi stanami.
Niektóre dalsze metody prób i błędów sugerują, że w stanie początkowym rozpoznawane jest przekierowanie (do pliku lub potoku), ^
a karetka jest usuwana z podwójnego cudzysłowu, a daszek jest usuwany z danych wejściowych. W drugim stanie przekierowanie nie jest rozpoznawane, a daszek nie jest usuwany z podwójnego cudzysłowu i nie jest usuwany. Nazwijmy te stany odpowiednio „na zewnątrz” i „wewnątrz”.
Jeśli chcesz przekierować dane wyjściowe swojego polecenia, powłoka poleceń musi znajdować się w stanie zewnętrznym, gdy osiągnie przekierowanie, więc przed przekierowaniem musi występować parzysta liczba podwójnych cudzysłowów bez znaku zmiany znaczenia (z daszkiem). foo "a\"b " > out.txt
nie zadziała - powłoka poleceń przekazuje całość "a\"b " > out.txt
do foo jako połączone argumenty wiersza poleceń, zamiast przekazywać tylko "a\"b "
i przekierowywać dane wyjściowe do out.txt .
foo "a\^"b " > out.txt
też nie zadziała, ponieważ daszek ^
jest napotkany w stanie wewnętrznym, w którym jest zwykłym znakiem, a nie znakiem ucieczki, więc "a\^"b " > out.txt
jest przekazywany do foo .
Jedynym sposobem, który (miejmy nadzieję) zawsze działa, jest utrzymywanie powłoki poleceń zawsze w stanie zewnętrznym, ponieważ wtedy działa przekierowanie.
Jeśli nie potrzebujesz przekierowania (lub innych znaków o specjalnym znaczeniu dla powłoki poleceń), możesz obejść się bez daszków. Jeśli foo interpretuje \"
jako dosłowny podwójny cudzysłów, możesz to nazwać jako
foo "a\"b c"
Następnie foo otrzymuje "a\"b c"
tekst jako połączone argumenty i może go zinterpretować jako pojedynczy argument równy a"b c
.
Teraz - wreszcie - do pierwotnego pytania. myscript '"test"'
wywołane z powłoki poleceń systemu Windows, przechodzi '"test"'
do myscript . Najwyraźniej myscript interpretuje pojedyncze i podwójne cudzysłowy jako ograniczniki argumentów i usuwa je. Musisz dowiedzieć się, co myscript akceptuje jako dosłowny podwójny cudzysłów, a następnie określić to w poleceniu, używając ^
do zmiany znaczenia wszelkich znaków, które mają specjalne znaczenie dla powłoki poleceń systemu Windows. Biorąc pod uwagę, że myscript
jest to również dostępne w \"
systemie Unix, być może załatwia sprawę. Próbować
myscript \^"test\^"
lub, jeśli nie potrzebujesz przekierowania,
myscript \"test\"
myscript \"test\"