Batch file creating another batch file, how to ignore commands when writing lines?
batch-file, echo, symbols, text
Solution
All special characters like `^` `&` `|` `<` `>` must be escaped as `^^` `^&` `^|` `^<` `^>` or else enclosed in quotes.
Every percent must be doubled always. For example:
- `"%1"` becomes `"%%1"`
- `%newest%` becomes `%%newest%%`
- `%%a` becomes `%%%%a`
You don't need to clear the output file and redirect each line if you put parentheses around all the ECHO statements. Right parentheses must also be escaped if doing this.
>GenerateEmail.bat (
echo Line 1
echo Line 2
echo these must be escaped ^^ ^& ^| ^> ^< ^), these not "^ & | > < )"
)
The rules become more complicated if you have delayed expansion enabled and you have output that includes `!`, or `!` with `^`.
There are other methods that avoid having to figure out how to escape special characters and double up percents.
You can prefix each line with `:::` and use FOR /F with FINDSTR to get the desired output. Make sure delayed expansion is off if your output contains `!`. The only restriction with the code below is your output line cannot begin with `:` (it can begin with a space, followed by `:`).
(for /f "tokens=* delims=:" %%L in ('findstr /b ::: "%~f0"') do echo %%L) >GenerateEmail.bat
:::echo special chars & | < > don't need to be escaped
:::echo % does not need to be doubled
::: :Label
::: :: Comment and label must be indented with at least one space
:::etc
Another option is to use one of the techniques found at:
- Echo the contents of a paragraph into a file without any modifications to the paragraph?
- printing a paragraph in windows batch
Problem
having a bit of trouble with a windows batch file I'm writing. I need the batch file to write some particular lines to another batch file, the method I have been using is: ``` type NUL > batchfile.bat ECHO texttobewrittentofile >> batchfile.bat ECHO texttobewrittentofile >> batchfile.bat ECHO texttobewrittentofile >> batchfile.bat ... etc ``` Most of the lines write fine, there are a few different problems I'm having with my batch file writing to another batch file though. The code for my batch file to write to another batch file is: ``` ECHO @echo off >> GenerateEmail.bat ECHO ECHO Opening Stunnel >> GenerateEmail.bat ECHO pushd .\stunnel\ >> GenerateEmail.bat ECHO start "" stunnel.exe stunnel.conf >> GenerateEmail.bat ECHO popd >> GenerateEmail.bat ECHO ECHO Determining latest log for use with blat >> GenerateEmail.bat ECHO pushd O:\Logs\%clientname%\ >> GenerateEmail.bat ECHO for /f "tokens=*" %%a in ('dir /b /od') do set newest=%%a >> GenerateEmail.bat ECHO popd >> GenerateEmail.bat ECHO ECHO Generating email containing contents of latest log >> GenerateEmail.bat ECHO pushd .\blat307\full\ >> GenerateEmail.bat ECHO ECHO Y | xcopy "O:\Logs\%clientname%\%newest%" ".\" >> GenerateEmail.bat ECHO blat.exe "%newest%" -to %clientemail% -cc %gmailemail% -server 127.0.0.1:1099 -subject "Offsite Backup for "%1" "%2" - %clientname%" -sig sig.txt >> GenerateEmail.bat ECHO DEL .\*.log >> GenerateEmail.bat ECHO popd >> GenerateEmail.bat ECHO ECHO Closing Stunnel >> GenerateEmail.bat ECHO pushd .\stunnel\ >> GenerateEmail.bat ECHO stunnel.exe -exit >> GenerateEmail.bat ECHO popd >> GenerateEmail.bat ``` I'm not getting the desired output that I would like, I'm having issues with: `ECHO Y | xcopy "O:\Logs\%clientname%\%newest%" ".\" >> GenerateEmail.bat` coming out as `0 File(s) copied` and everywhere that I need %% it comes out as %, as well as the line starting with "blat.exe" isn't written at all amongst other problems. Is there any way to get a batch file to write lines of text without acknowledging any commands or symbols contained in those lines? Kane.