我正在编写的 Windows 批处理文件遇到了一些问题。
我需要批处理文件将一些特定行写入另一个批处理文件,我一直使用的方法是:
type NUL > batchfile.bat
ECHO texttobewrittentofile >> batchfile.bat
ECHO texttobewrittentofile >> batchfile.bat
ECHO texttobewrittentofile >> batchfile.bat
...
etc
大多数行都写得很好,但是我的批处理文件写入另一个批处理文件时遇到了一些不同的问题。
我的批处理文件写入另一个批处理文件的代码是:
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
我没有得到我想要的输出,我遇到了以下问题:
ECHO Y | xcopy "O:\Logs\%clientname%\%newest%" ".\" >> GenerateEmail.bat
出来作为
0 File(s) copied
在我需要 %% 的地方,它都会以 % 的形式出现,并且以“blat.exe”开头的行根本没有写在其他问题中。有没有办法让批处理文件写入文本行而不确认这些行中包含的任何命令或符号?
Kane.
所有特殊字符,如^
&
|
<
>
必须转义为^^
^&
^|
^<
^>
或者用引号引起来。
每个百分比必须始终加倍。例如:
-
"%1"
变成"%%1"
-
%newest%
变成%%newest%%
-
%%a
变成%%%%a
如果您在所有 ECHO 语句两边加上括号,则无需清除输出文件并重定向每一行。如果这样做,右括号也必须被转义。
>GenerateEmail.bat (
echo Line 1
echo Line 2
echo these must be escaped ^^ ^& ^| ^> ^< ^), these not "^ & | > < )"
)
如果您启用了延迟扩展并且输出包含以下内容,则规则会变得更加复杂!
, or !
with ^
.
还有其他方法可以避免弄清楚如何转义特殊字符和将百分比加倍。
您可以为每行添加前缀:::
并将 FOR /F 与 FINDSTR 结合使用以获得所需的输出。如果您的输出包含,请确保关闭延迟扩展!
。下面的代码的唯一限制是你的输出行不能以:
(它可以以空格开头,然后是:
).
(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
另一种选择是使用以下位置的技术之一:
- 将段落的内容回显到文件中而不对该段落进行任何修改? https://stackoverflow.com/q/14548151/1012053
- 在Windows批处理中打印一个段落 https://stackoverflow.com/q/14559789/1012053
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)