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