【问题标题】:Batch file to move PDF files based on date, create folder if necessary批处理文件以根据日期移动 PDF 文件,必要时创建文件夹
【发布时间】:2013-10-02 22:57:50
【问题描述】:

我对批处理文件比较陌生。我可以做非常简单的,但是下一个让我陷入困境。

我们有一个程序可以为客户生成 PDF 报价,以下列方式保存...

名字姓氏_估计_MMDDYYYY-###

例如,如果我有一个客户“John Doe”,我们在今年圣诞节前夕给了他一个估计值(我们系统中的第 239 位),它看起来像这样。

JohnDoe_Estimate_12242013-239.pdf

现在它位于“C:\Estimates”文件夹中。我希望批处理文件执行的是查看“C:\Estimates”文件夹中的所有文件并自动移动按年份排序的文件。因此,所有 2012 年的估算值都放在“C:\Estimates\2012”文件夹中,2013 年在“C:\Estimates\2013”​​等文件夹中。

这里的一些批处理文件让我很接近,但没有雪茄。任何帮助都会很棒。谢谢!

【问题讨论】:

  • 请包含代码 - 现有批处理文件中使您接近的部分,以及它们的不足之处。一般来说,将工作分解成小块并编写代码以正确执行单个块,然后组合这些部分。另外:它必须是一个批处理文件吗?与 python 或 ruby​​ 等其他脚本语言相比,批处理文件通常既不可靠也不易于用于任何复杂程度不高的事情。

标签: batch-file


【解决方案1】:

C:\Estimates 文件夹中启动它。文件名不应在客户端名称中包含 _-

@echo off
setlocal disabledelayedexpansion
for %%a in (*.pdf) do (
   for /f "tokens=3 delims=_-" %%b in ("%%a") do (
    set variable=%%b
       setlocal enabledelayedexpansion
         set variable=!variable:~-4!
         md !variable! 2>nul
         move "*!variable!-*.pdf" !variable! >nul
       endlocal
  )
)

【讨论】:

  • 这里if exist的目的是什么?外部for 不会返回不存在的条目,那么为什么要测试它们的存在呢?
  • 我想我得到了延迟扩展的权利。我认为if exist 是必需的,因为for /f 在开始之前会收集所有文件名,并且在循环中move 命令删除的不仅仅是%%a 中的文件名,因此%%a 中的后续文件名不会找到了。
  • 您认为移动if 以便在文件不存在时也省略内部循环是否更有意义?在我看来它应该没问题,这可能会给你的性能带来一点提升。另一方面,endlocal 不需要参数(它只是 endlocal),但在脚本开头放置 setlocal disabledelayedexpansion 可能是个好主意,以确保 !不会被不必要地消耗。
  • @AndriyM 现在你提到它 - 外部 for 将单个文件传递给 for /f 的循环这么多 if exist 不是需要。我不确定,但这里不会痛,所以我会把它留在里面。
猜你喜欢
  • 1970-01-01
  • 2019-11-01
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多