オプション1
以下のバッチスクリプトは、まともなパフォーマンスを発揮します。以下の制限があります
- 重複をチェックするときは大文字と小文字を区別しません。
- 値に含まれるすべての値が適切に保持されない場合が
=
あります
編集-私の元のコードは=
値をまったくサポートしていませんでした。変数名にSOH文字を追加することでその制限を緩和し、値の解析に使用されるデリムを変更しました。=
これで、の前に一意の値が区別される限り、値に含めることができます=
。その後、値が異なる場合、=
1つの値のみが保持されます。
上部近くのSOH変数の定義を必ず修正してください。
ログファイルの名前は1番目のパラメーターとして渡され、要求されたタグのリストは2番目のパラメーター(引用符で囲まれています)として渡されます。
@echo off
setlocal disableDelayedExpansion
:: Fix the definition of SOH before running this script
set "SOH=<SOH>"
set LF=^
:: The above 2 blank lines are necessary to define LF, do not remove.
:: Make sure there are no existing tag_ variables
for /f "delims==" %%A in ('2^>nul set tag_') do set "%%A="
:: Read each line and replace SOH with LF to allow iteration and parsing
:: of each tag/value pair. If the tag matches one of the target tags, then
:: define a tag variable where the tag and value are incorporated in the name.
:: The value assigned to the variable does not matter. Any given variable
:: can only have one value, so duplicates are removed.
for /f "usebackq delims=" %%A in (%1) do (
set "ln=%%A"
setlocal enableDelayedExpansion
for %%L in ("!LF!") do set "ln=!ln:%SOH%=%%~L!"
for /f "eol== tokens=1* delims==" %%B in ("!ln!") do (
if "!!"=="" endlocal
if "%%C" neq "" for %%D in (%~2) do if "%%B"=="%%D" set "tag_%%B%SOH%%%C%SOH%=1"
)
)
:: Iterate the defined tag_nn variables, parsing out the tag values. Write the
:: values to the appropriate tag file.
del tag_*.txt 2>nul
for %%A in (%~2) do (
>"tag_%%A.txt" (
for /f "tokens=2 delims=%SOH%" %%B in ('set tag_%%A') do echo %%B
)
)
:: Print out the results to the screen
for %%F in (tag_*.txt) do (
echo(
echo %%F:
type "%%F"
)
オプション2
このスクリプトにはほとんど制限がありませんが、かなり遅くなります。私が見ることができる唯一の制限は、値を最初から許可しないことです=
(先頭=
は破棄されます)。
FINDSTR / G:オプションで使用する一時的な「search.txt」ファイルを作成します。FINDSTRの制限により、コマンドライン検索文字列の代わりにファイルを使用します。コマンドライン検索文字列は、10進数の128を超える多くの文字と一致することはできません。また、リテラルの円記号のエスケープ規則がコマンドラインで一貫していません。WindowsFINDSTRコマンドの文書化されていない機能と制限は何ですか?を参照してください。詳細については。
SOH定義を再度修正する必要があり、1番目と2番目の引数は1番目のスクリプトと同じです。
@echo off
setlocal disableDelayedExpansion
:: Fix the definition of SOH before running this script
set "SOH="
set lf=^
:: The above 2 blank lines are necessary to define LF, do not remove.
:: Read each line and replace SOH with LF to allow iteration and parsing
:: of each tag/value pair. If the tag matches one of the target tags, then
:: check if the value already exists in the tag file. If it doesn't exist
:: then append it to the tag file.
del tag_*.txt 2>nul
for /f "usebackq delims=" %%A in (%1) do (
set "ln=%%A"
setlocal enableDelayedExpansion
for %%L in ("!LF!") do set "ln=!ln:%SOH%=%%~L!"
for /f "eol== tokens=1* delims==" %%B in ("!ln!") do (
if "!!"=="" endlocal
set "search=%%C"
if defined search (
setlocal enableDelayedExpansion
>search.txt (echo !search:\=\\!)
endlocal
for %%D in (%~2) do if "%%B"=="%%D" (
findstr /xlg:search.txt "tag_%%B.txt" || >>"tag_%%B.txt" echo %%C
) >nul 2>nul
)
)
)
del search.txt 2>nul
:: Print out the results to the screen
for %%F in (tag_*.txt) do (
echo(
echo %%F:
type %%F
)