Batch file 批处理文件-将计算日期添加到文件末尾

Batch file 批处理文件-将计算日期添加到文件末尾,batch-file,Batch File,您好,谢谢您的帮助!我需要一些与批处理脚本相关的专家帮助,我正在使用批处理脚本将日期添加到.xlsx文件的末尾。我的当前脚本工作正常,并将当前日期添加到文件末尾,但我需要的是以以下格式将当前日期减去12天以及当前日期减去6天添加到文件末尾:Test 20160807-20160813.xlsx。所以它是文件名测试,然后是YYYYMMDD(负12)-YYYYMMDD(负6).xlsx 以下是我当前使用的获取当前日期的脚本: setlocal enabledelayedexpansion for

您好,谢谢您的帮助!我需要一些与批处理脚本相关的专家帮助,我正在使用批处理脚本将日期添加到.xlsx文件的末尾。我的当前脚本工作正常,并将当前日期添加到文件末尾,但我需要的是以以下格式将当前日期减去12天以及当前日期减去6天添加到文件末尾:Test 20160807-20160813.xlsx。所以它是文件名测试,然后是YYYYMMDD(负12)-YYYYMMDD(负6).xlsx

以下是我当前使用的获取当前日期的脚本:

setlocal enabledelayedexpansion

for %%F in ("C:\test\*.xlsx") do ( 
    set "MDate=%%~tF"
    set "ParsedDate=!MDate:~6,4!!MDate:~0,2!!MDate:~3,2!"
    copy %%F %%~dpnF!ParsedDate!%%~xF.new )

for %%F in ("C:\test\*.xlsx") do ( 
    del %%F )

ren "C:\test\*.new" *.

exit
输出是Test20160815.xlsx,我需要测试
20160807-20160813.xlsx

批脚本-从当前日期减去(或添加)天 您可以使用批处理脚本来执行此操作,该脚本设置日期变量,并从执行批处理脚本的当前日期中减去1天(或任何天数)

我在脚本中添加了更多的注释来解释每个变量的作用等等,但基本上你可以像往常一样在批处理脚本中设置变量,它将使用这些变量为每个需要的日期计算构建三个动态VB脚本(for-6和three-12)来进行日期减法计算,在需要的地方添加前导零,YYYY、MM和DD变量也是如此

要添加:您还可以使用此脚本通过删除减号
-
将天数添加到当前日期
例程中下面批处理脚本中的符号:dynamicvbscriptbuild
因此,在看到此
的地方,-%MinusDay%,
只需删除减号即可在这些行中的每一行上获得
,%MinusDay%,
,现在
MinusDay=
变量值将等于您要添加的天数

重要注意事项:使用
MinusDays=
值进行减法时,五个9(
99999
)似乎是批处理脚本的限制。当使用
MinusDays=
值进行添加时,似乎六个9(
999999
)是批处理脚本的限制

(我插入了批处理逻辑,其中需要减去一些调整以处理带有空格的文件,等等,但这些设置为
set MinusDay12=12
S
ET MinusDay6=6
用于计算-12天和-6天的值。)

批处理脚本

 @ECHO ON

::// Minus days is the number of days to subtract from the CURRENT DAY i.e. 2 for minus 2 days or 99999 for minus 99999 days from when it's run
SET MinusDay12=12
SET MinusDay6=6

:: This calls the temp vbs script routine that will be used to set YYYY-MM-DD values for the subtracted days date you specify
CALL :DynamicVBSScriptBuild

FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%YYYYTmpVBS12%"') DO SET YYYY12=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%MMTmpVBS12%"') DO SET MM12=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%DDTmpVBS12%"') DO SET DD12=%%A

FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%YYYYTmpVBS6%"') DO SET YYYY6=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%MMTmpVBS6%"') DO SET MM6=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%DDTmpVBS6%"') DO SET DD6=%%A

::// Set variables for YYYY MM DD values accordingly
SET DateValue12=%YYYY12%%MM12%%DD12%
SET DateValue6=%YYYY6%%MM6%%DD6%

SET SourceDir=C:\Test
FOR %%F in ("%SourceDir%\*.xlsx") DO ( 
    COPY /Y "%%~F" "%%~DPNF%DateValue12%-%DateValue6%%%~xF.new" )

FOR %%F IN ("%SourceDir%\*.xlsx") DO ( 
    DEL /Q /F "%%~F" )

REN "%SourceDir%\*.new" *.

EXIT /B

GOTO EOF

