Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 解析日志文件';将上次修改的日期转换为变量_Powershell_Batch File_Datemodified - Fatal编程技术网

Powershell 解析日志文件';将上次修改的日期转换为变量

Powershell 解析日志文件';将上次修改的日期转换为变量,powershell,batch-file,datemodified,Powershell,Batch File,Datemodified,我试图将一个变量设置为日志文件修改后的天数。这样,我可以在下次运行命令时将该值用作标志 例如: 如果命令昨天运行,则值将为1 如果命令在5天前运行,则值为5 我看到了解决类似问题的方法,例如: OR %%f IN (%filename%) DO SET filedatetime=%%~tf 或 我只是不太懂批处理脚本或powershell。我愿意在任何一种情况下运行此脚本。我想我需要学习的是: 1) 从日期/时间修改命令中仅提取日期的(令牌?)子字符串 2) 删除任何冒号或斜杠 3) 转换为整

我试图将一个变量设置为日志文件修改后的天数。这样,我可以在下次运行命令时将该值用作标志

例如:

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

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

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

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

我只是不太懂批处理脚本或powershell。我愿意在任何一种情况下运行此脚本。我想我需要学习的是:

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

2) 删除任何冒号或斜杠

3) 转换为整数

4) 重复今天的日期

一旦我有了两个整数,相减和设置一个变量应该很容易


任何建议?

可以在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%

在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

使用批处理文件,您可以通过a以非常简单的方式将日期转换为儒略日编号,然后以任何方式使用该编号:

@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
部分即可。

批处理脚本不支持日期数学,因此最好使用PowerShell…@sip_admin-如果这对您很有效,请选择复选标记,以便其他人知道这是一个有效答案。
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