%date:~0,10% 的使用

来源:互联网 发布:比知乎更好的网站 编辑:程序博客网 时间:2024/05/17 02:24

“%date:~0,10% 的使用”- -        

前我曾经写过一个关于“%date:~0,10% 的使用方法的帖子,见于 http://gnaw0725.blogdriver.com/gnaw0725/458144.html,今天无意中翻到 set的帮助,竟然发现它的用法原来是SET命令的扩展集中众多用法之一,霍霍,看样子越是手边的东西,就越不容易注意到。 也证实了之前我在上面帖子中提到的“~左右取舍的方法,确实有误,应该是:

~ 指定偏移量,指定截取字符长度    如果两者的数值(偏移量或长度)是负数,使用的數字將會是環境變數的長度加上位移或指定長度。我会修正上面帖子中的描述。这里举个例子来说明:

set /p ok=Input value of "ok" environment-variable:_

C:/Documents and Settings/gnaw0725>set /p ok=Input value of "ok" environment-var
iable:_
Input value of "ok" environment-variable:_1234567890

C:/Documents and Settings/gnaw0725>echo %ok%
1234567890

C:/Documents and Settings/gnaw0725>echo %ok:~4,4%
5678

C:/Documents and Settings/gnaw0725>echo %ok:~-4,4%
7890

C:/Documents and Settings/gnaw0725>echo %ok:~4,-4%
56

C:/Documents and Settings/gnaw0725>echo %ok:~-4,-4%
ECHO is on.

C:/Documents and Settings/gnaw0725>echo %ok:~,-4%
123456

C:/Documents and Settings/gnaw0725>echo %ok:~-4%
7890

C:/Documents and Settings/gnaw0725>echo %ok:~4,%
ECHO is on.

SET扩展命令集有些特殊用法,例如:

%CD% - 展開為含目前目錄的字串。(gnaw0725注:这个扩展功能较之For中的%~$PATH:I的用法要弱的多了)

%RANDOM% - 展開為一個在 0 32767 之間的整數亂數值。

%ERRORLEVEL% - 展開為目前的 ERRORLEVEL

%CMDEXTVERSION% - 展開為目前的擴充指令處理器的版本號碼。

%CMDCMDLINE% - 展開為執行指令處理器前的原始指令行。

这些用法有待以后脚本运用中的实践。SET扩展命令集的帮助信息如下:

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:/Documents and Settings/gnaw0725>set /?
顯示、設定或移除 cmd.exe 環境變數。

SET [variable=[string]]

  variable  指定環境變數名稱。
  string   
指定設定給變數的一系列字元。

僅鍵入 SET 而不加上任何參數,可以顯示目前的環境變數。

如果您啟用了擴充命令,SET 指令有以下的改變:

如果執行 SET 命令而且只包含變數名稱,沒有等號或數值的話,指令會顯示出所有字首符合 SET 命令中指定變數名稱的所有變數
值。例如:

    SET P

會列出所有以 'P' 為開頭的環境變數。

如果在目前的環境中找不到變數名稱,SET 指令會將 ERRORLEVEL設為 1

SET 指令不將等號 (=) 視為變數名稱的一部份。

有兩個新參數已經加到 SET 指令中:

    SET /A expression
    SET /P variable=[promptString]

/A 指定在等號右方的字串是一個要被運算的數字運算式。您可以用運算式進行簡單的運算,而且支援下列的運算子 (依照運算優先順序由高到低排列):

    ()                  - 組成一群
    * / %              -
數字運算元
    + -                 -
數字運算元
    << >>               -
邏輯位移
    &                    -
位元運算 and
    ^                   -
位元運算
exclusive or
    |                   -
位元運算
or
    = *= /= %= += -=   -
指定

    &= ^= |= <<= >>=
    ,                   -
運算式分隔字元

