2016-05-23 78 views
2

我开发一个批处理脚本,它的当前日期-1月和格式作为YYYYMMDD,但是当我执行我的代码最终的变量只是年(没有月份连接)。你能帮我找到错误吗?问题来格式化当前日期(-1month),以YYYYMMDD

的代码如下:

echo off &setlocal 
setlocal EnableDelayedExpansion 

SET _test=%date% 
SET _month=%_test:~4,2% 
SET _day=01 
SET search_year=%_test:~10,4% 


IF "%_month%" EQU 1 (
     set search_month=12 
     set /a search_year= %seach_year% -1 
) 

IF "%_month%" EQU 2 (
     set search_month=1 
) 
IF "%_month%" EQU 3 (
     set search_month=2 
) 

IF "%_month%" EQU 4 (
     set search_month=3 
) 

IF "%_month%" EQU 5 (
     set search_month=4 
) 

IF "%_month%" EQU 6 (
     set search_month=5 
) 

IF "%_month%" EQU 7 (
     set search_month=06 
) 

IF "%_month%" EQU 8 (
     set search_month=07 
) 

IF "%_month%" EQU 9 (
     set search_month=08 
) 

IF "%_month%" EQU 10 (
     set search_month=09 
) 

IF "%_month%" EQU 11 (
     set search_month=10 
) 

IF "%_month%" EQU 12 (
     set search_month=11 
) 


echo Month-1 is %search_month% 
set /a total = %search_year%%search_month% 
echo total is %total% 

感谢

回答

0

你一个月的比较是不正确的。从%_test:~4,2%获取月份意味着当前月份(5月)返回为05,而不是5

另外,如果比较的一侧有引号,则在另一侧必须有引号,因为批量比较时包含引号。由于这两件事情,search_month永远不会被设置。你的比较应该是这样的:

IF "%_month%" EQU "05" (
    set search_month=4 
) 

这就是说,12个基本一致,比较一吨的冗余代码,你可以把它的方式更简单:

@echo off 
setlocal enabledelayedexpansion 

SET _test=%date% 
SET _month=%_test:~4,2% 
SET _day=01 
SET search_year=%_test:~10,4% 

if "%_month%" equ "01" (
    set search_month=12 
    set /a search_year-=1 
) else (
    REM Remove any zero-padding so that months are not considered octal. 
    REM We do this by putting a 1 in front of %_month% and then subtracting 100 
    REM because set /a returns in decimal. 
    REM And then we subtract 1 because we're getting the previous month. 
    set /a search_month=1%_month%-100-1 

    REM Replace the zero-padding since you want YYYYMM format. 
    REM Use delayed expansion here because search_month was created inside 
    REM of a code block. 
    if !search_month! lss 10 set search_month=0!search_month! 
) 

echo Month-1 is !search_month! 
set total=%search_year%!search_month! 
echo total is %total% 
+0

这正是我一直在寻找!感谢您的解释:) – thartaras

+0

如果我想执行这个月只是15日呢? – thartaras

+0

@thartaras - 嗯,你最初提供的代码并不是白天的因素,但是基于你有一个'_day'变量的事实,我会出去走一步,说改变该值为15.但这只是一个猜测,因为你的代码是不完整的。 – SomethingDark

0

无需周围放置%_month%报价 这是你想要的,

echo off &setlocal 
setlocal EnableDelayedExpansion 

SET _test=%date% 
SET _month=%_test:~4,2% 
SET _day=01 
SET search_year=%_test:~10,4% 


IF %_month% EQU 1 (
     set search_month=12 
     set /a search_year= %seach_year% -1 
) 

IF %_month% EQU 2 (
     set search_month=01 
) 
IF %_month% EQU 3 (
     set search_month=02 
) 

IF %_month% EQU 4 (
     set search_month=03 
) 

IF %_month% EQU 5 (
     set search_month=04 
) 

IF %_month% EQU 6 (
     set search_month=05 
) 

IF %_month% EQU 7 (
     set search_month=06 
) 

IF %_month% EQU 8 (
     set search_month=07 
) 

IF %_month% EQU 9 (
     set search_month=08 
) 

IF %_month% EQU 10 (
     set search_month=09 
) 

IF %_month% EQU 11 (
     set search_month=10 
) 

IF %_month% EQU 12 (
     set search_month=11 
) 


echo Month-1 is %search_month% 
set /a total = %search_year%%search_month% 
echo total is %total%