1

我有一个脚本,可以在其中读取要编辑的 html 文件。在这里,我粘贴了调用 :remove_redundant_columns 子例程的代码。

它应该从每行的开头删除空格/空格并从 html 文件中删除。唯一的问题是它在几乎空的行中添加了像 = 这样的额外文本,只有几个选项卡。

我下载的 html 文件来自 hidemyass.com/proxy-list/1

call parse_proxy.bat remove_redundant_columns !FILENAME!
exit /b

:remove_redundant_columns
REM Remove whitespaces from begin of lines and <span></span>
FOR /f "tokens=*" %%t in (%1) do (
   SET S=%%t
   SET S=!S:^<span^>^</span^>=!
   if NOT "!S!"=="" >>$tmp$ echo !S!
   )
del %1
REN $tmp$ %1
exit /b
4

2 回答 2

1

如果你相信,那是你唯一的问题......你需要检查你的变量 S 是否包含内容。

这是必需的,因为对未定义变量的替换不会产生未定义/空变量,新内容将是替换文本。

:remove_redundant_columns
REM Remove whitespaces from begin of lines and <span></span>
FOR /f "tokens=*" %%t in (%1) do (
   SET S=%%t
   if defined S (
     SET S=!S:^<span^>^</span^>=!
     >>$tmp$ echo !S!
   )
)

正如 dbenham 所说,您遇到了许多其他问题,
另外一个问题是echo !S!命令本身。

ECHO对不同的内容有一些令人讨厌的副作用。
如果内容为空(或只有空格),那么它将打印它的当前状态
ECHO IS OFF 如果内容是OFFON它不会被回显,它只会改变状态。
如果内容是/?,它将回显帮助而不是/?.

要解决这个问题,您可以简单地更改ECHO !S!ECHO(!S!,所有问题都消失了。

于 2012-06-29T09:46:23.213 回答
1

jeb 已经解决了您的 = 问题(一旦将额外的 IF DEFINED 检查添加到他的答案中)。但是您可能至少还有一个其他问题。

我同意乔伊的观点,你不应该像这样使用批处理来操作 HTML。但是,如果你真的想...

您的潜在问题是 HTML 通常会在其中!散布字符。!您的代码使用延迟扩展,但是当它包含字符时会导致 FOR 变量扩展损坏。解决方案是在循环中打开和关闭延迟扩展。

:remove_redundant_columns
setlocal disableDelayedExpansion
REM Remove whitespaces from begin of lines and <span></span>
(
  FOR /f "usebackq eol= tokens=*" %%t in ("%~1") do (
    SET S=%%t
    setlocal enableDelayedExpansion
    if defined S SET "S=!S:<span></span>=!"
    for /f "eol= tokens=*" %%S in ("!S!") do if "%%S" neq "" echo %%S
    endlocal
  )
) >>$tmp$
move /y $tmp$ "%~1"
exit /b

对代码所做的其他细微更改:

  • 搜索和替换可以通过使用引号来简化,这样特殊字符就不需要转义了。
  • 您可以用一个 MOVE 替换 DEL 和 REN。
  • 如果您使用一组外部括号重定向一次,重定向会更有效(更快)
  • 您可能需要搜索包含空格和/或特殊字符的文件名,在这种情况下,您需要引用该名称。但这需要 FOR /F "USEBACKQ" 选项。

编辑

修改代码以<span></span>在替换后去除前导空格,以消除仅包含空格和/或制表符的行的可能性。

还将 EOL 设置为空格以防止剥离以 ; 开头的行

于 2012-06-29T12:12:40.093 回答