我有一个脚本需要连接到ftp服务器并下载一个仅在星期日和星期日创建的文件,yyyy-mm-dd-hh-mm-ss附加到文件名。我需要找到最后一个星期天的日期(基于今天的日期,我假设)并将其转换为yyyy-mm-dd(我不关心时间)所以我可以在我的ftp脚本中构建文件名。我在这个网站和其他网站上搜索了很多线程,但我对批处理语法很新手。我无法对将运行此脚本的计算机上的日期格式做出假设,但它将与ftp服务器位于同一时区,并且它将至少运行Windows 7.我考虑过在HOW to find last SUNDAY DATE through batch中使用PowerShell解决方案,但我已经读过PS脚本可移植性的问题。任何帮助是极大的赞赏。如果我需要提供更多细节,请告诉我。谢谢!
几年前我写了一个批处理脚本来查找昨天的日期。我让它能够根据今天的日期计算出“昨天”。它考虑到了30或31日结束的月份,甚至是接下来的几个闰年。我写它的方式希望日期格式为'Wed 02/24/2016'或'ddd MM / DD / YYYY',所以它可能对你没用。
正如我现在看到的那样,它可能比它需要的更复杂,可能会使用一些清理,但它可以用于我的目的。您可能能够以某种方式修改它以使其在上周日找到,而不是昨天。
set yearCounter=0
set yyyy=%date:~10,4%
set mm=%date:~4,2%
set dd=%date:~7,2%
::use these to override the actual date values for testing
::set yyyy=xxxx
::set mm=xx
::set dd=xx
if %dd%==01 goto LDoM ::Last Day of Month
set DS=%yyyy%%mm%%dd%
set /A yesterday=%DS%-1
goto endyesterday
:LDoM
set /A lastyyyy=%yyyy%-%yearCounter%
if %yesterday:~4,2%==01 set lastmm=12& set lastdd=31& goto LDoY ::Last Day of Year
if %yesterday:~4,2%==02 set lastmm=01& set lastdd=31
if %yesterday:~4,2%==03 set lastmm=02& goto february
if %yesterday:~4,2%==04 set lastmm=03& set lastdd=31
if %yesterday:~4,2%==05 set lastmm=04& set lastdd=30
if %yesterday:~4,2%==06 set lastmm=05& set lastdd=31
if %yesterday:~4,2%==07 set lastmm=06& set lastdd=30
if %yesterday:~4,2%==08 set lastmm=07& set lastdd=31
if %yesterday:~4,2%==09 set lastmm=08& set lastdd=31
if %yesterday:~4,2%==10 set lastmm=09& set lastdd=30
if %yesterday:~4,2%==11 set lastmm=10& set lastdd=31
if %yesterday:~4,2%==12 set lastmm=11& set lastdd=30
set yesterday=%lastyyyy%%lastmm%%lastdd%
goto endYesterday
:february
set leapyear=n
set lastdd=28
if %yesterday:~0,4%==2016 set leapyear=y
if %yesterday:~0,4%==2020 set leapyear=y
if %yesterday:~0,4%==2024 set leapyear=y
if %yesterday:~0,4%==2028 set leapyear=y
if %leapyear%==y set lastdd=29
set yesterday=%lastyyyy%%lastmm%%lastdd%
goto endYesterday
:LDoY
set /A yearCounter=%yearCounter%+1
set /A lastyyyy=%yyyy%-%yearCounter%
set yesterday=%lastyyyy%%lastmm%%lastdd%
:endYesterday
@echo off
echo %yyyy% %lastyyyy%
echo %mm% %lastmm%
echo %dd% %lastdd%
echo.
echo today = %yyyy%%mm%%dd%
echo yesterday = %yesterday%
使用纯批次处理日期和时间可以完成,但不是很方便。
GetTimestamp.bat utility在批处理上下文中使日期/时间计算和格式化变得简单。它是纯脚本(混合JScript /批处理),可以在XP之后的任何Windows机器上本机运行。上一个链接指向最新版本。该实用程序首先在http://www.dostips.com/forum/viewtopic.php?t=4847上引入了许多示例。
可以从命令行通过getTimestamp /?
获取完整文档,或者使用getTimestamp /??
获取分页输出。
使用GetTimestamp,解决方案可以简单到:
@echo off
:: Get the current day of the week, with 0=Sunday, 6=Saturday
:: to be used as an offset from today to get the most recent Sunday
call getTimeStamp -f {w} -r offset
:: Use the offset to get the most recent Sunday in YYYY-MM-DD format
call getTimeStamp -od -%offset% -f {iso-dt} -r lastSunday
:: Show the result
echo lastSunday=%lastSunday%
从批处理文件中尝试以下操作:
for /f "usebackq" %%d in (`powershell -noprofile -command "'{0:yyyy-MM-dd}' -f [DateTime]::Now.AddDays(-1 * [DateTime]::Now.DayOfWeek)"`) do set "lastSunday=%%d"
echo %lastSunday%
:: -> e.g., "2016-02-21", when run on 2016-02-25
要在命令提示符下直接尝试此操作,请将%%d
替换为%d
。
[DateTime]::Now.AddDays(-1 * [DateTime]::Now.DayOfWeek)
,
计算了最近一个星期天的日期,感激地从the answer that you link to in your question借来。'{0:yyyy-MM-dd}' -f ...
将所需的yyyy-mm-dd格式应用于日期。powershell -noprofile command ...
调用PowerShell表达式并将其结果输出到stdout。for /f "usebackq" %%d in (`...`) do set lastSunday=%%d
捕获PowerShell命令的输出并将其分配给批处理变量lastSunday
。虽然从批处理文件中仅为一个命令调用PowerShell会很慢,但能够方便地计算所需的日期可能会超过性能问题。
(获取最新).AddDays( - (获取最新).dayofWeek.value__)