如果您使用了任何邏輯或餘數運算子,您必須將運算式兩邊括上引號。任何在運算式中非數字的字串會被當作環境變數,並且在使用前會先將這些環境變數轉換為數字。如果您所指定的環境變數名稱尚未在目前環境中定義,那麼它的值會被設為 0。這可以讓您用環境變數值來做運算,而不必打入所有的 % 符號來取得它的值。如果 SET /A 是用指令檔之外的指令行執行,它會顯示運算式最後的數值。指定運算子需要有個環境變數在等號的左方。0x 字首在數字前方代表十六進位數字、0b 字首代表二進位數字或 0 字首代表八進位數字,否則數字值都是指十進位數字。所以 0x12 就和 18022 等相同。請注意八進位數字可能容易弄錯: 08 09 就不是正確的數字,因為 8 9 並不是八進位的正確數字。

/P 參數讓您設定指令行的使用者輸入變數值。在讀取輸入指令行之前,顯示指定的 promptStringpromptString 可以是空白。

環境變數取代功能已經有下列增強:

    %PATH:str1=str2%

會將 PATH 環境變數展開,取代每個發現的 "str1" "str2"的擴充結果。"str2" 可以是空白字串,這會從擴充輸出中刪除全部 "str1""str1" 可以用星號開始,這將會從擴充輸出的開頭開始,對應到從所有第一個發現含有str1 的項目。

您也可以為擴充功能指定子字串。

    %PATH:~10,5%

這將會擴充 PATH 環境變數,然後只使用擴充結果的第 11 (位移 10)字元後的 5 個字元如果長度未指定,將會預設為上次使用的變數值。如果數字(位或長度)是負數,使用的數字將會是環境變數的長度加上位移或指定長度。

    %PATH:~-10%

將抽出 PATH 變數的最後 10 個字元。

    %PATH:~0,-2%

將抽出 PATH 變數的最後 2 個字元。

最後,系統加入了延遲環境變數展開的支援。在預設狀態下,指令展開會啟用這項支援,但是您可以在 CMD.EXE /V 指令行參數來啟用/停用這個功能。 請參看 CMD /?

延遲環境變數展開功能可用來避開展開功能限制。這項限制是發生在指令行讀取過程,不是發生在執行過程。下面的範例說明了立即展開變數時會發生的問題:

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after;
        if "%VAR%" == "after" @echo If you see this, it worked
    )

這個例子永遠無法顯示 echo 訊息,因為在兩個 IF 敘述中的 %VAR% 會在第一個 IF 敘述被讀入時便被展開。這是因為它是邏輯上包含了 IF 的內部,而內部又是一個複合敘述。  所以在複合敘述內的 IF 實際上是用"before" "after" 來比較,而這永遠不會為真。同樣的,下面的例子也不會作用:

    set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%

這個例子中並不會建立目前目錄中所有檔案的清單,相反的只會將 LIST 變數設為最後一個找到的檔案。同樣地,這是因為 %LIST% 只有在 FOR 敘述第一次被讀入時才展開,此時 LIST 變數是空的。所以我們實際執行的 FOR迴圈是:

    for %i in (*) do set LIST= %i

這只是重複的將 LIST 設為最後找到的檔案。

延遲環境變數展開讓您可以用一個不同的字元 (驚嘆號) 在執行時展開環境變數。如果啟用了延遲環境變數展開,上面的例子可以被改寫如下而正常作用:

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo If you see this, it worked
    )

    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%

如果您啟用了擴充指令,有幾個動態環境變數會被展開但是不會出現在 SET所顯示的環境變數列表中。這些變數的值會每次在這些變數被展開時動態地重新計算如果使用者用這些變數的名稱來定義變數時,則這個新定義會覆蓋以下所列的動態變數:

%CD% - 展開為含目前目錄的字串。

%DATE% - 展開為與 DATE 命令格式相同的目前日期字串。

%TIME% - 展開為與 TIME 命令格式相同的目前時間字串。

%RANDOM% - 展開為一個在 0 32767 之間的整數亂數值。

%ERRORLEVEL% - 展開為目前的 ERRORLEVEL

%CMDEXTVERSION% - 展開為目前的擴充指令處理器的版本號碼。

%CMDCMDLINE% - 展開為執行指令處理器前的原始指令行。

原创粉丝点击