%% ~ 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