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が述べたように、他にも多くの問題が発生しました。
さらに1つの問題は、echo !S!コマンド自体です。

ECHOさまざまなコンテンツにいくつかの厄介な副作用があります。
コンテンツが空の場合(またはスペースのみ)、現在の状態が出力さ
ECHO IS OFF れます。コンテンツがエコーされている場合、OFFまたはONエコーされない場合は、状態が変更されるだけです。
また、コンテンツがそうである場合は、/?の代わりにヘルプがエコーされます/?

これを解決するには、に変更ECHO !S!するだけでECHO(!S!、すべての問題が解消されます。

于 2012-06-29T09:46:23.213 に答える
1

jebはすでにあなたの=問題を解決しました(追加のIF DEFINEDチェックが彼の答えに追加されたら)。ただし、他に少なくとも1つの問題がある可能性があります。

私は、このようにHTMLを操作するためにバッチを使用するべきではないというJoeyに同意します。しかし、あなたが本当にしたいのなら...

潜在的な問題は、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

コードに加えられたその他のマイナーな変更:

  • 引用符を使用すると、検索と置換を簡略化できるため、特殊文字をエスケープする必要はありません。
  • DELとRENを1つのMOVEに置き換えることができます。
  • 括弧の外側のセットを使用して一度リダイレクトすると、リダイレクトはより効率的(高速)になります
  • スペースや特殊文字を含むファイル名を検索する必要がある場合があります。その場合は、名前を引用符で囲む必要があります。ただし、これにはFOR /F"USEBACKQ"オプションが必要です。

編集

<span></span>スペースやタブのみを含む行の可能性を排除するために、置き換えられた後に先頭のスペースを削除するようにコードを変更しました。

また、EOLをスペースに設定して、;で始まる行が削除されないようにします。

于 2012-06-29T12:12:40.093 に答える