找到了一个pyhton解决方案here,但我需要一个基于批处理文件的解决方案。
有很多文件:
- SSP4325_blah-嗒嗒-blah.xml
- JKP7645_blah.xml
- YTG6457-嗒嗒-blah.xml
包含文件名的文件夹名称:
- RefID - SSP4325,JKP7645,GHT1278,YRR0023
- RefID - YTG6457
我正在寻找一个批处理解决方案,它会在前面读取一部分文件名(在第一个破折号或下划线之前),然后将该文件移动到文件名前面的文件夹中文件夹名称的一部分。
所以在上面的例子中,前两个文件(SSP4325和JKP7645)被移动到第一个文件夹中,因为它包含它包含该文本作为文件夹名称的一部分。
第三个文件将被移动到第二个文件夹中。
我有数百个文件和63个文件夹。所以我希望能够实现自动化。
由于环境的限制,无法使用Powershell或Python。所以希望有一个批处理文件的方法。
感谢。肖恩。
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
为了测试目的,所需的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。