2015-11-16 30 views
5

Podczas używania symbolu^do wpisania polecenia wielowierszowego z argumentami przy użyciu podwójnych cudzysłowów do użycia ciągów ze spacjami, znak^jest również przekazywany, czy ktoś może wyjaśnić, jak to jest?Polecenie wielowierszowe pliku wsadowego z podwójnymi cudzysłowami

working.cmd

@echo off 
call openfiles.cmd^
C:\dir\filename.txt^
C:\another_dir\another_file.txt 

notworking.cmd

@echo off 
call openfiles.cmd^
"C:\dir with spaces\file with spaces.txt"^
"C:\another dir with spaces\another file with spaces.txt" 

openfiles.cmd wygląda

@echo off 
for %%x in (%*) do (

    IF EXIST %%x (
     call "c:\Program Files\Notepad++\notepad++.exe" %%x 
    ) ELSE (
     call echo Not found %%x 
    ) 

) 

pause 

błąd pojawia się wyglądać

C:\>call openfiles.cmd "C:\dir with spaces\file with spaces.txt"^
ELSE was unexpected at this time. 
+0

Myśli za próbę w powyższym przykładzie mam dodatkowe spacje z przodu podwójnych cudzysłowów oryginał nie poprawił mojego problemu – Mazaka

+0

Zawodzi, ponieważ cytaty są wymykane i dlatego spacje mogą rozdzielać fileny mes na mniejsze części – jeb

+0

"dubble" to moje nowe ulubione słowo. –

Odpowiedz

5

Reguła daszek:

daszka ucieka następnego znaku, tak że postać traci wszystko efekty specjalne.
Jeśli następny znak jest wierszem, upuść go i pobierz następny znak (nawet jeśli jest to również wiersz).

Dzięki tej prostej zasady można wytłumaczyć takie rzeczy jak

echo #1 Cat^&Dog 
echo #2 Cat^ 
&Dog 
echo #3 Redirect to > Cat^ 
Dog 

setlocal EnableDelayedExpansion 
set linefeed=^ 


echo #4 line1!linefeed!line2 

#3 tworzy plik o nazwie „Cat Dog” jako przestrzeń była uciekł i nie działa jako ogranicznik więcej.

Ale wciąż można złamać tę zasadę! Musisz tylko wprowadzić przekierowanie tuż przed karetą, nadal spada linia (nadal działa multilinia), ale następny znak nie jest już uciekł.

echo #5 Line1< nul^
& echo Line2 

Więc można również wykorzystać do zbudowania Twojego polecenia wielowierszowego

call openfiles.cmd < nul^
"C:\dir with spaces\file with spaces.txt" < nul^
"C:\another dir with spaces\another file with spaces.txt" 

lub za pomocą makro

set "\n=< nul ^" 
call openfiles.cmd %\n% 
"C:\dir with spaces\file with spaces.txt" %\n% 
"C:\another dir with spaces\another file with spaces.txt" 
1

Po wypróbowaniu różnych rzeczy udało mi się przekonać go do pracy z dodatkową przestrzenią przed podwójnym cudzysłowem. Zmiany notworking.cmd do następujących pracował

@echo off 
call openfiles.cmd^
"C:\dir with spaces\file with spaces.txt"^
"C:\another dir with spaces\another file with spaces.txt" 

zanotować spacji przed cudzysłowach

+0

Notatnik ++ mówi, że moje zakończenia linii to CR-LF, gdy robię widok-> symbole-> pokaż wszystkie znaki charytatywne, więc wciąż nie jestem pewien, dlaczego te przestrzenie mi pomogły. – Mazaka

+0

Och, istotnie, mogę się rozmnażać. Chodzi o to, że nigdy nawet nie pomyślałem o korzystaniu z linii kontynuacji bez wcięcia ich (zwykle z TAB) ... – wOxxOm

+0

Dzięki za Twój zwrot, to rozwiązało mój problem. – Mazaka

Powiązane problemy