SET命令高级/ A功能资源

时间:2012-06-26 20:38:08

标签: batch-file set

已经做了很多寻找上述指南(任何实质内容)无济于事。有人可以推荐我吗?

在现在时,我试图理解下面的代码示例,该示例返回月份的两位数表示,对应于在v中设置的3个字符月份名称:

    SET v=May

    SET map=Jan-01;Feb-02;Mar-03;Apr-04;May-05;Jun-06;Jul-07;Aug-08;Sep-09;Oct-10;Nov-11;Dec-12
    CALL SET v=%%map:*%v%-=%%
    SET v=%v:;=&rem.%

    ECHO.%v%

3 个答案:

答案 0 :(得分:2)

SET v=May设置变量

SET map=Jan-01;Feb-02;Mar-03;Apr-04;May-05;Jun-06;Jul-07;Aug-08;Sep-09;Oct-10;Nov-11;Dec-12设置替换字符串

CALL SET v=%%map:*%v%-=%% - 将%v设置为map,但将所有内容替换为%v% - 没有任何内容 (:替换*所有内容(包括May-一无所有(在=后没有替换代码) - v现在是05;Jun-06;Jul-07;Aug-08;Sep-09;Oct-10;Nov-11;Dec-12

SET v=%v:;=&rem.%;替换&rem设置一行,将v设置为05,并将& rem注释掉命令的所有其他部分。执行的命令是SET v=05 & rem.Jun-06 & rem.Jul-07 & rem.Aug-08 & rem.Sep-09 & rem.Oct-10 & rem.Nov-11 & rem.Dec-12

ECHO.%v%给出答案

This site提供了大量信息,但运行批处理文件,并设置echo%v%也会有所帮助

答案 1 :(得分:1)

对不起。我不喜欢这种类型的代码。在我个人看来,以这种方式将这些值作为数组进行管理是非常明确的:

rem Prepare the array of two-digits values for each 3-letters month names:
for %%a in ("Jan=01" "Feb=02" "Mar=03" "Apr=04" "May=05" "Jun=06" "Jul=07" "Aug=08" "Sep=09" "Oct=10" "Nov=11" "Dec=12") do (
   set month%%~a
)
rem Previous code is equivalent to these 12 lines:
rem set monthJan=01
rem set monthFeb=02
. . . .
rem set monthDec=12

rem This way, the result is immediately accessible:
SET v=May
CALL SET v=%%month%v%%%

rem Or in the clearer way using Delayed Expansion:
SET v=!month%v%!

monthXXX是12个不同3个字母月份名称的值的数组

SET v=May index 的值设置为元素数组。

SET v=!month%v%!首先扩展为SET v=!monthMay!(正常扩展),然后扩展到SET v=05(延迟扩展)。

我在这些帖子中解释了我不得不更喜欢这种符号的原因:

Arrays, linked lists and other data structures in cmd.exe (batch) script

DIR output into BAT array?

如果有人认为这个答案不合适,我道歉......

安东尼奥

答案 2 :(得分:0)

对于那些想要反过来的人,如果输入的月份数错误,则想要输入错误,请将其放在名为script.cmd的文件中:

@echo off
set mNum=%1

set mMap=01-Jan;02-Feb;03-Mar;04-Apr;05-May;06-Jun;07-Jul;08-Aug;09-Sep;10-Oct;11-Nov;12-Dec
call set mName=%%mMap:*%mNum%-=%%
set mName=%mName:;=&rem.%
if "%mName%" == "01-Jan" (
  echo Wrong month number "%mNum%"!
  goto :EOF
  )

echo Month %mNum% is "%mName%".

使用参数

启动脚本
> script 02
Month 02 is "Feb".

> script 13
Wrong month number "13"!

> script foo
Wrong month number "foo"!

但是,它不包含空值:

> script
Month  is "Jan".