【问题标题】:Parse a log file's last modified date into a variable将日志文件的最后修改日期解析为变量
【发布时间】:2018-08-20 17:34:41
【问题描述】:

我正在尝试将变量设置为自修改日志文件以来的天数。这样我就可以将该值用作下次命令运行时的标志。

示例:

如果命令昨天运行,则值为 1

如果命令在 5 天前运行,则值为 5

我看到了类似问题的方法,例如:

OR %%f IN (%filename%) DO SET filedatetime=%%~tf

if (file.exists()) {
  Date lastModified = new Date(file.lastModified());
}

我只是不太了解批处理脚本或 powershell。我愿意在其中任何一个中运行这个脚本。我认为我需要学习的是:

1) 从修改日期/时间的命令中提取仅日期的(令牌?)子字符串

2) 删除任何冒号或斜杠

3) 转换为整数

4) 重复今天的日期

一旦我有两个整数减去并设置一个变量应该很容易。

有什么建议吗?

【问题讨论】:

  • 批处理脚本不支持日期数学,所以最好使用PowerShell...

标签: powershell batch-file datemodified


【解决方案1】:

在 PowerShell 中,您可以从另一个日期中减去一个日期并获得一个时间跨度。所以很简单:

$File = Get-Item C:\Path\To\File.txt
$DaysSinceMod = [datetime]::now - $File.LastWriteTime | Select -Expand Days

然后$DaysSinceMod 将是自上次修改文件以来的天数。或者,使用一些速记,可以简化为:

$LastMod=(get-date)-(gi C:\Path\To\File.txt)|% Days

【讨论】:

    【解决方案2】:

    使用批处理文件,您可以通过 conversion "function" 以非常简单的方式将日期转换为儒略日数,然后以任何您希望的方式使用该数字:

    @echo off
    setlocal EnableDelayedExpansion
    
    rem Define the "Date to Julian Day Number" conversion function
    set "DateToJDN(YMD)=( a=(YMD), y=a/10000, a%%=10000, m=a/100, d=a%%100, a=(m-14)/12, (1461*(y+4800+a))/4+(367*(m-2-12*a))/12-(3*((y+4900+a)/100))/4+d-32075 )"
    
    rem Get the JDN of today's date
    for /F "tokens=1-3 delims=/" %%a in ("%date%") do set /A "today=!DateToJDN(YMD):YMD=%%c%%a%%b!"
    
    rem Get the JDN of each file, subtract it from today's JDN and show the elapsed days
    for %%f in (*.csv) do for /F "tokens=1-3 delims=/ " %%a in ("%%~Tf") do (
       set /A "daysOld=today - !DateToJDN(YMD):YMD=%%c%%a%%b!"
       echo !daysOld!  -  %%f
    )
    

    例如,使用这些文件:

    07/04/2018  07:45 p. m.               135 data.csv
    07/04/2018  07:45 p. m.                79 data_1.csv
    07/04/2018  07:45 p. m.                65 data_2.csv
    06/02/2018  07:41 p. m.               104 file1.csv
    03/06/2017  06:02 p. m.             5,534 file2.csv
    14/04/2018  10:49 p. m.             2,674 HCT_ACT_01.csv
    14/04/2018  10:49 p. m.               714 HCT_ACT_02.csv
    14/04/2018  10:49 p. m.             2,010 HCT_ACT_03.csv
    21/03/2018  09:15 p. m.               313 msource1.csv
    21/03/2018  09:16 p. m.               402 msource2.csv
    21/03/2018  09:16 p. m.               402 msource3.csv
    06/10/2017  09:18 p. m.               156 output.csv
    03/06/2017  06:11 p. m.             2,017 Reconresult.csv
    21/03/2018  09:41 p. m.               491 result.csv
    20/12/2017  12:25 a. m.               305 source.csv
    

    这是输出:

    135  -  data.csv
    135  -  data_1.csv
    135  -  data_2.csv
    195  -  file1.csv
    443  -  file2.csv
    128  -  HCT_ACT_01.csv
    128  -  HCT_ACT_02.csv
    128  -  HCT_ACT_03.csv
    152  -  msource1.csv
    152  -  msource2.csv
    152  -  msource3.csv
    318  -  output.csv
    443  -  Reconresult.csv
    152  -  result.csv
    243  -  source.csv
    

    注意:显示的文件数据使用DD/MM/YYYY日期格式,但MM/DD/YYYY日期格式的代码是正确的。如果您的格式不同,只需调整代码中的%%c%%a%%b 部分即可。

    【讨论】:

      【解决方案3】:

      可以在 PowerShell 中减去日期。结果是 [System.TimeSpan]。

      PS C:\src\t> $(Get-Date) - $(Get-Item -Path 'sw.txt').LastWriteTime
      
      
      Days              : 193
      Hours             : 23
      Minutes           : 36
      Seconds           : 44
      Milliseconds      : 168
      Ticks             : 167602041681449
      TotalDays         : 193.983844538714
      TotalHours        : 4655.61226892914
      TotalMinutes      : 279336.736135748
      TotalSeconds      : 16760204.1681449
      TotalMilliseconds : 16760204168.1449
      
      PS C:\src\t> ($(Get-Date) - $(Get-Item -Path 'sw.txt').LastWriteTime).Days
      193
      

      如果您想在 .bat 或 .cmd 脚本中执行此操作:

      @ECHO OFF
      SET "THEFILE=C:\src\t\sw.txt"
      FOR /F %%a IN ('powershell -NoProfile -Command ^
          "((Get-Date) - (Get-Item -Path "%THEFILE%").LastWriteTime).Days"') DO (SET /A "NDAYS=%%a")
      ECHO Days since "%THEFILE%" has been written is %NDAYS%
      

      【讨论】:

      • @sip_admin - 如果这对您有用,请选择复选标记,以便其他人知道这是一个有效的答案。
      猜你喜欢
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 2020-05-12
      • 2019-02-26
      • 2011-11-25
      • 2015-06-07
      相关资源
      最近更新 更多