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.
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:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With