2012-02-02 151 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

相关问题