1

コマンドが解析している delims を列挙する FOR /F ステートメントがあります。例えば:

FOR /F "delims=," %%A IN ("This,is,a,comma,delimited,sentence") DO (
    some command to enumerate delims
)
:OUT

その文の区切られた各項目を説明したい。この場合、出力されます6

編集:私は長い道のりがそれぞれをチェックすることであることを知っています..しかし、私はその方法を避けようとしています:

IF %%A == [] SET enum=0 && GOTO:OUT
IF %%B == [] SET enum=1 && GOTO:OUT

4

3 に答える 3

3

FOR /F "delims=..." コマンドで項目を直接列挙する方法があります。
文字列にいくつかの改行を挿入するだけです。

setlocal EnableDelayedExpansion
set LF=^


rem ** Two empty lines are required

set count=0
FOR /F "tokens=* delims=" %%a in ("item1!LF!item2!LF!item3") DO (
  set /a count+=1
  echo !count!: "%%a"
)
echo(
set "CSV=This,is,a,comma,delimited,sentence"
echo Or with comma separeted text: !CSV!
for %%L in ("!LF!") do set "CSV=!CSV:,=%%~L!"
set count=0
FOR /F "tokens=* delims=" %%a in ("!CSV!") DO (
  set /a count+=1
  echo !count!: "%%a"
)
于 2012-02-08T16:07:19.753 に答える
2

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 を外側のループに使用しないでください。

于 2012-02-08T05:21:49.450 に答える