如何查找上周日的日期并将其保存在Windows批处理文件的变量中

问题描述 投票:2回答:4

我有一个脚本需要连接到ftp服务器并下载一个仅在星期日和星期日创建的文件,yyyy-mm-dd-hh-mm-ss附加到文件名。我需要找到最后一个星期天的日期(基于今天的日期,我假设)并将其转换为yyyy-mm-dd(我不关心时间)所以我可以在我的ftp脚本中构建文件名。我在这个网站和其他网站上搜索了很多线程,但我对批处理语法很新手。我无法对将运行此脚本的计算机上的日期格式做出假设,但它将与ftp服务器位于同一时区,并且它将至少运行Windows 7.我考虑过在HOW to find last SUNDAY DATE through batch中使用PowerShell解决方案,但我已经读过PS脚本可移植性的问题。任何帮助是极大的赞赏。如果我需要提供更多细节,请告诉我。谢谢!

date powershell batch-file
4个回答
1
投票

几年前我写了一个批处理脚本来查找昨天的日期。我让它能够根据今天的日期计算出“昨天”。它考虑到了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%

0
投票

使用纯批次处理日期和时间可以完成,但不是很方便。

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%

0
投票

从批处理文件中尝试以下操作:

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

  • PowerShell表达式是命令的核心, [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会很慢,但能够方便地计算所需的日期可能会超过性能问题。


0
投票

(获取最新).AddDays( - (获取最新).dayofWeek.value__)

© www.soinside.com 2019 - 2024. All rights reserved.