%date:~4,4%     取年
%date:~9,2%     取月
%date:~12,2%   取日
%time:~0,2%     小时
%time:~3,2%     分钟
%time:~6,2%     秒
如:
rem   取系统日期及时间,同时将时间转换为8位(8:16:00-->08:16:00).
set   CurDate=%date:~0,10%
set   CurTime=%time%
set   hh=%CurTime:~0,2%
if   /i   %hh%   LSS   10   ( set   hh=0%CurTime:~1,1% )
set   mm=%CurTime:~3,2%
set   ss=%CurTime:~6,2%
set   CurDateTime=%CurDate%_%hh%:%mm%:%ss%
set   CurDateTime

语法:
%变量:~指定偏移量,指定截取字符长度%

    如果两者的数值(偏移量或长度)是负数,使用的数字将会是环境变数的长度加上位移或指定长度。我会修正上面帖子中的描述。这里举个例子来说明:

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% - 展开为含目前目录的字串。(注:这个扩展功能较之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 就和 18、022 等相同。请注意八进位数字可能容易弄错: 像 08 和 09 就不是正确的数字,因为 8 和 9 并不是八进位的正确数字。

/P 参数让您设定指令行的使用者输入变数值。在读取输入指令行之前,显示指定的 promptString。promptString 可以是空白。

环境变数取代功能已经有下列增强:

    %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% - 展开为执行指令处理器前的原始指令行。