0

私は、組織化が必要な記録フォームが多すぎる (数百万) ある会社で働いています。

各ファイルは、次の命名構造を使用します
xxxxx-xx-xx-xxxxx43144-02-40-21324.<ext>

過去に、ファイルを同じ名前のフォルダーに入れるバッチ スクリプトを使用したことがありますが、少し違うものを探しています。

最終的には、次のフォルダー構造になりたいと思います。
C:\[root directory]\43144\02\40\21324.PDF

このようなことは可能ですか?バッチ スクリプトに関する私の知識は存在しません。これをすばやくまとめることができる人はいますか?

前もって感謝します、デビッド

4

4 に答える 4

2
@ECHO OFF
SETLOCAL
SET "sourcedir=."
SET "destdir=u:\temp"
FOR /f "tokens=1,2,3,*delims=-" %%a IN ('dir /b/a-d "%sourcedir%\*-*-*-*"') DO (
 MD "%destdir%\%%a\%%b\%%c" 2>NUL
 IF EXIST "%destdir%\%%a\%%b\%%c\%%d" (ECHO "%destdir%\%%a\%%b\%%c\%%d" already exists
 ) ELSE ( 
  MOVE "%sourcedir%\%%a-%%b-%%c-%%d" "%destdir%\%%a\%%b\%%c\%%d" >nul 
 )
)
GOTO :EOF

これにより、正しい軌道に乗るはずです-ソースディレクトリと宛先ディレクトリを設定するだけです...

于 2013-07-18T08:15:25.740 に答える
1

はい、これを行うのはそれほど難しくありません。

  1. すべてのファイルをループする必要があります

    for %%F in (*.ext) ...
    

    簡単にするために、現在のフォルダーを調べるので、事前に適切に設定してください。ただし、検索するフォルダーを指定することもできます。

  2. 見つかったファイルごとに、作業を行うサブルーチンを呼び出すだけです

    ... do call :process "%%~F"
    
  3. メインメソッドを終了する

    goto :eof
    
  4. 今すぐサブルーチンが必要です

    rem :process <filename>
    :process
    
  5. ファイル名をその部分に分解します。これらはすべて固定長であるため、ここでは部分文字列のみを使用できます。

    set "Filename=%~1"
    set "Part1=%Filename:~0,5%"
    set "Part2=%Filename:~6,2%"
    set "Part3=%Filename:~9,2%"
    set "Rest=%Filename:~12%"
    
  6. ここで、これをコピーする必要があるフォルダーが既に存在するかどうかを確認する必要があります。

    if not exist C:\root\%Part1%\%Part2%\%Part3%\NUL mkdir C:\root\%Part1%\%Part2%\%Part3%
    

    これにより、必要に応じて途中ですべてのフォルダーが作成されます。とても便利な。

  7. 今すぐファイルの名前を変更して移動する

    move %1 C:\root\%Part1%\%Part2%\%Part3%\%Rest%
    
  8. サブルーチンを終了する

    goto :eof
    

これは多かれ少なかれそれであるはずです(私の実装のバグにもかかわらず)。したがって、ここでも完全に次のとおりです。

for %%F in (*.ext) do call :process "%%~F"
goto :eof

rem :process <filename>
:process
    set "Filename=%~1"
    set "Part1=%Filename:~0,5%"
    set "Part2=%Filename:~6,2%"
    set "Part3=%Filename:~9,2%"
    set "Rest=%Filename:~12%"
    if not exist C:\root\%Part1%\%Part2%\%Part3%\NUL mkdir C:\root\%Part1%\%Part2%\%Part3%
    move %1 C:\root\%Part1%\%Part2%\%Part3%\%Rest%
goto :eof
于 2013-07-18T08:20:14.010 に答える
0

FOR. _ 次に、ディレクトリが作成されていることを確認し、ファイルを新しいパスにコピー/移動する必要があります。

For %%f In (*.*) Do For /F "Tokens=1,2,3,4,5,6 Delims=-" %%i In ("%%f") Do Call :PutInPath %%f %%i %%j %%k %%k %%l
GoTo :EOF

:PutInPath
MD "C:\your dir\%2"
MD "C:\your dir\%2\%3"
MD "C:\your dir\%2\%3\%4"
REM You can use COPY, MOVE, REN, ...
COPY %1 "C:\your dir\%2\%3\%4\%5"
GoTo :EOF
于 2013-07-18T08:18:30.717 に答える