Kan*_*les 5 text symbols batch-file echo
我正在写一个Windows批处理文件有点麻烦.
我需要批处理文件将一些特定的行写入另一个批处理文件,我使用的方法是:
type NUL > batchfile.bat
ECHO texttobewrittentofile >> batchfile.bat
ECHO texttobewrittentofile >> batchfile.bat
ECHO texttobewrittentofile >> batchfile.bat
...
etc
Run Code Online (Sandbox Code Playgroud)
大多数行写得很好,但是我的批处理文件写入另一个批处理文件时遇到了一些不同的问题.
我的批处理文件写入另一个批处理文件的代码是:
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
Run Code Online (Sandbox Code Playgroud)
我没有得到我想要的所需输出,我遇到了问题:
ECHO Y | xcopy "O:\Logs\%clientname%\%newest%" ".\" >> GenerateEmail.bat
出来的
0 File(s) copied
并且我需要%%的所有地方都以%显示,以及以"blat.exe"开头的行不会写在其他问题中.有没有办法让批处理文件写入文本行而不确认这些行中包含的任何命令或符号?
凯恩.
dbe*_*ham 10
所有特殊字符^ & | < >必须转义为^^ ^& ^| ^< ^>或用引号括起来.
每个百分比必须总是加倍.例如:
"%1" 变 "%%1"%newest% 变 %%newest%%%%a 变 %%%%a如果在所有ECHO语句周围加上括号,则无需清除输出文件并重定向每一行.如果这样做,也必须转义右括号.
>GenerateEmail.bat (
echo Line 1
echo Line 2
echo these must be escaped ^^ ^& ^| ^> ^< ^), these not "^ & | > < )"
)
Run Code Online (Sandbox Code Playgroud)
如果启用延迟扩展的规则更加复杂,你有包括输出!,或!用^.
还有其他方法可以避免必须弄清楚如何转义特殊字符并加倍百分比.
您可以为每行添加前缀,:::并使用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
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用以下技术之一: