2

別のtxtファイルを読み取っているbatファイルがあり、値を外部exeファイルに送信します。外部exeファイルは、これらのコマンドを使用して出力ファイルを生成します。

for /f "tokens=*" %%A in (data.txt) do (
:start

XYZ.exe %%A )

data.txtの内容は次のようになります。

abc 1 2
xyz 2 3

今、私は次のようにdata.txtを編集しています:

name of file: mp3
abc 1 2
xyz 2 3
name of file: mp4
sss 1 2
rrr 2 3
name of file: vob
eee 1 2
qqq 2 3

そして、最後に追加するたびに述べたように、ファイルの名前を使用して拡張子名のファイルを作成する必要があります。

編集:

私は主に、ファイル名の値が来るたびに変数に保存できる方法を見つける必要があります。したがって、たとえば上記のテキストファイルでは、バッチを実行すると、ファイルの名前が存在するかどうかが確認されます。存在する場合は、値、つまり上記の場合はmp3を保存して保存し、ファイル名が再び表示されなくなるまでXYZ.exeを呼び出します。新しいファイル名が来るとすぐに、XYZによって生成された2つの出力を2つのパラメーターからマージしてファイルにマージし、そのファイルの拡張子をmp3で追加するメソッドが呼び出されます。

その後、新しいファイル名が同じ変数に保存され、プロセスが続行されます。

data.txtにこのファイル名のインスタンスが1つもない場合、結果のファイルの拡張子はtxtになります。今ははっきりしているはずだと思います。詳細についてはお知らせください。

4

1 に答える 1

1

名前は、対応するパラメーター行の前ではなく、後に指定します。名前が最初に来る場合、処理はより複雑になります。最初の行かどうかを確認する必要があります。そうでない場合は、最初に以前に保存された名前を使用して保留中の出力ファイルをマージする必要があるためです。次に、新しい名前を保存します。また、 の最後に到達すると、出力アイテムの最後のセットのマージをトリガーする行data.txtがなくなります。name of file対照的に、名前がパラメーターの後に続く場合は、そこで使用するだけで、保存する必要さえありません。

おそらく、次のようにすることができます。

  1. 変数に格納%%Aします。

  2. (構文name of file: を使用して) 格納された値から削除してみてください。set var=!var:substr=!

  3. 結果の値を と比較し%%Aます。

  4. 2 つの値が同じままである場合、 にはname of file: 部分文字列がありません%%A。つまり、ファイル名の行ではなく、パラメーター リストの行です。(その署名文字列をパラメーター セットとして使用しないことを願っています。) この場合、

    • 現在行っているように、.exe ファイルを呼び出してパラメーターを処理するだけです。
       
  5. 値が異なる場合は、行に名前が含まれています。したがって、

    • 名でない場合は、以前に保存された名前を使用して出力ファイルを処理します。

    • 後で使用するために取得した名前を保存します。

    • 次の名前が最初の名前ではないことを示すフラグを設定します。

  6. ループの後、フラグが設定されている場合は古い名前を処理します。

以下は、上記の手順のリストを実装するための私の試みです。

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.txtifが次のようにフォーマットされていることに注意してください。

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
  )
)

ご覧のとおり、出力はその場ですぐに処理されるため、後の反復で使用するために名前を保存する必要はありません。したがって、フラグを設定したり、ループの直後にもう一度名前を使用したりする必要はありません。

于 2012-10-05T15:14:39.167 に答える