批处理文件根据部分文件名将文件移动到基​​于文件夹名称

时间:2017-01-23 11:02:36

标签: batch-file directory filenames batch-processing move

找到了一个pyhton解决方案here,但我需要一个基于批处理文件的解决方案。

有很多文件:

  
      
  • SSP4325_blah-嗒嗒-blah.xml
  •   
  • JKP7645_blah.xml
  •   
  • YTG6457-嗒嗒-blah.xml
  •   

包含文件名的文件夹名称:

  
      
  • RefID - SSP4325,JKP7645,GHT1278,YRR0023
  •   
  • RefID - YTG6457
  •   

我正在寻找一个批处理解决方案,它会在前面读取一部分文件名(在第一个破折号或下划线之前),然后将该文件移动到文件名前面的文件夹中文件夹名称的一部分。

所以在上面的例子中,前两个文件(SSP4325和JKP7645)被移动到第一个文件夹中,因为它包含它包含该文本作为文件夹名称的一部分。

第三个文件将被移动到第二个文件夹中。

我有数百个文件和63个文件夹。所以我希望能够实现自动化。

由于环境的限制,无法使用Powershell或Python。所以希望有一个批处理文件的方法。

感谢。肖恩。

2 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
FOR /f "delims=" %%a IN (
 'dir /b /a-d "%sourcedir%\*.xml" '
 ) DO (
 FOR /f "tokens=1delims=_-" %%b IN ("%%a") DO (
  FOR /f "delims=" %%d IN (
  'dir /b /ad "%destdir%\*%%b*" '
  ) DO (
   ECHO(MOVE "%%a" "%destdir%\%%d\"
  )
 )
)

GOTO :EOF

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

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

建立目录后,外部循环将文件名放在%%a中,下一个循环获取该名称的第一部分,最多但不包括第一个-_ (指定delims)到%%b

内部循环在目标目录中找到目标目录contains %%b,并构造一个适当的move行。

答案 1 :(得分:1)

此解决方案只检查文件夹一次并将它们存储在数组中,因此此方法应该运行得更快。

@echo off
setlocal EnableDelayedExpansion

rem Process the folders
set i=0
for /D %%a in (*) do (

   rem Store this folder in the next array element
   set /A i+=1
   set "folder[!i!]=%%a"

   rem Separate folder in parts and store the number of the array element in each one
   for %%b in (%%a) do set "part[%%b]=!i!"

)

rem Process the files
for %%a in (*.xml) do (

   rem Get the first part of name
   for /F "delims=-_" %%b in ("%%a") do (

      rem If such a folder exists...
      if defined part[%%b] (

         rem Get the number of the corresponding array element and move the file
         for %%n in (!part[%%b]!) do ECHO move "%%a" "!folder[%%n]!"

      ) else (

         echo No folder exists for this file: "%%a"

      )

   )
)

此方法还有几个优点:您可以检查某个文件夹是否不存在,或者获取移动到每个文件夹的文件数等。如果您对这些点不感兴趣,只需删除{{1}命令并使代码更简单...

批处理文件中的数组管理说明在this answer