2012-02-02 8 views
1

私はバッチを探して、ファイル名からサブディレクトリを持つディレクトリを作成し、同じ名前のファイルをダイレクトディレクトリにコピーします。 私は032557.txt、032557.csv、032557.log、054784.csv、054784.txt、054784.logなどのような名前の複数のファイルを持っています。私はファイルから名前でディレクトリを作成し、コンテンツディレクトリと同じ名前。結果では、ファイル054784.csv、054784.txt、054784.logを持つディレクトリ054784があります。私はサブディレクトリと結果ディレクトリ054784で必要がありますなど(私は054784.logファイルを必要とする)(私は054784.txtファイルを必要とする)(私は054784.csvを提出必要)CSV、TXTやLOGをファイル名からサブディレクトリを持つディレクトリを作成するバッチ

@echo off 
for /f "delims=" %%a in ('dir /b /a-d') do ( 
    if not "%%~fa"=="%~f0" ( 
    md "%%~na" 2>nul 
    if exist "%%a" move "%%~na.*" "%%~na" 
) 
) 

助言がありますか ?

答えて

1

%%〜xaは、ファイルの拡張子を示します。ややトリッキーなビットは、拡張子から先頭のドットを削除することです。

次のすべてがテストされていません。彼らは私がいくつかのばかげたバグを持っていなければ働くはずです。

@echo off 
setlocal enableDelayedExpansion 
for %%A in (*) do (
    if not "%%~fA"=="%~f0" (
    set "ext=%%~xA" 
    if defined ext set "ext=!ext:~1!" 
    md "%%~dpnA\!ext!" 2>nul 
    move "%%A" "%%~dpnA\!ext!" 
) 
) 

ファイル名が!または^が含まれている可能性がある場合は遅れる拡大は%% Aの壊れ拡大するので、その後、上記では動作しません。以下の変動は、この問題を解決します:

@echo off 
setlocal disableDelayedExpansion 
for %%A in (*) do (
    if not "%%~fA"=="%~f0" (
    set "ext=%%~xA" 
    set "proj=%%~dpnA" 
    set "file=%%A" 
    setlocal enableDelayedExpansion 
    if defined ext set "ext=!ext:~1!" 
    md "!proj!\!ext!" 2>nul 
    move "!file!" "!proj!\!ext!" 
    endlocal 
) 
) 

別の方法としては、!^問題を回避するためにこれを使用することもできます。dbenham @

@echo off 
setlocal disableDelayedExpansion 
for %%A in (*) do if not "%%~fA"=="%~f0" call :moveFile "%%~fA" 
exit /b 

:moveFile 
set "ext=%~x1" 
if defined ext set "ext=%ext:~1%" 
md "%~dpn1\%ext%" 2>nul 
move %1 "%~dpn1\%ext%" 
exit /b 
+0

:これは素晴らしい作品が、時々私はいくつかのchangeesを必要としています。ファイルの拡張子がサブディレクトリのタイトルと異なる場合、コードを切り替えるにはどうすればよいですか?たとえば、他のサブディレクトリ "PHOTO"に054784.csv、 "DATA"に032557.log、 "PATH"に032557.txtなどを入力したい場合 – Artec

+0

@ dbenham:指定した拡張子のファイルを移動する必要があります私のサブディレクトリで指定します。 – Artec

関連する問題