:DynamicVBSScriptBuild
SET YYYYTmpVBS12=%temp%\~tmp_yyyy12.vbs
SET MMTmpVBS12=%temp%\~tmp_mm12.vbs
SET DDTmpVBS12=%temp%\~tmp_dd12.vbs
SET YYYYTmpVBS6=%temp%\~tmp_yyyy6.vbs
SET MMTmpVBS6=%temp%\~tmp_mm6.vbs
SET DDTmpVBS6=%temp%\~tmp_dd6.vbs
IF EXIST "%YYYYTmpVBS12%" DEL /Q /F "%YYYYTmpVBS12%"
IF EXIST "%MMTmpVBS12%" DEL /Q /F "%MMTmpVBS12%"
IF EXIST "%DDTmpVBS12%" DEL /Q /F "%DDTmpVBS12%"
IF EXIST "%YYYYTmpVBS6%" DEL /Q /F "%YYYYTmpVBS6%"
IF EXIST "%MMTmpVBS6%" DEL /Q /F "%MMTmpVBS6%"
IF EXIST "%DDTmpVBS6%" DEL /Q /F "%DDTmpVBS6%"
ECHO dt = DateAdd("d",-%MinusDay12%,date) >> "%YYYYTmpVBS12%"
ECHO yyyy = Year(dt)                    >> "%YYYYTmpVBS12%"
ECHO WScript.Echo yyyy                  >> "%YYYYTmpVBS12%"
ECHO dt = DateAdd("d",-%MinusDay12%,date) >> "%MMTmpVBS12%"
ECHO mm = Right("0" ^& Month(dt),2)     >> "%MMTmpVBS12%"
ECHO WScript.Echo mm                    >> "%MMTmpVBS12%"
ECHO dt = DateAdd("d",-%MinusDay12%,date) >> "%DDTmpVBS12%"
ECHO dd = Right("0" ^& Day(dt),2)       >> "%DDTmpVBS12%"
ECHO WScript.Echo dd                    >> "%DDTmpVBS12%"
ECHO dt = DateAdd("d",-%MinusDay6%,date) >> "%YYYYTmpVBS6%"
ECHO yyyy = Year(dt)                    >> "%YYYYTmpVBS6%"
ECHO WScript.Echo yyyy                  >> "%YYYYTmpVBS6%"
ECHO dt = DateAdd("d",-%MinusDay6%,date) >> "%MMTmpVBS6%"
ECHO mm = Right("0" ^& Month(dt),2)     >> "%MMTmpVBS6%"
ECHO WScript.Echo mm                    >> "%MMTmpVBS6%"
ECHO dt = DateAdd("d",-%MinusDay6%,date) >> "%DDTmpVBS6%"
ECHO dd = Right("0" ^& Day(dt),2)       >> "%DDTmpVBS6%"
ECHO WScript.Echo dd                    >> "%DDTmpVBS6%"
GOTO EOF
进一步资源

我想看看PJI在9月1日的表现如何。在上面的代码中,我似乎找不到当一个月的某一天实际少于13号时的检查位置。如果不创建一个日期索引,然后从索引号中减去12,我就无法克服这个问题。我昨天做了这个,实际上把减法增加到了16天,所以我能够确认16天前,昨天,返回了7月30日的结果

我创建了一个,但没有在前一个响应者之前及时发布,但我试图最小化复杂性。然而,矿山依赖于外部信息源。。。包含日期的索引文件(CSV格式)。从今年一月份开始,我把它延长了1000天

您必须将CSV文件放在批处理文件正在“运行”的同一位置。我将其放在引号中,因为您可以在任务计划程序中更改运行位置。但大多数情况下,您只需将CSV文件与批处理文件放在同一文件夹中:

代码的扩展视图 可以更改上面的回显行以按您的意愿重命名文件。您可以使用以下选项:

rename oldfilename.xlsx %m-%q.xlsx
我把回声放在例子中,这样你就可以看到函数的工作

折叠的代码视图,就像在批处理文件中一样 4行

下面是上面复制并粘贴到命令提示符中的代码块中的批处理代码的屏幕截图。我将dateidx.csv文件放在c:\test文件夹中:

这项工作完美无瑕!我非常感谢您的帮助,感谢您花时间彻底解释代码并将我的原始逻辑合并到解决方案中。如果有什么办法可以给你加分的话,我会帮你买几杯饮料!PowerShell的可能复制将使您的生活更加轻松(就像我在您的复制问题中提到的)。
rename oldfilename.xlsx %m-%q.xlsx
for /f "tokens=1-3 delims=,D" %i in ('type dateidx.csv ^| find /i "%date:~10,4%%date:~4,2%%date:~7,2%"') do (set dateidxnum=%j)
set /a days12ago=%dateidxnum%-12
set /a days6ago=%dateidxnum%-6
for /f "tokens=1 delims=," %m in ('type dateidx.csv ^| find "D%days12ago%"') DO (for /f "tokens=1 delims=," %q in ('type dateidx.csv ^| find "D%days6ago%"') DO (echo %m-%q.xlsx))