Split long commands in multiple lines through Windows batch file2008-09-16 batch-file
How can I split long commands over multiple lines in a batch file?
You can break up long lines with the caret
^ as long as you remember that the caret and the newline following it are completely removed. So, if there should be a space where you're breaking the line, include a space. (More on that below.)
copy file1.txt file2.txt
would be written as:
copy file1.txt^ file2.txt
The rule for the caret is:
A caret at the line end, appends the next line, the first character of the appended line will be escaped.
You can use the caret multiple times, but the complete line must not exceed the maximum line length of ~8192 characters (Windows XP, Windows Vista, and Windows 7).
echo Test1 echo one ^ two ^ three ^ four^ * --- Output --- Test1 one two three four* echo Test2 echo one & echo two --- Output --- Test2 one two echo Test3 echo one & ^ echo two --- Output --- Test3 one two echo Test4 echo one ^ & echo two --- Output --- Test4 one & echo two
To suppress the escaping of the next character you can use a redirection.
The redirection has to be just before the caret. But there exist one curiosity with redirection before the caret.
If you place a token at the caret the token is removed.
echo Test5 echo one <nul ^ & echo two --- Output --- Test5 one two echo Test6 echo one <nul ThisTokenIsLost^ & echo two --- Output --- Test6 one two
And it is also possible to embed line feeds into the string:
setlocal EnableDelayedExpansion set text=This creates ^ a line feed echo Test7: %text% echo Test8: !text! --- Output --- Test7: This creates Test8: This creates a line feed
The empty line is important for the success. This works only with delayed expansion, else the rest of the line is ignored after the line feed.
It works, because the caret at the line end ignores the next line feed and escapes the next character, even if the next character is also a line feed (carriage returns are always ignored in this phase).
(This is basically a rewrite of Wayne's answer but with the confusion around the caret cleared up. So I've posted it as a CW. I'm not shy about editing answers, but completely rewriting them seems inappropriate.)
You can break up long lines with the caret (
^), just remember that the caret and the newline that follows it are removed entirely from the command, so if you put it where a space would be required (such as between parameters), be sure to include the space as well (either before the
^, or at the beginning of the next line — that latter choice may help make it clearer it's a continuation).
Examples: (all tested on Windows XP and Windows 7)
xcopy file1.txt file2.txt
can be written as:
xcopy^ file1.txt^ file2.txt
xcopy ^ file1.txt ^ file2.txt
xc^ opy ^ file1.txt ^ file2.txt
(That last works because there are no spaces betwen the
xc and the
^, and no spaces at the beginning of the next line. So when you remove the
^ and the newline, you get...
For readability and sanity, it's probably best breaking only between parameters (be sure to include the space).
Be sure that the
^ is not the last thing in a batch file, as there appears to be a major issue with that.
It seems however that splitting in the middle of the values of a for loop doesn't need a caret(and actually trying to use one will be considered a syntax error). For example,
for %n in (hello bye) do echo %n
Note that no space is even needed after hello or before bye.
Multiple commands can be put in parenthesis and spread over numerous lines; so something like
echo hi && echo hello can be put like this:
( echo hi echo hello )
Also variables can help:
set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE" if exist %AFILEPATH% ( start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING... ) else ( ...
Also I noticed with carets (
^) that the
if conditionals liked them to follow only if a space was present:
if exist ^
- Displaying Windows command prompt output and redirecting it to a file
- How can I pass arguments to a batch file?
- How can I echo a newline in a batch file?
- How can you find and replace text in a file using the Windows command-line environment?
- How do I run two commands in one line in Windows CMD?
- What is the current directory in a batch file?
- Batch file to delete files older than N days
- How to prevent auto-closing of console after the execution of batch file