批量生成目录与文件名中的子目录

时间:2012-02-02 22:17:33

标签: batch-file directory copy subdirectory

我正在寻找批处理来创建带有文件名子目录的目录,并将具有相同名称的文件复制到直接目录。 我有多个文件,名称如下: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 个答案:

答案 0 :(得分: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