2012-02-02 145 views
1

我正在尋找批處理來創建子目錄中的文件名,並使用相同名稱將文件複製到直接目錄中。 我有以下名稱的多個文件:032557.txt,032557.csv,032557.log,054784.csv,054784.txt,054784.log等。我有批量使目錄名稱從文件和複製所有文件與同名到內容目錄。結果我有目錄054784與文件054784.csv,054784.txt,054784.log。我需要與子目錄結果目錄054784:CSV(我需要提交054784.csv),TXT(我需要提交054784.txt)和LOG(我需要提交054784.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 
) 
) 

或者您可以使用它來繞過!^問題:

@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

@ dbenham:這個偉大的工程,但有時我需要一些changees。當文件擴展名不同於想要的子目錄標題時如何切換代碼?例如,當我想在其他子目錄「PHOTO」中使用054784.csv,在「DATA」中使用032557.log,在「PATH」中使用032557.txt或類似的東西 – Artec 2012-02-03 16:27:05

+0

@ dbenham:簡單地說,我需要將具有me擴展名的文件移動到由我子目錄指定。 – Artec 2012-02-03 17:12:52

相關問題