好吧,所以我试图从文本文件中读取所有行。我目前的方式是:
FOR /F "delims=0123456789 tokens=1,*" %%F IN ('find /v /n "" ^< myFile.bat') DO (
SET line = %%G
:: ^ Syntax errors at this line
SET line=!line:~1!
:: Yes, I have delayed expansions enabled due to a lot of fors and ifs needed
)
基本上输入文件是另一个批处理文件,它也包含与上面完全相同的代码,其他代码包含&lt;,&gt;,^等。一旦我读了一行,基本上不可能使用%%G
作为它会扩展到像:
SET line=ECHO Hello >> someFile
或
SET line=FOR /L %%G IN (1,1,5) ( SET "line=ECHO Hello %%G" & call :something & >nul SET /P =. )
哪个显然不起作用。我尝试了很多解决方法(都失败了),包括:
SET line="%%G
哪个(大部分时间)都有效,但从那里开始使用基本上几乎任何东西都是不可能的,即使是这样的东西:
:fixLine
SET line=%line:^=^^^^%
SET line=%line:<=^^^<%
SET line=%line:>=^^^>%
SET line=%line:'=^^^'%
SET line=%line:~2%
GOTO :returnFixLine
但是在某些情况下,所有方法都会失败。如何从另一个批处理脚本中读取包含批处理脚本的文件,包括特殊字符?
修改 做
SET "line=%%G"
不起作用,因为%% G可以包含引号,即使它没有,引号仍然是引号中的特殊内容:
SET "line=ECHO ^<Hello^>"
将变成
SET "line=ECHO <Hello>"
此外,包含感叹号的行也将得到扩展。
答案 0 :(得分:1)
第一个问题是set line = %%G
中的空格,因为您设置变量line<space>
而不是line
。
并在内容前加一个空格。
您应该使用set line=%%G
,但即使这样也会产生问题,当空格位于%%G
后面时。
最好的方法是使用扩展的SET语法set "line=%%G"
。
顺便说一下。只有一个特殊的字符可以通过FOR参数扩展失败,这是启用延迟扩展时的感叹号。
解决方案是切换延迟扩展。
setlocal DisableDelayedExpansion
FOR /F "delims= tokens=*" %%F IN ('find /v /n "" ^< myFile.bat') DO (
SET "line=%%F"
setlocal EnableDelayedExpansion
SET "line=!line:*]=!"
echo(Testoutput: !line!
endlocal
)