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

时间:2017-12-31 01:42:29

标签: file batch-file cmd

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

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>"

此外,包含感叹号的行也将得到扩展。

1 个答案:

答案 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
)