使用enableDelayedExpansion无法在批处理文件中的引号内转义分号

时间:2017-04-13 11:41:39

标签: batch-file

我正在通过Batch操作一些HTML。我正在使用延迟扩展但是当在双引号内遇到分号时,脚本无法复制除分号后的任何内容。

这可能是因为当我将变量传递给putLineInHTMLFile标签时我使用双引号(我需要以保持标签中的内容分开)。

@echo off
setlocal enableDelayedExpansion
del output.html
for /f "delims=" %%x in (file.html) do call :putLineInHTMLFile "%%x"
goto :EOF
:putLineInHTMLFile
set "line=%~1"
echo !line!>> output.html

file.html包含:

<tag1>
<tag"bla;2">

运行脚本后,output.html包含:

<tag1>
<tag"bla

我尝试用^或^^转义分号。没工作。我也试过逃避双引号。这也不起作用。

只要我能在输出文件中包含分号,我就可以更改file.html的内容。

3 个答案:

答案 0 :(得分:2)

这似乎适用于给出的测试用例;无法保证更广泛的使用:

@echo off
setlocal enableDelayedExpansion
del output.html
for /f "delims=# tokens=*" %%x in (file.html) do (
        set "safe=%%x"
        set "safe=!safe:"=""!"
        call :putLineInHTMLFile "!safe!"
)
goto :eof
:putLineInHTMLFile
set "line=%~1"
set "line=%line:""="%"
echo !line!>> output.html
:eof

在&#34;体内&#34;在for命令中,%%x尚未拆分,只有在call命令处理时才会发生这种情况。为了保护它,我使用safe将字符串中的所有双引号加倍,然后在子例程中添加一行以再次将它们删除。

如果双引号不匹配,则此功能无法正常工作,但在这些情况下,即使没有分号存在,也不会回显尾随>

答案 1 :(得分:1)

当然可以。问题是子程序接收

  

“&LT;的 标签” BLA; 2 “&gt;” 中

该行。解析器将其视为

Token1:“&lt; tag”bla
令牌2:2“&gt;”

因为像 Space 这样的;是分隔符。

可悲的是,如果不知道你打算在子程序中做什么,就很难就如何规避这个问题提出建议。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q43391363.txt"
SET "outfile=%destdir%\outfile.txt"
SET "outfile2=%destdir%\outfile2.txt"
del "%outfile%"
del "%outfile2%"

(for /f "delims=" %%x in (%filename1%) do set "line=%%x"&call :putLineInHTMLFile "%%x")>"%outfile2%"
goto :eof

:putLineInHTMLFile
ECHO %*
echo !line!>>"%outfile%"

GOTO :EOF

您需要更改sourcedirdestdir的设置以适合您的具体情况。 我使用了一个名为q43391363.txt的文件,其中包含我的测试数据。

生成定义为%outfile%和%outfile2%

的文件

所以 - 这里有两种不同的方式,一种是使用常规输出直接导向outfile1,另一种是使用从子程序重定向到outfile2

答案 2 :(得分:1)

只要引号在输入行中匹配(偶数),此方法适用于所有情况:

@echo off
setlocal enableDelayedExpansion
del output.html
for /f "delims=" %%x in (file.html) do call :putLineInHTMLFile "%%x"
goto :EOF

:putLineInHTMLFile
set line=%*
echo !line:~1,-1!>> output.html

PS - 请不要包含未在original code中显示的其他部分,例如:eof标签...标签在goto :EOF命令中以大写字母书写以表示它很特别。输入goto /?了解更多详情。