繁体   English   中英

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

[英]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

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

我假设您所有的.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM