我正在通过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
的内容。
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
我使用了一个名为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 /?
了解更多详情。