Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Batch file creating another batch file, how to ignore commands when writing lines?

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.

like image 492
Kane Charles Avatar asked Jan 30 '13 11:01

Kane Charles


1 Answers

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
like image 59
dbenham Avatar answered Sep 19 '22 06:09

dbenham