3

ディレクトリに.txtファイル(1つ以上)があり、バッチファイルでファイル名を読み取り、4番目から20文字を取得して、フォルダーに新しいディレクトリを作成します。これが私のコードです:

for /f %%i in ('dir /b *.TXT') do (
    set filename1=%%i
    set folder1=%filename1:~4,20%
    mkdir %folder1%
)

このプログラムを初めて実行すると、3 行目 (set folder1=....) で構文が正しくないというエラーが発生し、フォルダーが作成されません。2回目の実行を試みたところ、2つのフォルダーが作成されました(「〜4」という名前のフォルダーと「20」という名前のフォルダー)。3回目の実行で、フォルダが正しく作成されました! コマンド プロンプトを閉じて再度開くと、フォルダーを作成する前に 3 回実行する必要があります。

また、「 for /r . $$i in (*.TXT) 」を使用してみましたが、うまくいきませんでした。私が理解しているように、問題は「set folder1 = ...」の行が適切なファイル名を取得しないことです。また、%%~i または %%~ni を使用してみました。ファイル名 (常に正しい文字列を取得するようです) をテキスト ファイルに出力してから、そのファイルから読み取ろうとしましたが、やはりうまくいきませんでした。 %%i がファイル名の文字列ではなく、ファイル自体を保存するためですか?

サンプルファイルの名前は「REG_18004247K_20120208_A.TXT」で、「18004247K_20120208_A」という名前のフォルダを作成したいです。

私はバッチ プログラミングにまったく慣れていません (バッチ ファイルを 2 週間ほど使用しただけです)。問題は非常に単純なものではないかと推測しています。どんな助けでも大歓迎です。

キリアコス

4

2 に答える 2

4

%%iファイル名を含む文字列を保存します。ここで期待どおりに機能するのは、実際にはこれだけの「変数」です。

重要な問題は、ループ内で環境変数置換 ( offilename1および of folder1) を使用していて、ループの各反復で展開されることを期待していることです。

ただし、ループ全体の実行が開始される前に、環境変数が展開されます。

  1. そのため、最初のバッチ実行時にfilename1が定義されておらず、エラーが表示されます。おそらく、 created folder1 is not setというフォルダーも表示されます。%folder1%
  2. ただし、スクリプトはfilename1この時点で定義し、2 回目の実行ではさらにfolder1正しく定義されます (ただし、4 行目は誤った値を使用して既に展開されており、楽しいことが起こります)。
  3. 3 回目の実行で、最終的にfolder1;の正しい値が表示されます。しかし、ループロジックが機能していないため、これは明らかに複数のファイルに対しては機能しません。

この古い回答は、この問題を他の素晴らしい例と特別なケースで説明しています。

バッチsetlocal enabledelayedexpansionは、スクリプトの先頭で、ループの前に変数を空の文字列に初期化し、!...!展開時に構文に切り替えることで修正できます: !filename1:~4,20!、および!folder1!.

于 2012-07-19T08:02:13.040 に答える
1
setlocal enabledelayedexpansion
for /r %%i in (*) do (
    set filename1=%%i
    set folder1=!filename1:~4,20!
    mkdir !folder1!
)

...遅延展開では、実際の変数を格納するのに時間がかかるためです。DOS への変数の高速割り当てをエコーする
!...!のではなく。%...%

于 2012-09-20T11:06:56.313 に答える