【问题标题】:Batch File Windows批处理文件窗口
【发布时间】:2012-08-27 09:58:52
【问题描述】:
P1=c:\users\a\
P2=c:\users\b\
Q1=c:\users\c\
Q2=c:\users\d\
olderthan=7

P1 和 P2 是源目录 Q1 和 Q2 是目标目录

此逻辑背后的目的是从 P1 和 P2 目录中查找超过 7 天的文件。那些旧文件应该复制到 Q1 和 Q2 并从 P1 和 p2 中删除。

我使用以下逻辑为 P1 到 Q1 完成了它:

FORFILES -p %P1% /d -%olderthan% -m *.%extension% -c "CMD /C XCOPY %P1%\@FILE %Q1%"
FORFILES -p %P1% /d -%olderthan% -m *.%extension% -c "CMD /C if exist %Q1%\@FILE del %P1%\@FILE /Q & echo @FILE Deleted." >> %loglocation%

但是如何使用 for 循环或任何其他逻辑对 P1 到 Q1 以及 P2 到 Q2 执行此操作?

【问题讨论】:

  • 使用纯 CMD 批处理文件需要在 FOR 命令循环中解析来自 DIR 命令的每个日期。如果您担心性能,您可能希望改用 VBScript
  • 我只需要 CMD 批处理文件。不需要 VB 脚本........

标签: batch-file batch-processing


【解决方案1】:

没有任何单个循环可以处理多个源和目标对。您需要分别对每一对应用相同的逻辑。也许一个子程序会简化事情。

您可以通过将 XCOPY 和 DEL 命令替换为单个 MOVE 命令来简化逻辑。

FORFILES /D 选项使用“小于或等于”逻辑,而不是“小于”。如果您确实要移动超过 7 天的文件夹,则需要使用值 8。

我在路径周围添加了引号,以防万一您得到包含空格的路径。引号需要在命令字符串中加倍。

我通过使用文件掩码参数而不是扩展参数使例程更加灵活。

@echo off
call :moveOldFiles c:\users\a *.txt 7 c:\users\c >>mylog.log
call :moveOldFiles c:\users\b *.txt 7 c:\users\d >>mylog.log
exit /b

:moveOldFiles  sourceDir  extension  minAgeInDays  destinationDir
forfiles /p "%~f1" /m %2 /d -%3 -c "cmd /c move /y @path ""%~f4\"" && echo @path moved to "%~f4"""
exit /b

您确实应该考虑使用 ROBOCOPY 而不是 FORFILES。它应该表现更好,并且非常灵活。与 FORFILES 一样,您需要为每个源/目标对调用一次 ROBOCOPY。

【讨论】:

  • 编辑 - 使用 && 而不是 & 所以只有在移动成功时才会输出消息
  • 感谢您的快速响应。将文件移动到文件夹 c 和 d 后。我想压缩文件。这个怎么做? Zip 文件名应为当前日期和年份。提前致谢。
猜你喜欢
  • 1970-01-01
  • 2014-02-23
  • 2012-06-19
  • 2016-12-30
  • 2010-10-21
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多