Windows Batch根据文件名创建文件夹

时间:2015-02-07 15:32:10

标签: windows batch-file cmd directory

我想根据文件名创建文件夹,如下所示:

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调试结果

3 个答案:

答案 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
)