批量读取包含大于/低于符号/插入符号的文件



好的,所以我正在尝试从文本文件中读取所有行。我目前的方式是:

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
)

最新更新