【问题标题】:Batch File moving files by date with Looping使用循环按日期移动文件的批处理文件
【发布时间】:2019-08-11 08:44:58
【问题描述】:

我们正在尝试使用批处理文件将文档移动到特定的子目录中。这些文件都以日期格式开头:mmddyyyy_filename。我们的文件夹结构是这样的:c:\client\user\year\month。文件全部下载到 c:\client\user 目录中。从那里我们必须将文件分类到相应的年份,然后再分类到相应的月份。其中一些目录将包含 10000 多个文件,因此手动操作非常耗时。我们创建了一个批处理文件,允许我们为客户端、用户、年份和月份设置一个变量,但如果可能的话,我们希望自动循环遍历月份和年份。当前的批处理文件如下所示:

@echo off

:client
set /p client= Which client?

:Provider
set /p provider= Which provider (First initial, last name)?
/k if %provider% == clean GOTO Cleanup
/k if %provider% == x GOTO client
/k if %provider% == *. * GOTO Year

:Year
set /p year= Which year (4 digit year)?
if %year% neq 2019 GOTO Month
if %year% == 2019 GOTO provider

:Month
set /p month= Which month (2 digit number)?
if %month% neq 13 GOTO Command
if %month% == 13 GOTO Year

:Command
E:
cd E:\Backups\"%client%"\"%Provider%"\
move %month%??%year%_* E:\Backups\"%client%"\"%Provider%"\%year%\%month%
GOTO Month

:Cleanup
ROBOCOPY "E:\Backups\%client%" "E:\Backups\%client%" /S /MOVE
GOTO client

而不是单独输入月份,01、02、03 等......我们希望它在没有任何用户输入的情况下循环遍历这些月份中的每个月份。理想情况下,它也会循环到 2007-2018 年。目前,当我们输入第 13 个月时,它将返回到年份提示符,当我们输入 2019 时,它将返回到提供者提示符。

任何帮助实现这一点都会很棒!

【问题讨论】:

  • 一条建议:首先使用/L 开关执行您的Robocopy:它会显示您想要执行的所有操作,然后您可以检查是否一切正常,然后才删除/L 来自您的Robocopy,您将确保所有复制命令都是正确的。
  • 我已经测试了 Robocopy 命令,它确实像我们希望的那样运行。不过谢谢。
  • 要么使用for /L 循环,要么使用disassemble 文件名。
  • 我尝试过使用 for /L 循环,但我无法让它超过第一个月,它只是一遍又一遍地循环 01::loop for /L %%i in ( 1, 1, 13) do ( call :Command set "month=0%%i" !month:~-2!)
  • 如果您使用set 并在代码块中使用它,您需要enabledelayedexpansion 参见set /?

标签: loops batch-file


【解决方案1】:

这可能无法按预期工作,因为您的示例不完整,但它是为了展示您非常要求的内容。

它将提示我使用moveclean 作为示例的任务(您想要执行的任务)。询问提供者和客户。该循环将每年和该年的每个月执行,您可以根据需要添加/删除。

@echo off
set "mm=01 02 03 04 05 06 07 08 09 10 11 12"
set "yyyy=2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019"
set /p "task=enter task (clean, move): "
set /p "client=Which client?: "
set /p "provider= Which Provider? (Initial, Lastname): "
if "%task%"=="clean" (
     echo robocopy "E:\Backups\%client%" "E:\Backups\%client%" /S /MOVE
  )
)
if /i "%task%"=="move" (
for %%a in (%yyyy%) do for %%i in (%mm%) do (
      echo mkdir "E:\Backups\%client%\%provider%\%%a\%%i" 2>nul
      echo move %%i??%%a_* "E:\Backups\%client%\%provider%\%%a\%%i"
  )
)

注意!!以上只是将echo循环内的命令作为安全功能,删除echo命令将执行实际任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2023-04-08
    相关资源
    最近更新 更多