好的,所以我正在尝试从文本文件中读取所有行。我目前的方式是:
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
)
基本上输入文件是另一个批处理文件,它还包含与上述完全相同的代码以及其他带有 <、>、^ 等的代码。一旦我读了一行,基本上不可能使用%%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>"
此外,包含感叹号的行也将得到扩展。
第一个问题是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
)