我想根据文件名创建文件夹,如下所示:
file with words 01.wav
file with words 02.wav
file with words 03.wav
file with more words 01.wav
file with more words 02.wav
...
树应该看起来像这样
Folder
|----file with words
|----file with words 01.wav
|----file with words 02.wav
|----file with words 03.wav
|----file with more words
|----file with more words 01.wav
|----file with more words 02.wav
并且其中的文件应保留其原始名称 如何在每个数字之前解决最后一个空格? 我无法为"令牌指定固定值"因为最后一个空格的位置因文件而异。 这是我的方法:
FOR /f "tokens=1*" %%a IN (
'dir /b /a-d "* *.wav"'
) DO (
ECHO MD %%a
ECHO MOVE "%%a %%b" .\%%a\
)
PAUSE
- > ECHO
调试结果
答案 0 :(得分:2)
@echo off
setlocal enableextensions disabledelayedexpansion
for %%a in (*.wav) do (
set "filename=%%~na"
setlocal enabledelayedexpansion
for %%b in ("::\!filename: =\!\..") do ( endlocal & set "filename=%%~pnxb" )
setlocal enabledelayedexpansion
for /f "tokens=*" %%b in ("!filename:\= !") do (
endlocal
if not exist "%%b\" md "%%b"
if exist "%%b*.wav" move /y "%%b *.wav" "%%b"
)
)
代码背后的想法是遍历文件列表,对于每个文件,其名称中的空格将替换为反斜杠(file\with\words\01
),因此我们可以使用for
可替换参数查询"父文件夹"最后一个元素(没有结束数字的名称),然后用空格替换反斜杠以获取最终文件夹名称。
包含多个setlocal/endlocal
以处理可能包含感叹号的文件名(启用延迟扩展时出现问题的字符)。
代码尝试仅使用一个move
命令移动每个集合中的所有匹配文件,但根据实际名称,其他集合中的文件也可能匹配。要避免它,行
if exist "%%b*.wav" move /y "%%b *.wav" "%%b"
应转换为
move /y "%%a" "%%b\"
所以文件一个接一个地移动没有问题。
答案 1 :(得分:0)
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
PUSHD "%sourcedir%"
FOR /f "delims=" %%a IN (
'dir /b /a-d *.wav '
) DO (
SET "filename=%%a"
SET "dirname=%%a"
CALL :genmove
)
popd
GOTO :EOF
:genmove
IF "%dirname:~-1%" neq " " set "dirname=%dirname:~0,-1%"&goto genmove
set "dirname=%dirname:~0,-1%"
ECHO(MD "%dirname%"
ECHO(MOVE "%filename%" ".\%dirname%\"
GOTO :eof
您需要更改sourcedir
的设置以适合您的具体情况。
所需的MD命令仅用于ECHO
用于测试目的。 在您确认命令正确之后,将ECHO(MD
更改为MD
以实际创建目录。附加2>nul
以禁止错误消息(例如,当目录已存在时)
为了测试目的,所需的MOVE命令仅为ECHO
。 在您确认命令正确后,将ECHO(MOVE
更改为MOVE
以实际移动文件。附加>nul
以取消报告消息(例如1 file moved
)
只需为文件和目录生成相同的名称,从名称中删除最后一个字符,直到该字符为空格,将其修剪掉,并且您具有所需的目录名和文件名。
答案 2 :(得分:0)
这是一个使用JREPL.BAT的版本 - 一个执行正则表达式文本替换的混合JScript /批处理实用程序。
此解决方案的优点是它只会尝试移动名称与{baseName} {space} {digit} {digit}匹配的.wav文件,如果无法创建{baseName}文件夹,则不会移动文件,因为file {baseName}已存在。这些功能可以添加到已发布的纯批处理解决方案中。但是,我发现通过JREPL.BAT构建一个强大的解决方案更容易。
@echo off
for /f "tokens=1,2 delims=:" %%A in (
'dir /b "* ??.wmv" ^| jrepl "(.+?) +\d\d\.wmv$" "$1+':'+$0" /i /jmatch'
) do (
if not exist "%%A\" if not exist "%%A" (
md "%%A"
) else echo Can't create folder "%%A" because a file exists with that name
if exist "%%A\" move "%%B" "%%A" >nul
)