W Uniksie mogłem biegać myscript '"test"'
i dostałem "test"
.
W Windows cmd
dostaję 'test'
.
Jak mogę przekazać cudzysłowy jako parametr? Chciałbym wiedzieć, jak to zrobić ręcznie z cmd
okna, aby nie musieć pisać programu do testowania mojego programu.
myscript \"test\"
Odpowiedzi:
Nie mogę szybko odtworzyć objawów: jeśli spróbuję
myscript '"test"'
z plikiem wsadowymmyscript.bat
zawierającym tylko@echo.%1
lub nawet@echo.%~1
, otrzymuję wszystkie cytaty:'"test"'
Być może możesz wypróbować postać ucieczki w
^
ten sposóbmyscript '^"test^"'
:?źródło
wscript
wina! Zostaw to Windowsowi :)cmd
.Innym sposobem na uniknięcie cudzysłowów (choć prawdopodobnie nie jest to preferowane), którego używam w niektórych miejscach, jest użycie wielu cudzysłowów podwójnych . W celu uczynienia kodu innych osób czytelnym, wyjaśnię.
Oto zestaw podstawowych zasad:
program param1 param2 param 3
przechodzą cztery parametryprogram.exe
:param1
,param2
,param
i3
.program one two "three and more"
przechodzą trzy parametryprogram.exe
:one
,two
, ithree and more
.hello"to the entire"world
działa jako jednego parametru:helloto the entireworld
."Tim says, ""Hi!"""
będzie działał jako jeden parametr:Tim says, "Hi!"
W związku z tym istnieją trzy różne typy cudzysłowów: cudzysłowy, które otwierają się, cudzysłowy zamykające i cudzysłowy, które działają jak zwykły tekst.
Oto podział ostatniej mylącej linii:
W ten sposób tekst efektywnie łączy cztery grupy znaków (jednak jedna z niczym):
Tim says,
jest pierwsza, zawijana, aby uniknąć spacji,"Hi!
druga, nie zawijana (nie ma spacji),trzecia, grupa w podwójnym cudzysłowie nie zawijająca nic
"
to czwarty, nieopakowany zamknięty cytat.Jak widać, zawijanie grupy w podwójny cudzysłów nie jest nadal konieczne, ponieważ bez niego następujący podwójny cudzysłów otworzyłby grupę w podwójnych cudzysłowach zamiast działać jako zwykły tekst.
Na tej podstawie powinno być rozpoznawalne, że w związku z tym, wewnątrz i na zewnątrz cudzysłowu, trzy podwójne cudzysłowy działają jak zwykły podwójny cudzysłów bez znaku zmiany znaczenia:
wydrukuje się
Tim said to him, "What's been happening lately?"
zgodnie z oczekiwaniami. Dlatego zawsze można niezawodnie użyć trzech cytatów jako ucieczki.Jednak rozumiejąc to, możesz zauważyć, że cztery cudzysłowy na końcu można zredukować do zaledwie dwóch, ponieważ technicznie rzecz biorąc, dodaje to kolejną niepotrzebną pustą grupę w podwójnych cudzysłowach.
Oto kilka przykładów, aby go zamknąć:
Uwaga końcowa: nie przeczytałem tego wszystkiego z żadnego tutoriala - wymyśliłem to wszystko eksperymentując. Dlatego moje wyjaśnienie może nie być prawdziwe wewnętrznie. Niemniej jednak wszystkie powyższe przykłady oceniają jako podane, potwierdzając w ten sposób (ale nie potwierdzając) moją teorię.
Przetestowałem to na Windows 7, 64-bitowym, używając tylko wywołań * .exe z przekazywaniem parametrów (nie * .bat, ale przypuszczam, że działa tak samo).
źródło
Spróbuj tego:
„„ ucieczka do pojedynczego ”w parametrze.
źródło
myscript """test test"""
i nie działa (pierwszy parametr jest"test
podawany jako . Właściwie potrzebujesz trzech cudzysłowów:myscript """"test test""
Trzeci cytat na końcu można jednak pominąć.char **argv
z mojego programu uruchamiającego C do innego procesu przy użyciu funkcji takich jakspawn
lubexec
. Dziękuję Ci. :-)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: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 argumenta"b c
, jeden argument>
i jeden argumentd
.Jeśli zamiast tego foo interpretuje podwójny cudzysłów
""
jako dosłowny podwójny cudzysłów, to uruchom program jakoKluczowym 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ć jakoNastępnie foo otrzymuje
"a\"b c"
tekst jako połączone argumenty i może go zinterpretować jako pojedynczy argument równya"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ę, żemyscript
jest to również dostępne w\"
systemie Unix, być może załatwia sprawę. Próbowaćlub, jeśli nie potrzebujesz przekierowania,
źródło
Wzywam PowerShell z cmd i przekazuję cudzysłowy, a żaden z nich nie działa. Poważny akcent pomógł uniknąć podwójnych cudzysłowów na tym Win 10 Surface Pro.
Poniżej znajdują się wyniki, które otrzymałem dla innych znaków, aby uniknąć podwójnego cudzysłowu:
Użycie innego cudzysłowu do zmiany cytatu skutkowało brakiem cudzysłowów. Jak widać, same znaki zostały wpisane, ale nie uniknęły podwójnych cudzysłowów.
źródło