FOR /F の代わりに単純な FOR を使用するという Aacini の提案は、文字列にワイルドカード文字*
または?
. 文字は?
検索と置換によって保護できますが*
、バッチで置換する効率的な方法はありません。
ワイルドカードの問題が発生した場合は、ループ内で FOR /F を使用して一度に 1 つの単語を解析する方法に戻ることができます。ほとんどの人は、GOTO を使用してループを実行します。これは、検出される単語の数を知る方法がないためです。しかし、GOTO は比較的遅いです。任意の数のアイテムで外側の FOR ループ (FOR /L ではない) を使用することにより、パフォーマンスを大幅に向上させることができます。本文内では、単語がなくなるたびに GOTO でループを終了できます。単語を使い果たすことなくループが失敗した場合は、GOTO を使用してループを再開できます。100 個のアイテムを含む外側のループは、解析された 100 個の単語ごとに 1 つの GOTO のみを実行します。
@echo off
setlocal enableDelayedExpansion
set "str=This,is,a,comma,delimited,sentence"
set "L10=1 2 3 4 5 6 7 8 9 0"
:loop - The outer FOR loop can handle 100 words before a single GOTO is needed
for %%. in (%L10% %L10% %L10% %L10% %L10% %L10% %L10% %L10% %L10% %L10%) do (
for /f "tokens=1* delims=," %%A in ("!str!") do (
echo %%A
if "%%B" == "" goto :break
set "str=%%B"
)
)
goto :loop
:break
すべての FOR ループと同様に、%%A 変数が展開されるときに遅延展開が有効になっている場合は、 !
andの破損について心配する必要があります。^
本体内で GOTO を使用した場合でも、FOR /L は常にすべての反復のカウントを終了するため、FOR /L を外側のループに使用しないでください。