2012-06-26 113 views
1

已經做了相當多的搜索指導(任何物質)上述無濟於事。任何人都可以提到我嗎?SET命令高級/ A功能資源

然而,在本緊張,我想了解下面的代碼示例,它返回該月的兩位數字表示,對應於3個字符的月份名稱在集v:

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% 
+2

您沒有使用'設置/了'任何地方 – Joey

+0

順便說一句。使用'set v =%v:〜0.2%'會更容易,因爲這裏不需要'&REM'技巧 – jeb

回答

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給出了大量的信息,但在運行批處理文件,並把回聲%V%也將有助於

+0

+1,很好的解釋 – jeb

+0

Second @ Jeb的評論。謝謝!至於set/a reference - 這個例子實際上來自這個網站:)但希望有更多的參考資料(很像你爲這個例子提供的答案),而不是通過示例方法學習。如果你知道其他人,請告訴我。再次感謝。 – user66001

+0

http://ss64.com/nt/set.html是另一個很好的資源 – SeanC

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索引的值設置爲元素數組。

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?

我道歉,如果有人認爲這個答案是題外話...

Antonio

+0

+1,或許脫離主題,但更好的解決方案 – jeb

+0

感謝您的回答@Aacini。同意,這似乎更清晰,更容易遵循(一旦你「展開」所有的語法到它在幕後做的事情) – user66001

0

對於那些想要相反的人,並想要一個錯誤或者如果輸入的月份編號錯誤,請將其放入名爲腳本的文件中。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". 
+0

看起來很有趣。你能否詳細說明(至少)如何調用set mName = %% mMap:*%mNum% - = %%'和'set mName =%mName:; =&rem。%' 工作? – user66001