Batch file 为什么我的团队认为09-01=-1?

Batch file 为什么我的团队认为09-01=-1?,batch-file,variables,math,dynamic,subtraction,Batch File,Variables,Math,Dynamic,Subtraction,所以我要做的是创建一个动态变量,它最终将成为从网站下载的最新文件。在我的示例中,我试图通过一个自动过程下载“downloads.informais.com/updates/psn_basic_sqlite_r4_20170531.exe”。r是修订号,日期是日期。这就是我现在拥有的: @echo off ::http://downloads.informais.com/updates/psn_basic_sqlite_r4_20170531.exe echo Dates > Dates.t

所以我要做的是创建一个动态变量,它最终将成为从网站下载的最新文件。在我的示例中,我试图通过一个自动过程下载“downloads.informais.com/updates/psn_basic_sqlite_r4_20170531.exe”。r是修订号,日期是日期。这就是我现在拥有的:

@echo off
::http://downloads.informais.com/updates/psn_basic_sqlite_r4_20170531.exe
echo Dates > Dates.txt
::Get Variables
    set num=11
    set /a "num=num-1"
::: Begin set date
for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (call :set_date %%i %%j %%k %%l)
goto :end_set_date
:set_date
if "%1:~0,1%" gtr "9" shift
for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo,^|date') do (set %%m=%1&set %%n=%2&set %%o=%3)
goto :eof
:end_set_date
::: End set date
set PSN=psn_basic_sqlite_r%num%_%yy%%mm%%dd%
set download=http://downloads.informais.com/updates/%PSN%.exe
GOTO TryPSNdownload

::Get the latest download
    :TryPSNdownload
    ::Fix Days
    if %dd%==9 set dd=09
    if %dd%==8 set dd=08
    if %dd%==7 set dd=07
    if %dd%==6 set dd=06
    if %dd%==5 set dd=05
    if %dd%==4 set dd=04
    if %dd%==3 set dd=03
    if %dd%==2 set dd=02
    if %dd%==1 set dd=01
set /a "num=num-1"
set PSN=psn_basic_sqlite_r%num%_%yy%%mm%%dd%
set download=http://downloads.informais.com/updates/%PSN%.exe
echo %download% >> Dates.txt
if exist "%download%" (
GOTO Download
    ) else (
        ::Fix Month
        if %mm%==9 set mm=09
        if %mm%==8 set mm=08
        if %mm%==7 set mm=07
        if %mm%==6 set mm=06
        if %mm%==5 set mm=05
        if %mm%==4 set mm=04
        if %mm%==3 set mm=03
        if %mm%==2 set mm=02
        if %mm%==1 set mm=01
        if %mm%==0 set mm=12
        if %dd%==0 set dd=33
if %num%==0 set /a "dd=dd-1"
if %dd%==0 set /a "mm=mm-1"
if %num%==0 set num=11

GOTO TryPSNdownload
    )

:Download
Echo %download%

pause
这是将%download%变量输出到txt文件,因此您可以看到我所说的内容,但结果如下:

http://downloads.informais.com/updates/psn_basic_sqlite_r0_20170609.exe 
http://downloads.informais.com/updates/psn_basic_sqlite_r10_201706-1.exe 
http://downloads.informais.com/updates/psn_basic_sqlite_r9_201706-1.exe 

我有一种感觉,这是一种操作顺序类型的东西,但我无法理解。我添加了“fix”dd变量的位置,以使其保持两位数,然后它将正确地倒计时,除了它不会在一位数之前包含零。关于如何修复的任何建议?

我可以通过将PSN变量更改为在%dd%之前包含“0”(如果“dd”小于10),并保持其他操作不变来修复此问题,现在它可以工作:-)


您正在执行set/a“num=num-1”,因此我想说num设置不正确,因此您得到num=-1篡改date/t或%date%是浪费时间的,这都取决于区域设置/用户设置。使用wmic以yyyyMMdd格式获取日期,或者使用vbs/powershell和adddays函数,有数百个问答。通过将100添加到数字中并将子字符串变量添加到最后2位来获取前导零,这也是非常常见的。因为batch将以
0
开头的数字字符串解释为八进制字符串,而
09
不是有效的八进制数。标准的解决方法是在值前面加上
1
,执行所需的操作,然后使用子字符串分隔最后(2)个字符。由于数字现在以非0开头,因此被解释为十进制。@Tofandel%num%的行为与它应有的一样,它一次又一次地从11变为0。给我带来问题的是%dd%变量。如果%dd%GTR 9(set dd=%dd%)其他(set dd=0%dd%),我现在正在尝试此操作,但现在我太快将重置为33。@Magoo我该怎么做?我尝试了
如果%dd%GTR 9(set dd=%dd%)其他(set dd=0%dd%)
同时保持“if%num%==0 set/a”dd=dd-1“,但它似乎对我不起作用,它现在只是从9变为33。
    @echo off
::http://downloads.informais.com/updates/psn_basic_sqlite_r4_20170531.exe
echo Dates > Dates.txt
::Get Variables
    set num=11
    set /a "num=num-1"
::: Begin set date
for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (call :set_date %%i %%j %%k %%l)
goto :end_set_date
:set_date
if "%1:~0,1%" gtr "9" shift
for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo,^|date') do (set %%m=%1&set %%n=%2&set %%o=%3)
goto :eof
:end_set_date
::: End set date
set PSN=psn_basic_sqlite_r%num%_%yy%%mm%%dd%
set download=http://downloads.informais.com/updates/%PSN%.exe
GOTO TryPSNdownload

::Get the latest download
    :TryPSNdownload
    set /a "num=num-1"
    ::Fix Days
    if %dd% LSS 10 (set PSN=psn_basic_sqlite_r%num%_%yy%%mm%0%dd%) else (set PSN=psn_basic_sqlite_r%num%_%yy%%mm%%dd%)
set download=http://downloads.informais.com/updates/%PSN%.exe
echo %download% >> Dates.txt
if exist "%download%" (
GOTO Download
    ) else (
        ::Fix Month
        if %mm%==9 set mm=09
        if %mm%==8 set mm=08
        if %mm%==7 set mm=07
        if %mm%==6 set mm=06
        if %mm%==5 set mm=05
        if %mm%==4 set mm=04
        if %mm%==3 set mm=03
        if %mm%==2 set mm=02
        if %mm%==1 set mm=01
        if %mm%==0 set mm=12
        if %num%==0 set /a "dd=dd-1"
        if %dd%==0 set /a "mm=mm-1"
        if %dd%==0 set dd=33
        if %num%==0 set num=11
GOTO TryPSNdownload
    )

:Download
Echo %download%

pause