使用批处理文件根据文件名创建文件夹和可选子文件夹
有两个方面我需要一些指导,但不确定这是否可行。请注意,下面的代码按预期工作。使用批处理文件根据文件名创建文件夹和可选子文件夹
@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
你需要改变的sourcedir
和destdir
设置以适合你的情况。
我假设你所有的.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!"
)