0

ここにバッチファイルがあります:StackOverflowsの「コード」ウィンドウを押しても何も表示されないので、うまくいけばそれを解体しないでください:

@echo off
echo Moving files to respective folders.
DIR C:\ArcConverted\adam\shapefiles\ /A:-D /B > C:\ArcConverted\adam\filelist.txt
echo File start > C:\ArcConverted\adam\output.txt
FOR /f %%a IN (C:\ArcConverted\adam\filelist.txt) DO (
    FOR /f "tokens=1 delims=_" %%b IN ('%%a') do echo A:%%a B: %%b
    IF NOT EXIST C:\ArcConverted\adam\shapefiles\%%~na\ mkdir C:\ArcConverted\adam\shapefiles\%%~na\
    echo Moving file %%a into C:\ArcConverted\adam\shapefiles\%%~na\
    move C:\ArcConverted\adam\shapefiles\%%a C:\ArcConverted\adam\shapefiles\%%~na\%%b
)
pause

C:\ArcConverted\adam\shapefiles に、新しく前方変換された ArcGIS シェープファイルであるファイルがあり、それらのファイル名は次のようになりました。

  • thisthing_arc.adf
  • thisthing_tic.adf
  • thisthing_shp.shp
  • thatthing_shp.shp

... 等々。

これらの異なるオブジェクト セットが 83 個あり、それぞれに約 16 個のファイルがあります。フォルダー内のすべてのファイルを読み取り、ファイルに入れ、ファイルのリストを読み取り、必要に応じてそれぞれのフォルダーを作成するバッチ スクリプトを作成しようとしています (もちろん、バッチである必要があります)。 _ の後のすべてを出力します (_ はコンバーター プログラムから追加されます)。私のスクリプトは動作しません。2 番目の for ループは、各ファイルを開き、すべてを読み取り、数十万行を出力します。バッチを使用してファイル名を文字列で区切る方法を理解できないようです(ファイルの内容は気にしません)。

概要:

同じフォルダーにスローされた同じフォルダーにすべて属するファイル セットがあります。私はプログラム的に(バッチを介して)ファイル名(_の前に発生するすべてのもの)からセットの名前を取得し、そのフォルダーを作成してから、ファイルをそのフォルダーに移動しようとしています。そのフォルダーに属するファイルも、ループが進むにつれてそこに移動されます。

私は正しい方向に向かっていますか?ありがとう。

4

1 に答える 1

2

あなたは確かに良い方向に進んでいましたが、いくつかの構文エラーといくつかの論理エラーの両方があります.

2 番目の FOR ループでは、文字列を解析しようとしていますが、IN 句が一重引用符で囲まれているため、コードは代わりにコマンドを実行しています。二重引用符で文字列を表す必要があります。

2番目のFORループから始めて、ロジック全体がオフになっています。解析する文字列は、拡張子のないファイルの名前です。したがって、 IN 句はIN ("%%~na"). 次に、そのループの後、という名前のフォルダーを作成し"%%~na"、ファイルを新しいファイル名でそのフォルダーに移動しようとします%%b。しかし%%b、2番目のループにないため、定義されなくなりました。"%%b"実際には、という名前のフォルダーを作成し、2 番目のループ内でファイルをそこに移動したいと考えています。

最後に、FOR /F オプションに問題があります。最初の FOR は、最初のスペース文字で名前を分割しますが、これは必要なものではありません。もちろん、ファイル名にスペースが含まれていなければ問題ありません。しかし、なぜチャンスを取るのですか?また、 のデフォルトの EOL オプションは、;で始まるファイル名を無視します;。再び可能性は低いですが、なぜチャンスをつかむのですか。ファイル名に を含めることはできない:ため、これは EOL に適した文字です。

次のコードがあなたが探していたものだと思います。

@echo off
echo Moving files to respective folders.
dir C:\ArcConverted\adam\shapefiles\ /A:-D /B > C:\ArcConverted\adam\filelist.txt
echo File start > C:\ArcConverted\adam\output.txt
for /f "eol=: delims=" %%a in (C:\ArcConverted\adam\filelist.txt) do (
  for /f "eol=_ tokens=1 delims=_" %%b in ("%%a") do (
    echo A:%%a B:%%b
    if not exist "C:\ArcConverted\adam\shapefiles\%%b\" mkdir "C:\ArcConverted\adam\shapefiles\%%b\"
    echo Moving file "%%a" into "C:\ArcConverted\adam\shapefiles\%%b\"
    move "C:\ArcConverted\adam\shapefiles\%%a" "C:\ArcConverted\adam\shapefiles\%%b\"
  )
)
pause

ただし、コードを単純化します。filelist.txt ファイルが必要だとは思いません。ファイルに書き込み、FOR /F で読み取る代わりに、単純な FOR ループを使用できます。ディレクトリ (pushd) をシェープファイルのルートに変更するだけでも、コードははるかに小さくシンプルになります。

最後に、移動しようとするファイルにフィルターを適用します。ファイル名に文字が含まれていない場合、名前全体を使用してフォルダーを作成したくないと思います"_"。したがって、私の変更されたコードは明示的に"_"名前を探します。

@echo off
setlocal
pushd "C:\ArcConverted\adam\shapefiles" || exit /b
echo Moving files to respective folders.
for %%A in ("*_*.*") do (
  for /f "eol=_ tokens=1 delims=_" %%B in ("%%~nA") do (
    if not exist "%%B\" mkdir "%%B\"
    echo Moving file "%%A" into "%%B\"
    move "%%A" "%%B\"
  )
)
pause
于 2012-07-19T20:22:43.583 に答える