我是新手脚本,所以请原谅我。我需要创建一个Windows批处理脚本来完成以下任务:
我将通过任务计划程序运行此程序。任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
您应该可以使用Forefiles
完成此操作答案 1 :(得分:1)
此命令列出按修改时间排序的文件。最新的一个是最后一个。
> dir /Od /B
此命令运行上一个命令并将最后一个文件存储在变量FILE
中> for /F "usebackq" %f in (`dir /Od /B`) do set "FILE=%f"
此命令显示特定文件的文件信息:
> dir /N "%FILE%" | findstr /B "[0-9]"
此命令将运行上一个命令,并对其进行解析。字段的顺序(年,月,日......)和分隔符(/日期,在我的情况下为小时)取决于您的区域设置。
> for /f "usebackq tokens=1-5 eol=\ delims=/:\ " %i in (`dir /N "%FILE%" ^| findstr /B "[0-9]"`) do echo [%i%j%k] [%l%m]
我们可以将结果存储在变量中:
> for /f "usebackq tokens=1-5 eol=\ delims=/:\ " %i in (`dir /N "%FILE%" ^| findstr /B "[0-9]"`) do set DD=%i&set MM=%j&set YYYY=%k&set HH=%l&set MI=%m
这些命令显示当前日期和时间:
> date /t
> time /t
这些命令运行,解析并存储到变量中:
> for /F "usebackq tokens=1-3 delims=%DATE_DELIM%" %i in (`date /t`) do set DD=%i&set MM=%j&set YYYY=%k
> for /F "usebackq tokens=1,2 delims=%TIME_DELIM%" %i in (`time /t`) do set HH=%i&set MI=%j
这很容易。我们现在必须做一些算术来比较日期。 set /A
可以做算术,但会将“08”解释为八进制。所以我们必须通过删除前导'0'将值转换为十进制:
> set /A DD=1%DD%-100&set /A MM=1%MM%-100
> set /A HH=1%HH%-100&set /A MI=1%MI%-100
这是最终的脚本。 我不得不使用很多技巧来做日期/时间算术,因此“24h”是硬编码的。
@echo off
setlocal
set DIR=%~f1
set DATE_DELIM=/
set TIME_DELIM=:
for /F "usebackq" %%f in (`dir /Od /B "%DIR%"`) do set "FILE=%%f"
for /F "usebackq tokens=1-5 eol=\ delims=%DATE_DELIM%%TIME_DELIM%\ " %%i in (`dir /N "%FILE%" ^| findstr /B "[0-9]"`) do set A_DD=%%i&set A_MM=%%j&set A_YYYY=%%k&set A_HH=%%l&set A_MI=%%m
set A_DATE=%A_YYYY%%A_MM%%A_DD%
set /A A_DD=1%A_DD%-100&set /A A_MM=1%A_MM%-100
set /A A_TIME=(1%A_HH%-100)*60+%A_MI%-100
for /F "usebackq tokens=1-3 delims=%DATE_DELIM%\ " %%i in (`date /t`) do set B_DD=%%i&set B_MM=%%j&set B_YYYY=%%k
for /F "usebackq tokens=1,2 delims=%TIME_DELIM%\ " %%i in (`time /t`) do set B_HH=%%i&set B_MI=%%j
set B_DATE=%B_YYYY%%B_MM%%B_DD%
set /A B_DD=1%B_DD%-100&set /A B_MM=1%B_MM%-100
set /A B_TIME=(1%B_HH%-100)*60+%B_MI%-100
echo %A_DATE% %A_TIME% - %A_YYYY% %A_MM% %A_DD%
echo %B_DATE% %B_TIME% - %B_YYYY% %B_MM% %B_DD%
:: Check that the file is newer than 24 hours
:: This will not work at daylight change
:: This is probably full of bugs as I had no time to test all cases
if %A_DATE% GEQ %B_DATE% goto :NewFile
:: Past day
:: Whatever the day, if the time of the day is <, this is old
if %A_HH%%A_MI% LSS %B_HH%%B_MI% goto :OldFile
if not %B_MM%==1 goto :WhateverMonth
if %A_DATE:~1,6% EQU %B_DATE:~1,6% goto :SameMonth
:: Change Month
set /A D=%B_YYYY%*12+%B_MM%-%A_YYYY%*12+%A_MM%
if not %D%==-1 goto :OldFile
:LastMonth
:: Is A the last day of the month => yesterday ?
if %A_DD% EQU 2 goto :February
:: 31 is of course the last day
if %A_DD% EQU 31 goto :NewFile
if %A_DD% LSS 30 goto :OldFile
:: Months of 30 days
if %A_DD%==4 goto :NewFile
if %A_DD%==6 goto :NewFile
if %A_DD%==9 goto :NewFile
if %A_DD%==11 goto :NewFile
:: Day is 30 and month has 31 days
goto :OldFile
:February
set /A D=28+!(%A_YYYY% ^% 4)
if %A_DD%==%D% goto :NewFile
:: We do not have to handle others bissextile case which will happen in about
:: 389 years
goto :OldFile
:WhateverMonth
if %A_YYYY%%A_MM% EQU %B_YYYY%%B_MM% goto :SameMonth
goto :OldFile
:SameMonth
set /A D=100+%B_DD%-%A_DD%
if %D% GTR 101 goto :OldFile
:Yesterday
if %B_DD% GTR 1 goto :ChkTime
:ChkTime
:OldFile
echo %FILE% is old.
goto :End
:NewFile
echo %FILE% is new.
goto :End
:End
endlocal
运行它:
> CheckFile.cmd <directory>
这只是为了向您展示可能。但我不建议在进行大量测试之前将其投入生产。而且难以维护。因此,我建议在WSH环境或PowerShell中使用JScript而不是批处理。
答案 2 :(得分:0)
ls -t
列出按修改时间排序的文件。您可以从其输出中获取第一个作为最近修改过的。