如果文件太旧则跳过脚本的批处理代码

Batch Code to Skip Script if File is too Old

我的问题

由于有大量线程解决 'using a batch file to return file modify date'(或删除早于的文件等)- 让我首先说明我的问题。

我想创建一个 批处理(不是 PowerShell 等),它将 return 给定 特定文件的最后修改日期UNC 路径和文件名。

代码,尝试 1

我已经在其他线程上浏览了一些可能的解决方案,但我 运行 发现了许多独特的问题。第一个也是最明显的解决方案是批处理 "ForFiles" 命令。例如:

set myPath=\myUNCpath
set myFile=myFileName.csv

forfiles /p "%myPath%" /m %myFile% /c "GoTo OldFile" /d -6 

因此,如果文件比我想要的要旧——请跳转到我的批处理的特定部分。但是,这会产生错误:

ERROR: UNC paths (\machine\share) are not supported.

但是,由于使用了 UNC(这很关键,因为系统的任务调度程序调用了此批处理),此 cmd 将无法运行。所以看起来 'ForFiles' cmd 已经用完了。

代码,尝试 2

我可以更全面地了解执行此操作的方式,但只需检索文件的最后修改日期(批量将 return 一个字符串)。我可以将字符串 运行 分类为必要的日期值,转换为日期,然后与当前日期进行比较。为此,我还研究了使用 for 循环,例如:

set myFile=\myUNCpath\myFileName.csv
echo %myFile%
pause

FOR %%f IN (%myFile%) DO SET myFileDate=%%~tf
echo %myFileDate%
pause

虽然我的第一个调试 echo 提供了正确的完整文件名,但我的第二个调试只是 returns ECHO 关闭。,这告诉我它要么没有找到文件或 for 循环不是 returning 文件日期。不知道为什么。

我也尝试对此进行细微更改,只是为了仔细检查环境变量语法:

FOR %%f IN (%myFile%) DO SET myFileDate=%%~ta

Returns %ta

最后:

FOR %%f IN (%myFile%) DO SET myFileDate=%~ta

如果没有额外的“%”,只会使批处理崩溃。

此时我真的很茫然。因此,我们将不胜感激任何提示或指导!

可以使用 PushD 使用 forfiles 到 UNC 路径

如果只回显 UNC 路径中早于 x 的文件,只需使用

PushD %myPath% &&(
forfiles -s -m %myFile% -d -6 -c "cmd /c echo /q @file 
 ) & PopD

如果使用您的示例在 UNC 路径中找到早于 x 的文件,这是如何使用 goto 的一种方法。

if not exist "C:\temp" mkdir C:\temp
if not exist "C:\temp\test.txt" echo.>"c:\temp\test.txt"
break>"c:\temp\test.txt"

set myPath=\myUNCpath
set myFile=myFileName.csv

PushD %myPath% &&(
forfiles -s -m %myFile% -d -6 -c "cmd /c echo /q @file >> c:\temp\test.txt" 

 ) & PopD

for /f %%i in ("C:\temp\test.txt") do set size=%%~zi
if %size% gtr 0 goto next

:next

非常感谢@Squashman 和@MadsTheMan 的帮助。幸运的是,这批 finally 是我可以交给我的老板使用 PowerShell 将切换到 至少 的代码!

无论如何,对于那些正在寻找获取 UNC 路径文件的修改日期的最佳方法的人来说,这就是我想出的方法。与其他线程没有太大区别(感谢 Squashman 在 for 循环中发现我丢失的“”)。

set myFile=\myUNCpath\myFileName.ext

FOR %%f IN ("%myFile%") DO SET myFileDate=%%~tf

::And if you'd like to try to do long winded calculations you can further break the dates down via...
set fileMonth=%myFileDate:~0,2%
set fileDay=%myFileDate:~3,2%
set fileYear=%myFileDate:~6,4%

set currentDate=%date%
set currentMonth=%currentDate:~4,2%
set currentDay=%currentDate:~7,2%
set currentYear=%currentDate:~10,4%

计划是将字符串转换为整数,然后使用 switch-case 块来确定日期之间的差异是否可以接受...等等等等。

长话短说 - 如果您仅限于批处理(而不是创建辅助文件 - 例如 csv 或 MadsTheMan 建议的临时文件),您手上的脚本仍然很长当您可以使用其他程序中的一行代码进行比较计算时,可能会有缺陷(如闰年等,除非您添加更多代码)。