名前は、対応するパラメーター行の前ではなく、後に指定します。名前が最初に来る場合、処理はより複雑になります。最初の行かどうかを確認する必要があります。そうでない場合は、最初に以前に保存された名前を使用して保留中の出力ファイルをマージする必要があるためです。次に、新しい名前を保存します。また、 の最後に到達すると、出力アイテムの最後のセットのマージをトリガーする行data.txt
がなくなります。name of file
対照的に、名前がパラメーターの後に続く場合は、そこで使用するだけで、保存する必要さえありません。
おそらく、次のようにすることができます。
変数に格納%%A
します。
(構文name of file:
を使用して) 格納された値から削除してみてください。set var=!var:substr=!
結果の値を と比較し%%A
ます。
2 つの値が同じままである場合、 にはname of file:
部分文字列がありません%%A
。つまり、ファイル名の行ではなく、パラメーター リストの行です。(その署名文字列をパラメーター セットとして使用しないことを願っています。) この場合、
- 現在行っているように、.exe ファイルを呼び出してパラメーターを処理するだけです。
値が異なる場合は、行に名前が含まれています。したがって、
ループの後、フラグが設定されている場合は古い名前を処理します。
以下は、上記の手順のリストを実装するための私の試みです。
SETLOCAL EnableDelatedExpansion
SET NotTheFirstName=
FOR /F "tokens=*" %%A IN (data.txt) DO (
SET "name=%%A"
SET "name=!ext:name of file: =!"
IF "!name!"=="%%A" (
XYZ.exe %%A
) ELSE (
IF DEFINED NotTheFirstName (
do whatever you need with !oldname!
to process your output files
)
SET "oldname=!name!"
SET NotTheFirstName=1
)
)
do whatever you need with !oldname! once again
(to account for the last set of output files)
data.txt
ifが次のようにフォーマットされていることに注意してください。
abc 1 2
xyz 2 3
name of file: mp3
sss 1 2
rrr 2 3
name of file: mp4
eee 1 2
qqq 2 3
name of file: vob
つまり、ファイル名の行が関連するパラメーター行の後にある場合、スクリプトははるかに単純になります。
SETLOCAL EnableDelatedExpansion
FOR /F "tokens=*" %%A IN (data.txt) DO (
SET "name=%%A"
SET "name=!ext:name of file: =!"
IF "!name!"=="%%A" (
XYZ.exe %%A
) ELSE (
do whatever you need with !name!
to process your output files
)
)
ご覧のとおり、出力はその場ですぐに処理されるため、後の反復で使用するために名前を保存する必要はありません。したがって、フラグを設定したり、ループの直後にもう一度名前を使用したりする必要はありません。