批处理文件按文件名 mmdd 分隔

批处理文件按文件名 mmdd 分隔

所以我有这个想法,按日期分类我们的文件。我们将这些文件命名为 Zxxx,后跟 mmdd,其中 x 是数字,mmdd 是月份和日期。我最初的想法是逐个进行分类

@echo off 
cd C:\folder

set /p var="Enter mmdd: "

md %var%

copy c:\folder\*%var%.txt c:\folder\%var%

exit

现在我的问题是...有没有办法让它自动创建文件夹并将具有相同 mmdd 的文件移动到创建的 mmdd 文件夹中。有点像用户单击批处理文件,然后计算机看到 5 个项目,即 1208 mmdd 和 3 1209 mmdd。它创建 1208 文件夹和 1209 文件夹并分别将文件放入其中。

编辑:所以它尝试使用 for 循环并存在

 @echo off

FOR /L %%x IN (101,1,931) DO ( IF EXIST "????0%%x.txt" MKDIR 0%%x )
FOR /L %%x IN (101,1,931) DO ( IF EXIST "????0%%x.txt" MOVE "????0%%x.txt" \0%%x\ )
FOR /L %%x IN (1001,1,1231) DO ( IF EXIST "????%%x.txt" MKDIR 0%%x )
FOR /L %%x IN (1001,1,1231) DO ( IF EXIST "????%%x.txt" MOVE "????0%%x.txt" \0%%x\ )
pause

但出现错误“无法将多个文件移动到一个文件。”

答案1

您可以为此使用日期变量的子字符串。

Syntax:
      %variable:~num_chars_to_skip%
      %variable:~num_chars_to_skip,num_chars_to_keep%

摘自 SS64。

提取年、月、日的方法如下:

set year=%date:~-4%
set month=%date:~-7,2%
set day=%date:~-10,2%

您现在可以引用这些,例如通过使用mkdir C:\folder\%year%\%month%-%day%来创建类似的结构C:\folder\2017\01-25\

如果您需要更强大的日期处理功能,请考虑转向 powershell。

答案2

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
cd /D C:\folder
For %%A in (z*.txt) Do Echo:%%A|Findstr /i "^z[0-9][0-9][0-9][01][0-9][0-3][0-9].txt$" >NUL 2>&1 &&(
  Set Filename=%%A
  Set MMDD=!Filename:~3,4!
  If Not Exist !MMDD! MD !MMDD!
  Move %%A !MMDD!
)
  • for 迭代匹配的文件
  • Echo:%%A|Findstr... 粗略验证 MM/DD 的 7 个数字模式
  • 必须使用!而不是%vars,因为它位于需要延迟扩展的(代码块)内。
  • !Filename:~3,4!是从零开始从第 4 位提取 4 个数字的子字符串表达式。

相关内容