使批处理脚本在日期不可靠

时间:2017-07-20 08:09:45

标签: date batch-file

我有一个每天运行的自制批处理脚本,作为一个简单的复制作业,可以将文件从网络驱动器复制到本地驱动器。目前,该脚本工作正常一个月,但必须每月和每年进行编辑,以便它继续工作,因为复制的一些文件是依赖于日期的。

它是这样的:

for %%I in (infdb.dat infdb.ix kunde.DAT kunde.ix L170701.DAT L170701.DIA L170701.IX perso.dat perso.ix TI*FR.DAT TI*FR.IX TILKA.DAT TILKA.IX) do copy %%I C:\bbsud1\

文件L170701.DAT L170701.DIA L170701.IX取决于日期,因为它们以LYYMMxx命名。我需要我的批处理脚本来解释这个问题,因为它需要能够分辨出我们所处的年份和月份,以及"地点"关于这3个文件的那个日期,所以我得到正确的,取决于它是什么月份/年。

我一直在寻找答案,但却找不到容易或具体的东西。

3 个答案:

答案 0 :(得分:0)

使用wmic以区域设置/用户设置独立格式获取日期:

@Echo off
for /f "delims=." %%A in (
  'wmic os get LocalDateTime^|findstr ^^[0-9]'
) do Set DT=%%A
Set "yymm=%DT:~2,4%"

for %%I in (
    infdb.dat infdb.ix kunde.DAT kunde.ix 
    Lc%yymm%01.DAT L%yymm%01.DIA L%yymm%01.IX 
    perso.dat perso.ix TI*FR.DAT TI*FR.IX TILKA.DAT TILKA.IX
) do copy %%I C:\bbsud1\

答案 1 :(得分:0)

至少有两种可能的解决方案可以获得当前年份而没有世纪和月份的两位数。

第一个独立于使用帐户的区域和语言设置。

@echo off
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "LocaleDateTime=%%I"
set "FileNameDate=%LocaleDateTime:~2,4%"
for %%I in (
    infdb.dat infdb.ix kunde.DAT kunde.ix
    L%FileNameDate%01.DAT L%FileNameDate%01.DIA L%FileNameDate%01.IX
    perso.dat perso.ix TI*FR.DAT TI*FR.IX TILKA.DAT TILKA.IX
) do copy %%I C:\bbsud1\ >nul 2>nul

此变体类似于LotPings发布的解决方案,但由于不需要 FINDSTR ,因此速度稍快一些。请阅读%date% produces different result in batch file when run from Scheduled Tasks in Server 2016上的答案,了解 FOR 循环的完整说明,并使用 WMIC 命令。

缺点是 WMIC 需要超过一秒的时间来输出本地日期/时间。

第二种解决方案使用环境变量 DATE

要快得多
@echo off
set "FileNameDate=%DATE:~-2%%DATE:~-7,2%"
for %%I in (
    infdb.dat infdb.ix kunde.DAT kunde.ix
    L%FileNameDate%01.DAT L%FileNameDate%01.DIA L%FileNameDate%01.IX
    perso.dat perso.ix TI*FR.DAT TI*FR.IX TILKA.DAT TILKA.IX
) do copy %%I C:\bbsud1\ >nul 2>nul

缺点是此解决方案取决于Windows 区域和语言设置中定义的日期格式,分别取决于所选国家/地区的日期格式设置。

如果echo %DATE%输出20.07.2017Thu, 20/07/2017,则上述代码有效。

如果日期格式为MM/DD/YYYY而没有或在工作日开始时,必须修改字符串替换:

set "FileNameDate=%DATE:~-2%%DATE:~-10,2%"

但是,如果一个月<输出10时没有前导0,如Thu, 20/7/2017

for /F "tokens=2,3 delims=./" %%I in ("%DATE:~-10%") do set "FileNameDate=%%J0%%I"
set "FileNameDate=%FileNameDate:~2,2%%FileNameDate:~-2%"

因此,使用环境变量 DATE 时执行速度更快的优势需要了解日期格式,这就是基于 DATE 的代码不经常在Stack Overflow上发布的原因。< / p>

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • copy /?
  • echo /?
  • for /?
  • set /?

另请阅读Microsoft文章Using Command Redirection Operators,了解>nul2>nul的解释,通过将两者重定向到设备来抑制 COPY 输出的成功和错误消息的 NUL

答案 2 :(得分:0)

我找到了一个功能,我修改了它以添加更多变量,例如,它甚至可以提供您当前的时区。它使用命令“wmic os get LocalDateTime”。

具有简短描述的当前变量列表:

D

用法示例:

E

脚本:

- _YYYY          (Year)
- _MM            (Month)
- _DD            (Day)
- _HR            (Hour)
- _MN            (Minutes)
- _SC            (Secondes)
- _ML            (Millisecondes)

- _TIMEZONE_M    (Timezone - Minutes)
- _TIMEZONE_H    (Timezone - Hours:Minutes)

- _DATE          (YYYY-MM-DD)
- _TIME_MN       (HR:MN)
- _TIME_SC       (HR:MN:SC)