批量格式化文件日期YYYYMMDD

时间:2012-06-18 12:56:01

标签: batch-file dos

我一直在研究批处理文件中的一些代码来评估两个文件日期。如果一个日期大于另一个日期,那么它将运行另一个bat文件。我想要做的是将两个日期格式化为YYYYMMDD,以便我可以使用GTR大于)。

代码在下面,但如果我使用==等于),它会起作用,因为它正在评估字符串。我只想知道一个文件日期是否大于另一个文件日期。

我不是要求有人修改下面的代码,但如果你能告诉我如何格式化日期,我将非常感激。


set Fileone=File1.txt
set FileTwo=File2.txt

pushd "D:\Board\Broadcast\FA_Report8_A"
FOR %%f IN (%FileOne%) DO SET filedatetime=%%~tf
FOR %%f IN (%FileTwo%) DO SET filedatetime2=%%~tf
SET filedatetime2=%year%%month%%day%
IF %filedatetime:~0, 10% GTR %filedatetime2:~0, 10% ( 
echo FileOne Greater - run bat
timeout /t 20 /nobreak
goto Finish
) else (
echo FileOne not Greater - Finish
goto Finish
)
:Finish
echo finished 
pause

3 个答案:

答案 0 :(得分:10)

在具有不同日期格式的计算机之间不可移植,但最简单的方法是使用子字符串:%var:~STARTPOS,LENGTH%

set filedatetime=14/06/2012 12:26
set filedatetime=%filedatetime:~6,4%%filedatetime:~3,2%%filedatetime:~0,2%
echo "%filedatetime%"

"20120614"

答案 1 :(得分:2)

您可以使用FOR / F命令分隔其部件中的日期:

set filedatetime=14/06/2012 12:26
for /F "tokens=1-3 delims=/ " %%a in ("%filedatetime%") do (
   set filedatetime=%%c%%b%%a
)

此表单可以防止您在每个子字符串的位置或大小上出错,并且很容易更改部件的顺序。例如,如果您的日期是MM / DD / YYYY:

set filedatetime=%%c%%a%%b

输入FOR /?有关详细信息。

答案 2 :(得分:1)

系统中日期变量字符串的布局可以通过用户的设置,区域和/或语言来假定,因此,日期不是100%可预测的布局。


尝试使用 wmic OS Get localdatetime /value ,因为结果是100%可预测的:

  

LocalDateTime=20190609123708.733000-180

因此,如果在for循环中使用,添加2个定界符,例如 =. (等号和点),则会得到以下字符串输出:

  

20190609123708

此命令的布局是可预测的,并且与区域设置,用户设置或系统语言无关,因此,该命令将始终返回:

set _date=20190609123708
rem :: %_date:~0,4%_%_date:~4,2%_%_date:~6,2%
rem ::   year:2019 |  month:06  | day:09

在蝙蝠文件中:

 @echo off & for /f "tokens=2delims==." %%i in ('wmic OS Get localdatetime /value ^|findstr /r [0-9]')do set "_date=%%i" & echo/%_date:~0,4%%_date:~4,2%%_date:~6,2%

在命令行中:

for /f "tokens=2delims==." %i in ('wmic OS Get localdatetime /value ^|findstr /r [0-9]')do set "_data=%i" & mkdir %_date:~0,4%_%_date:~4,2%_%_date:~6,2%

此命令的结果为::

    20190609


我也可以建议:

wmic Path Win32_LocalTime Get Day,Month,Year 

在循环中:

@echo off & setlocal enabledelayedexpansion & set "_do=wmic Path Win32_LocalTime Get Day^,Month^,Year" 
for /f "tokens=1-3delims= " %%a in ('!_do!^|findstr /r [0-9]')do set "y=%%c" & set "d=0%%a" & set "m=0%%b"
echo/!y!!m:~-2!!d:~-2! >nul 

结果:

Day  Month  Year
 9   6      2019 
%%a  %%b    %%c

月/日的数字差异不为零,也不小于9,因此,在这种情况下,您可以使用此蝙蝠将前导零置于

@echo off & setlocal enabledelayedexpansion & set "_do=wmic Path Win32_LocalTime Get Day^,Month^,Year" 
for /f "tokens=1-3delims= " %%a in ('!_do!^|findstr /r [0-9]')do set "y=%%c" & set "d=0%%a" & set "m=0%%b"
echo/!y!!m:~-2!!d:~-2!

YearMonthDay的结果:

20190609

糟糕::在 PowerShell 中,可以通过以下方式简单地自定义布局:

  

ToString("yyyyMMdd")

字符串可以通过 ToString 设置。

  

示例: yyyy-MM-dd, dd-MM-yyyy, MM-dd-yyyy, MM_dd_yyyy, yyyy_MM_dd, etc..


Powershell命令:

$(Get-Date).ToString("yyyyMMdd")

结果:

2010609

在此处查看有关日期变量布局批量输出的更多信息:

  

Safe way to get current day month and year in batch

     

Parsing Dates in Batch Files & Regional Settings / Locale



  

更新 -如何在蝙蝠中应用以上注释/观察结果,因此,如果我理解您在此问题中的代码:


@echo off & setlocal enabledelayedexpansion 

set "Fileone=File1.txt" &  set "FileTwo=File2.txt"

set "_both=!FileOne!-!FileTwo!" & rem cd /d "D:\Board\Broadcast\FA_Report8_A"

set "_path_back=%__CD__%" & rem :: you can use this "%__CD__%" or pushd "D:\Board\Broadcast\FA_Report8_A" 

for /f "tokens=2delims==." %%i in ('wmic OS Get localdatetime /value ^|findstr /r [0-9]')do set "_date=%%i"

set _now=!_date:~0,4!!_date:~4,2!!_date:~6,2! & for /f "tokens=1*delims=-" %%i in ('echo/!_both!')do (

     call :compare "%%~fi" & call :compare "%%~fj" & if !_dt_file_2! gtr !_dt_file_2! ( 

         echo/ FileOne Greater - run bat & timeout /t 20 /nobreak & goto :run_bat

         ) else (echo/ FileOne not Greater - Finish & goto Finish) 

    )

:compare
set "_file="  & set "_file=%~1" 

for /f "tokens=1delims=. " %%d in ('wmic datafile where name^='!_file:\=\\!' get LastModified ^|findstr /v "LastModified"')do (

    if "!_dt_file_1!./" == "./" (set _dt_file_2=%%d) else (set _dt_file_2=%%d)

    ) & exit /b

:run_bat 
call the_bat_to_run.cmd 

:Finish
echo/Finished

很抱歉,我的意思是 英语...