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.

Original source

Related problems