2015-11-16 24 views
5

Wenn Sie das^-Symbol verwenden, um einen mehrzeiligen Befehl mit Argumenten einzugeben, wenn Sie doppelte Anführungszeichen benutzen, um Zeichenfolgen mit Leerzeichen zu verwenden, wird auch das^-Symbol weitergegeben.Batch-Datei mehrzeiliger Befehl mit doppelten Anführungszeichen

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 wie

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

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

) 

pause 
sieht

die Fehler, die ich wie

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

für im Beispiel versucht, denkt, dass bauen oben i vor zusätzlichen Leerzeichen haben von den doppelten Anführungszeichen das Original schien es nicht mein Problem zu beheben – Mazaka

+0

Es schlägt fehl, da die Anführungszeichen geflüchtet sind und daher die Räume die Filena teilen können mes in kleinere Teile – jeb

+0

"Dubble" ist mein neues Lieblingswort. –

Antwort

5

Die caret Regel:

A caret entweicht das nächste Zeichen, so dass der Charakter alles verliert Spezialeffekte.
Wenn das nächste Zeichen ein Zeilenvorschub ist, löschen Sie dieses und nehmen Sie das nächste Zeichen (auch wenn dies auch ein Zeilenvorschub ist).

Mit dieser einfachen Regel, die Sie Dinge wie

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

setlocal EnableDelayedExpansion 
set linefeed=^ 


echo #4 line1!linefeed!line2 

#3 erstellt eine Datei mit dem Namen „Cat Dog“, wie der Raum entkommen war erklären können und funktioniert nicht als Trennzeichen mehr.

Aber es ist immer noch möglich, diese Regel zu brechen!
Sie müssen nur jede Umleitung direkt vor dem Caret platzieren, es lässt immer noch den Zeilenvorschub fallen (Multiline funktioniert noch), aber das nächste Zeichen ist nicht mehr maskiert.

echo #5 Line1< nul^
& echo Line2 

So könnte man auch so Ihre mehrzeiligen Befehl

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

oder mit einem 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

Nachdem ich verschiedene Dinge ausprobiert hatte, schaffte ich es, mit nur einem zusätzlichen Leerzeichen vor den Anführungszeichen zu arbeiten. Änderungen notworking.cmd die folgenden arbeiteten

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

Notiz, die Räume vor den doppelten Anführungszeichen

+0

notepad ++ sagt meine Zeilenenden sind CR-LF, wenn ich zeige-> Symbole-> zeige alle Zeichen so noch nicht sicher, warum die Leerzeichen mir geholfen haben – Mazaka

+0

Oh, tatsächlich kann ich reproduzieren. Die Sache ist, dass ich nie daran gedacht habe, die Fortsetzungszeilen zu verwenden, ohne sie einzudrücken (normalerweise mit einem TAB) ... – wOxxOm

+0

Danke für deine Rückmeldung, das hat mein Problem gelöst. – Mazaka

Verwandte Themen