[英]Create Folder and Optional SubFolder based on file name using batch file
我需要在两个方面提供一些指导,不确定是否可以这样做。 请注意,以下代码可以正常工作。
@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
上面的文件名代码分别带有“-”和“-”,例如,文件名“ UK-London--filename.doc”将创建一个文件夹“ UK-London”,并将文件放在此处。
但是,还有其他更详细的文件名,例如文件名“ EU-UK--London-Camden--filename.doc”。 下面的脚本适用于此示例,它将为“ EU-UK”创建一个文件夹,然后为“ London-Camden”子文件夹并将文件放在此处:
@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
我遇到的第一个问题是,我需要使用两个脚本来遍历所有文件,有时这是一个偶然事件。 有没有一种方法可以将两个脚本与“如果存在”语句组合在一起?
第二个问题以及更多的问题是当前delims设置为“-”,我可以添加另一个delims例如“ _”吗?
谢谢,如有任何问题,请通知我。
Panos
我在想您可以使用更通用的方法:无论文件名碰巧是什么,都将所有出现的"--"
更改为"\\"
以便创建路径名(完整的文件规范,例如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!"
)
@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=:
标记为%%m..%%o
。 然后检查是否存在第三个令牌(并因此存在第二个令牌)并执行适当的创建和移动。
请注意,如果md one\\two
不存在,则会创建one
。 2>nul
禁止抱怨该目录已存在。
所需的MOVE命令仅仅ECHO
编用于测试目的。 确认命令正确无误后 ,将ECHO(MOVE
更改为MOVE
即可实际移动文件。Append >nul
可禁止报告消息(例如,已1 file moved
)
对于delims
问题,在=
和"
之间的任何字符都被定义为定界符;所有字符均等价。该行将被解释为delims token1 delims token2 ...,其中delims字符串是(分隔符))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.