Text 批处理文件创建另一个批处理文件时,如何在写入行时忽略命令?

Text 批处理文件创建另一个批处理文件时,如何在写入行时忽略命令?,text,batch-file,echo,symbols,Text,Batch File,Echo,Symbols,我正在编写的windows批处理文件有点问题 我需要批处理文件将某些特定行写入另一个批处理文件,我一直使用的方法是: type NUL > batchfile.bat ECHO texttobewrittentofile >> batchfile.bat ECHO texttobewrittentofile >> batchfile.bat ECHO texttobewrittentofile >> batchfile.bat ... etc 大多数行

我正在编写的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个已复制的文件

在我需要%%的地方,它会以%%的形式出现,还有以“blat.exe”开头的行根本就没有写,还有其他问题。有没有办法让批处理文件在不确认文本行中包含的任何命令或符号的情况下写入文本行


凯恩。

所有特殊字符,如
^
必须转义为
^
^&
^
或用引号括起来

每一个百分比都必须加倍。例如:

  • “%1”
    变为
    “%%1”
  • %newest%%
    变为
    %%newest%%
  • %%a
    变成
    %%a
如果在所有ECHO语句周围加上括号,则不需要清除输出文件并重定向每一行。如果执行此操作,右括号也必须转义

>GenerateEmail.bat (
  echo Line 1
  echo Line 2
  echo these must be escaped ^^ ^& ^| ^> ^< ^), these not "^ & | > < )"
)
另一种选择是使用下列技术之一:


看看这里:我尝试了类似的方法,但没有效果,例如,为了在批处理文件中获得%%a I can do%%%a,额外的百分号似乎不起作用。除了包含命令的行之外,我需要避免运行命令。谢谢!我已经修复了大多数错误,唯一一行我遇到问题的是:for/f“tokens=*”%%a in('dir/b/od')do set latest=%%a我使用的是:ECHO^for^/f^“tokens^=*”%%%a in^('dir/b/od')^do^ set latest^=%%%a>>GenerateEmail.bat但这行仍然没有被写入。编辑:您和@wmz都提供了正确的解决方案,我实在是太胖了,看不出如何让它们为我工作。@KaneCharles-Try
ECHO for/f“tokens=*”%%%%%a in('dir/b/od'^)do set latest=%%%a>>GenerateEmail.bat
。您的引用不平衡,导致重定向被引用,因此无法正常工作。
(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