【问题标题】:windows batch file - Date replacementwindows批处理文件 - 日期替换
【发布时间】:2017-08-11 20:39:38
【问题描述】:

试图从远程服务器驱动器复制 2 个文件。需要替换文件名中的当前日期、月份和年份。

File1 : plugin_229_InventoryService-2017-08-11.log  (current day)

File2: plugin_229_InventoryService-2017-08-10.log  (previous day)

echo off
cls

::: Begin set date

for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (call :set_date %%i %%j %%k %%l)
goto :end_set_date

:set_date
if "%1:~0,1%" gtr "9" shift
for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo,^|date') do (set %%m=%1&set %%n=%2&set %%o=%3)
goto :eof

:end_set_date
::: End set date

echo day in 'DD' format is %dd%; month in 'MM' format is %mm%; year in 'YYYY' format is %yy%

COPY "\\20.137.181.232\d$\Program Files\folder1\folder2\.folder3\folder4\folder5\channels\plugin_229_InventoryService-%yy%-%mm%-%dd%.log"  "D:\Folder\Master_232\"
COPY "\\20.137.181.232\d$\Program Files\folder1\folder2\.folder3\folder4\folder5\channels\plugin_229_InventoryService-%yy%-%mm%-(%dd%-1).log"  "D:\TDG\Master_232\"

输出错误:

'DD' 格式的天是 11; 'MM' 格式的月份是 08; 'YYYY' 中的年份 格式为 2 017

系统找不到指定的文件。系统找不到 指定文件。

有什么建议吗?

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:

    我不会使用依赖于语言环境/用户设置的日期/时间变量,而是使用 Powershell 进行日期计算。

    @echo off
    cls
    For /f %%T in ('powershell -NoP -C "get-date -f yyyy-MM-dd"') Do Set ToDay=%%T
    For /f %%Y in ('powershell -NoP -C "(get-date).AddDays(-1).ToString(\"yyyy-MM-dd\")"') Do Set Yesterday=%%Y
    Echo Today     : %ToDay%
    Echo Yesterday : %Yesterday%
    Set "RemotePath=\\20.137.181.232\d$\Program Files\folder1\folder2\.folder3\folder4\folder5\channels"
    Echo COPY "%RemotePath%\plugin_229_InventoryService-%ToDay%.log"  "D:\Folder\Master_232\"
    Echo COPY "%RemotePath%\plugin_229_InventoryService-%YesterDay%.log" "D:\TDG\Master_232\"
    

    复制命令仅用于测试目的,
    如果输出看起来正常,请删除回声。

    样本输出:

    Today     : 2017-08-12
    Yesterday : 2017-08-11
    COPY "\\20.137.181.232\d$\Program Files\folder1\folder2\.folder3\folder4\folder5\channels\plugin_229_InventoryService-2017-08-12.log"  "D:\Folder\Master_232\"
    COPY "\\20.137.181.232\d$\Program Files\folder1\folder2\.folder3\folder4\folder5\channels\plugin_229_InventoryService-2017-08-11.log" "D:\TDG\Master_232\"
    

    【讨论】:

      【解决方案2】:
      COPY "\\20.137.181.232\d$\Program Files\folder1\folder2\.folder3\folder4\folder5\channels\plugin_229_InventoryService-%yy%-%mm%-(%dd%-1).log"  "D:\TDG\Master_232\"
      

      您的问题是 (%dd%-1) 是按字面解释的。批处理将其所有变量存储为字符串,尽管set/a 命令根据所涉及的公式读取字符串并写入字符串。

      所以源文件的名称是...-08-(11-1).log 不太可能存在...

      您需要使用set/a 进行计算并将输出分配给另一个变量。

      set /a yesterday=dd-1
      

      (set /d 不需要%dd% - 它可以处理dd

      但是要小心。通过该计算,前一天将变为 9,这与 09 不同。同样, 的前一天将涉及dd=09,并且由于批处理将以0 开头的字符串视为八进制字符串,因此计算dd-1 会产生错误。 p>

      通常的解决方法是使用批处理的基于字符串的架构。

      set /a yesterday=1%dd%-1
      

      将生成一个数字130..100。如果您取最后 2 个字符,您可以根据需要使用方便的前导 0,因此您可以使用 %yesterday:~-2% 作为文件名。

      而且 - 嗯,同样的论点适用于月份,如果 dd=01,你将需要它。

      那么您所要做的就是解决一月份的问题。

      哦 - 还有闰年。请记住,月份可能是 28、29、30 或 31 天......

      所有这些可以完成,只要付出足够的努力 - 但至少 file not found 的原因被揭示了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多