使用批处理文件基于文件名创建文件夹和可选子文件夹

时间:2017-09-13 16:25:48

标签: 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

以上代码适合文件名有" - " && 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

2 个答案:

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

您需要更改sourcedirdestdir的设置以适合您的具体情况。

我假设您的所有.doc文件都符合所提供的面具。

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

使用delayedexpansion,将每个--转换为:(文件名中不存在的字符)并使用delims=:标记为{{ 1}}。然后检查第三个标记(以及第二个级别)是否存在并执行适当的创建和移动。

请注意,%%m..%%o如果尚未存在,则会创建md one\twoone会抑制目录已存在的投诉。

为了测试目的,所需的MOVE命令仅为2>nul在您确认命令正确后,将ECHO更改为ECHO(MOVE以实际移动文件。附加MOVE以取消报告消息(例如>nul

至于1 file moved问题,delims=之间的任何字符都被定义为分隔符;所有排名均等。该行将被解释为 delims token1 delims token2 ...其中 delims 字符串是(任何(任何分隔符)的序列))