0

批处理文件是否可以通过将上一个工作日的日期附加到文件名的末尾来重命名目录中的所有文件?

例如,如果我在 2012 年 2 月 25 日星期一运行它,它会将“_022213”添加到目录中文件名的末尾。

谢谢...

4

2 回答 2

0

干得好。

@echo off
setlocal enabledelayedexpansion
echo wd = Weekday^(Date^(^), vbSunday^)>yesterday.vbs
echo if wd ^< 3 then dif = -1 - wd else dif = -1 >>yesterday.vbs
echo d = dateadd^("d", dif, Date^(^)^)>>yesterday.vbs
echo wscript.echo DatePart^("yyyy",d^) ^& " " ^& DatePart^("m", d^) ^& " " ^& DatePart^("d", d^) >>yesterday.vbs
for /f "tokens=1-3" %%I in ('cscript /nologo yesterday.vbs') do (
    set year=%%I
    if %%J leq 9 (set month=0%%J) else set month=%%J
    if %%K leq 9 (set day=0%%K) else set day=%%K
)
del yesterday.vbs
set yesterday=%month%%day%%year:~-2%
for %%I in (*) do (
    set base=%%~nI
    echo !base:~-7!| findstr "^_[0-9]*$" >NUL && set base=!base:~0,-7!
    ren "%%I" "!base!_!yesterday!%%~xI"
)

Windows 批处理脚本中没有可以让您对日期执行数学运算的本机函数。VBscript 虽然有一些漂亮的日期数学函数。DateAdd 将允许您按年、季度、月或其他几个间隔进行加减。“w”指定工作日。 更多信息更新:显然“w”并不意味着它应该意味着什么。脚本已更新以手动执行数学运算。

您可以通过将 vbscript 回显到 .vbs 文件来借用 vbscript,然后cscript /nologo vbsfile使用for循环捕获 的输出。看看它是如何工作的?

然后拼凑起来[basename]_[yesterday with slashes stripped][extension]

于 2013-02-21T20:37:06.630 回答
0

对于仅批处理解决方案,请参阅 https://gist.github.com/DavidRuhmann/4666270

以下是如何使用链接中的批处理脚本方法。

@echo off
if /i "%Date:~0,3%"=="Sun" ( call :DaysAgo 2 ) else (
    if /i "%Date:~0,3%"=="Mon" ( call :DaysAgo 3 ) else ( call :DaysAgo 1 )
)
echo %Year% %Month% %Day%
于 2013-02-21T20:45:59.143 回答