2015-11-16 12 views
5

Quando si utilizza il simbolo^per immettere un comando multilinea con argomenti quando si utilizzano le virgolette doppie per utilizzare stringhe con spazi viene anche passato il simbolo ^, qualcuno può spiegare in che modo?Comando multiline file batch con virgolette

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 assomiglia

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

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

) 

pause 

l'errore che ottengo sembrare

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

Pensa per aver cercato nell'esempio di cui sopra ho spazi aggiuntivi di fronte delle virgolette doppie l'originale non sembrava risolvere il mio problema – Mazaka

+0

Fallisce, come le virgolette sono sfuggite e quindi gli spazi possono dividere il filena mes in small parts – jeb

+0

"dubble" è la mia nuova parola preferita. –

risposta

5

La regola accento circonflesso:

Un accento circonflesso sfugge il carattere successivo, in modo che il personaggio perde tutto effetti speciali.
Se il carattere successivo è un linefeed rilascia questo e prende il carattere successivo (anche quando questo è anche un avanzamento di riga).

Con questa semplice regola si può spiegare le cose come

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

setlocal EnableDelayedExpansion 
set linefeed=^ 


echo #4 line1!linefeed!line2 

#3 crea un file chiamato "gatto cane", come lo spazio è stato fuggì e non funziona come delimitatore più.

Ma è ancora possibile rompere questa regola!
È sufficiente inserire qualsiasi reindirizzamento proprio di fronte al punto di inserimento, ma continua a eliminare il linefeed (la multilinea funziona ancora), ma il carattere successivo non viene più sfuggito.

echo #5 Line1< nul^
& echo Line2 

Così si potrebbe anche usare questo per costruire il vostro comando multilinea

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

o utilizzando un macro

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

Dopo aver provato alcune cose diverse, sono riuscito a farlo funzionare con solo uno spazio extra davanti alle doppie virgolette. Modifiche notworking.cmd al seguente lavorato

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

nota gli spazi davanti alle virgolette

+0

notepad ++ dice che le mie terminazioni di linea sono CR-LF quando visualizzo-> simboli-> mostra tutti i caratteri quindi non sono ancora sicuro del motivo per cui gli spazi mi hanno aiutato – Mazaka

+0

Oh, infatti, posso riprodurlo. Il fatto è che non ho mai nemmeno pensato di usare le linee di continuazione senza indentarle (di solito con una TAB) ... – wOxxOm

+0

Grazie per il feed back ha risolto il mio problema. – Mazaka