[英]Batch File to move files to folders base on part of their name
我正在寻找一种解决方案,它可以帮助我将文件移动到名称相似的文件夹中。
我有像TEST1_2018P2.xlsx
、 TEST2_2018P2.xslx
等文件名。
我有名称为TEST1_City1
、 TEST2 City2
文件夹...
我需要的是将文件TEST1_2018P2.xlsx
移动到文件夹TEST1_City1
, TEST2_2018P2.xslx
到TEST2 City2
等等。
我怎样才能做到这一点?
这是我的最新代码,它也不起作用。
@ECHO OFF
SETLOCAL
SET "sourcedir=my_folder"
SET "destdir=my_folder"
FOR /f "delims=" %%a IN ( 'dir /b /a-d "%sourcedir%\*.xlsx" ' ) 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
我不确定您的确切任务,因此这个相对基本的示例应该将任何.xlsx
文件移动到第一个现有目录,其名称与文件名的下划线部分相匹配,并加上一个空格。
调整第2
行和第3
行的值以匹配您的实际目录规范(不带尾随反斜杠) 。
@Echo Off
Set "SourceDir=my_folder"
Set "DestDir=my_folder"
For /F Delims^=^ EOL^= %%A In ('Dir /B/A-D-L "%SourceDir%\*_*.xlsx" 2^>Nul'
) Do Call :Sub "%%A"
GoTo :EOF
:Sub
Set "DirName=%~1"
Set "DirName=%DirName:_="&:"%"
For /F Delims^=^ EOL^= %%A In ('Dir /B/AD-L "%DestDir%\%DirName% *" 2^>Nul'
) Do If Exist "%SourceDir%%~1" Move /Y "%SourceDir%\%~1" "%DestDir%\%%A" 2>Nul
Exit /B
它不是设计为执行任务的最有效方法!
另请注意,您现有的目录名称没有明确的模式,因此这是为TEST1 City1
TEST2 City2
等编写的。如果它们都是下划线,例如TEST1_City1
TEST2_City2
等, TEST1_City1
TEST2_City2
更改"%DestDir%\\%DirName% *"
11
到"%DestDir%\\%DirName%_*"
。 如果目录可以是其中之一,并且您确定没有两个目录以字符串TEST1
、 TEST2
等开头(在这种情况下,这将限制您只能使用数字 0..9),您可能可以使用"%DestDir%\\%DirName%?*"
作为替代方法位于第11
行。
假设TEST1
实际文本不包含任何_
字符,您可以使用:
@echo off
setlocal EnableDelayedExpansion
cd /d "your_folder"
for /F "delims= eol=" %%A IN ('dir /B /A-D "TEST*_2018P2.xlsx"') do (
for /F "tokens=1 delims=_" %%B IN ("%%A") do (
rem Define some important variables:
set "token_1=%%B"
set "num_test=!token_1:~-1!"
set "foldername=!token_1!_City!num_test!"
md "!foldername!\" >nul 2>&1
move "%%~fA" "!foldername!\"
)
)
让我解释一下我的代码:
for /F
循环用于查找您想要的所有文件 ( TEST*_2018P2.xlsx
),不包括所有目录 ( /AD
)和标题。 delims=
和eol=
选项:遍历整行而不跳过以;
开头的行;
.for /F
循环用于获取第一个循环( IN ("%%A")
)输出的第一个标记。
token_1
变量,然后token_1
减去最后一个数字/字母,将其设置为num_test
变量。token_1
变量 ( TESTn
)、 _City
和n
(number) 设置的。nul
。 if exist
语句,这恰好没有处理很多。 当前文件( %%~fA
;完整路径)被移动到这个文件夹。 请记住将"your_folder"
替换为您的实际文件夹!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.