有两个方面我需要一些指导,不确定这是否可行。请注意,以下代码正在按预期工作。
@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
以上代码适合文件名有" - " && 34; - ",例如filename" UK-London - filename.doc"会创建一个文件夹" UK-London"并将文件放在那里。
但是,还有其他更详细的文件名,例如filename" 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设置为" - ",我可以添加其他delim,例如" _"
谢谢,如果有任何问题,请告诉我。
Panos
答案 0 :(得分:0)
我认为你可以使用更通用的方法:无论文件名是什么,都要将所有"--"
更改为"\"
,以便创建路径名(完整文件规范,例如{ {1}})。然后从路径名中提取父目录,并相应地移动文件。
像这样(未经测试):
C:\path\to\name.ext
答案 1 :(得分:0)
@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=:
标记为{{ 1}}。然后检查第三个标记(以及第二个级别)是否存在并执行适当的创建和移动。
请注意,%%m..%%o
如果尚未存在,则会创建md one\two
。 one
会抑制目录已存在的投诉。
为了测试目的,所需的MOVE命令仅为2>nul
。 在您确认命令正确后,将ECHO
更改为ECHO(MOVE
以实际移动文件。附加MOVE
以取消报告消息(例如>nul
)
至于1 file moved
问题,delims
和=
之间的任何字符都被定义为分隔符;所有排名均等。该行将被解释为 delims token1 delims token2 ...其中 delims 字符串是(任何(任何分隔符)的序列))