使用批处理文件根据文件名创建文件夹和可选子文件夹

问题描述:

有两个方面我需要一些指导,但不确定这是否可行。请注意,下面的代码按预期工作。使用批处理文件根据文件名创建文件夹和可选子文件夹

@echo off 
setlocal 
set "sourcedir=C:\FILETEST" 
pushd %sourcedir% 
for /f "tokens=1,2*delims=-" %%a in (
'dir /b /a-d *-*--*.*' 
) do if "%%c" neq "" ( 
md "%%a-%%b" 
move "%%a-%%b--%%c" ".\%%a-%%b\" 
) 
popd 
goto :eof 

上面的代码为迎合文件名有一个“ - ”和“ - ”,例如文件名“英国伦敦 - filename.doc”将创建一个文件夹“英国伦敦”,并把文件在那里。

但是,还有其他更详细的文件名,例如文件名“EU-UK - London-Camden - filename.doc”。下面的脚本适用于本例中,将创建一个文件夹“EU-UK”,然后一个子文件夹“在伦敦的卡姆登”,并把那里的文件:

@echo off 
setlocal 
set "sourcedir=c:\FILETEST" 
pushd %sourcedir% 
for /f "tokens=1,2,3,4*delims=-" %%a in (
'dir /b /a-d *-*--*-*--*.*' 
) do if "%%e" neq "" ( 
md "%%a-%%b" 
md "%%a-%%b/%%c-%%d" 
move "%%a-%%b--%%c-%%d--%%e" ".\%%a-%%b\%%c-%%d\" 
) 
popd 
goto :eof 

是我遇到的第一个问题是,我需要使用这两个脚本来浏览所有文件,有时候它是一个命中和错过。有没有办法将这两个脚本与“if exists”语句结合起来?

第二个问题和更多的问题是目前的分隔符设置为“ - ”,我可以添加另一个分隔符,例如, “_”?

谢谢,请让我知道如果有任何问题。

帕诺斯

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 

FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%\*.doc" ' 
) DO (
SET "filename=%%~na" 
FOR /f "tokens=1-3delims=:" %%m IN ("!filename:--=:!") DO (
    IF "%%o"=="" (
    MD "%destdir%\%%m" 2>NUL 
    ECHO move "%sourcedir%\%%a" "%destdir%\%%m\" 
) ELSE (
    MD "%destdir%\%%m\%%n" 2>NUL 
    ECHO move "%sourcedir%\%%a" "%destdir%\%%m\%%n\" 
) 
) 
) 

GOTO :EOF 

你需要改变的sourcedirdestdir设置以适合你的情况。

我假设你所有的.doc文件都符合提供的掩码。

dir命令会生成所有.doc文件的列表(显然,如果需要,请提供不同的掩码)。然后将每个名称分配给%%a,名称部分仅分配给filename

使用delayedexpansion,将每个--:(即不能在文件名中存在的字符),使用delims=:来tokenise到%%m..%%o。然后检查是否存在第三个标记(因此第二层)并执行相应的创建和移动。

请注意,md one\two将创建one如果它不存在。 2>nul可以防止该目录已存在的投诉。

所需的MOVE命令仅为ECHO用于测试目的。 确认命令正确后,将ECHO(MOVE更改为MOVE以实际移动文件。附加>nul以禁止报告消息(例如,1 file moved

至于delims问题,="之间的任何字符被定义为分隔符;所有的排名均等。线路将被解释为delims TOKEN1 delims token2 ...其中delims串是(任意的(任何定界符的))

的序列

我想你可以使用一个更通用的方法:凡是文件名恰好是,改变"--"所有出现"\"让您创建一个路径(完整文件规范,如C:\path\to\name.ext)。然后从路径名中提取父目录,并相应地移动文件。

像这样(未测试):

setlocal enabledelayedexpansion 
for %%a in (*) do (
    set "pathname=%%a" 
    set "pathname=!pathname:--=\!" 
    for %%b in ("!pathname!") do set "parent=%%~dpb" 
    md !parent! 
    move "%%a" "!pathname!" 
)