Board logo

标题: cmd下 有关变量延迟及命令扩展的控制试验 [打印本页]

作者: plp626     时间: 2008-2-2 17:14    标题: cmd下 有关变量延迟及命令扩展的控制试验

下面的"Quote"是偶从命令提示符(xp版)下做的若干小实验,然后把结果全部粘贴过来的(不信的话可以亲手试试).
每个试验都反映了相应的问题,请仔细看个中的差别变化,能把每个试验反映的问题解释清楚那确实不简单!
总之,大家交流交流.
                                                                   ----------------  菜鸟问, 老鸟答.

好! 试验开始了:
试验一
注意:
第7行是直接输入回车
第8行是输入空格再输入回车(请右键全选)


  Quote:
C:\>echo 参数分隔符与控制符 一般字符
参数分隔符与控制符 一般字符

C:\>echo 参数分隔符与控制符 一般字符
参数分隔符与控制符 一般字符

C:\>
C:\>
C:\>,
C:\>;
C:\>=
C:\>)
C:\>:
C:\>::
C:\>:abc
C:\>@

C:\>rem

C:\>rem abc

C:\>&
此时不应有 &。

C:\>|
此时不应有 |。

C:\>||
此时不应有 ||。

C:\>&&
此时不应有 &&。

C:\><
命令语法不正确。

C:\>>
命令语法不正确。

C:\>(
More? )
此时不应有 )。

C:\>^
More? )
C:\>!
'!' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\>^
More?
More?

C:\>%
'%' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\>%%
'%%' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\>abc
'abc' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\>^&
'&' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\>^^
'^' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\>/
'/' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\>\
'\' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\>()
此时不应有 )。

C:\>exit

试验二
试验2.1

  Quote:
C:\>set "a="

C:\>echo %a%
%a%

C:\>set "a=1"

C:\>echo %a%
1

C:\>set a=2&echo %a%
%a%

C:\>echo %a%
2

C:\>exit

试验2.2

  Quote:
C:\>set "a="

C:\>echo %a%
%a%

C:\>set "a=1"

C:\>echo %a%
1

C:\>setlocal enabledelayedexpansion

C:\>set a=2&echo %a%
1

C:\>echo %a%
2

C:\>exit

试验2.3

  Quote:
C:\>set "a="

C:\>echo %a%
%a%

C:\>set "a=1"

C:\>echo %a%
1

C:\>setlocal DISABLEEXTENSIONS

C:\>set a=2&echo %a%
1

C:\>echo %a%
2

C:\>exit

试验三
这个试验以及试验七说明了什么?

  Quote:
C:\>echo %time%&&pause&&echo %time%
13:51:07.76
请按任意键继续. . .
13:51:07.76

C:\>setlocal DISABLEEXTENSIONS

C:\>setlocal enabledelayedexpansion

C:\>echo %time%&&pause&&echo %time%
13:51:08.62
请按任意键继续. . .
13:51:08.62

C:\>exit

试验四----------if 语句中的变量延迟与命令扩展
试验4.1

  Quote:
C:\>set "a=1"

C:>\echo %a%
1

C:\>if "%a%" == "1" (
More? if "%a%" == "2" (echo cn-dos 晕!) else echo cn-dos 帅!
More? )
cn-dos 帅!

C:\>echo %a%
1

C:\>setlocal enabledelayedexpansion

C:\>echo %a%
1

C:\>echo %a%
1

C:\>exit

-------4.1.1 将setlocal enabledelayedexpansion替换为setlocal DISABLEEXTENSIONS 看能否达到同样的延迟效果?

  Quote:
C:\>set "a=1"

C:>\echo %a%
1

C:\>if "%a%" == "1" (
More? if "%a%" == "2" (echo cn-dos 晕!) else echo cn-dos 帅!
More? )
cn-dos 帅!

C:\>echo %a%
1

C:\>setlocal DISABLEEXTENSIONS

C:\>echo %a%
1

C:\>echo %a%
1

C:\>exit

试验4.2

  Quote:
C:\>set "a=1"

C:\>echo %a%
1

C:\>if "%a%" == "1" (
More? set a=2
More? if "%a%" == "2" (echo cn-dos 晕!) else echo cn-dos 帅!
More? )
cn-dos 帅!

C:\>setlocal enabledelayedexpansion

C:\>echo %a%
2

C:\>echo %a%
2

C:\>exit

-------- 4.2.2 同4.1.1,这次看看有新变化区别否?

  Quote:
C:\>set "a=1"

C:\>echo %a%
1

C:\>if "%a%" == "1" (
More? set a=2
More? if "%a%" == "2" (echo cn-dos 晕!) else echo cn-dos 帅!
More? )
cn-dos 帅!

C:\>setlocal DISABLEEXTENSIONS

C:\>echo %a%
2

C:\>echo %a%
2

C:\>exit

*****************这个4.1.1与4.2.2再结合后面的for变量延迟,扩展试验,似乎告诉了我们,在对变量的延迟效用是上,setlocal DISABLEEXTENSIONS与setlocal enabledelayedexpansion二者有相同的作用.********************
试验五.

试验5.1 ---------------看看cmd /v参数到底十来干什么的?
/V:ON   将 ! 作为定界符启动延缓环境变量扩展。如: /V:ON 会
        允许 !var! 在执行时允许 !var! 扩展变量 var。var 语法
        在输入时扩展变量,这与在一个 FOR 循环内不同。
/V:OFF  停用延缓的环境扩展。

  Quote:
C:\>cmd /v:on
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\>set a=1

C:\>echo !a!
1

C:\>cmd /v:off
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\>set a=1

C:\>echo !a!
!a!

C:\>exit

试验5.2 ---- 批处理中的 echo %a% !a!与cmd 下的%a% !a!有何不同?

  Quote:
C:\>set "a="

C:\>echo !a!
!a!

C:\>echo %a%
%a%

C:\>setlocal enabledelayedexpansion

C:\>set a=1

C:\>echo !a!
!a!

C:\>echo %a%
1

C:\>exit

---------------- 试验5.2 批处理中的代码
CODE:  [Copy to clipboard]
set "a="
echo !a!
echo %a%
setlocal enabledelayedexpansion
set a=1
echo !a!
echo %a%
pause
---------------- 代码输出结果(根目录下运行):

  Quote:
C:\>set "a="

C:\>echo !a!
!a!

C:\>echo
ECHO 处于打开状态。

C:\>setlocal enabledelayedexpansion

C:\>set a=1

C:\>echo !a!
1

C:\>echo 1
1

C:\>pause
请按任意键继续. . .

试验六-----------for变量值延迟与命令扩展  
.......这个试验共3个小试验,都是单因素变化,6.2相对6.1开头多了一条setlocal enabledelayedexpansion,6.3相对6.1开头多了一条setlocal DISABLEEXTENSIONS ,咱们看看这会相对于6.1有什么变化?            
6.1

  Quote:
C:\>for %a in (1 3) do (set m=%a
More? echo %m%
More? echo !m!
More? )

C:\>(
set m=1
echo %m%
echo !m!
)
%m%
!m!

C:\>(
set m=3
echo %m%
echo !m!
)
%m%
!m!

C:\>echo %m%
3

C:\>echo !m!
!m!

C:\>exit

-------6.1 批处理中的代码:
CODE:  [Copy to clipboard]
for %%a in (1 3) do (set m=%%a
echo %m%
echo !m!
)
echo %m%
echo !m!
pause
-------6.1 代码输出结果(根目录下运行):

  Quote:
C:\>for %a in (1 3) do (
set m=%a
echo
echo !m!
)

C:\>(
set m=1
echo
echo !m!
)
ECHO 处于打开状态。
!m!

C:\>(
set m=3
echo
echo !m!
)
ECHO 处于打开状态。
!m!

C:\>echo 3
3

C:\>echo !m!
!m!

C:\>pause
请按任意键继续. . .

试验6.2 (请注意cmd下的结果与在P文件的结果不同在何处,)

  Quote:
C:\>for %a in (1 3) do (set m=%a
More? echo %m%
More? echo !m!
More? )

C:\>(
set m=1
echo %m%
echo !m!
)
%m%
!m!

C:\>(
set m=3
echo %m%
echo !m!
)
%m%
!m!

C:\>echo %m%
3

C:\>echo !m!
!m!

C:\>exit

-------- 6.2 批处理来模拟测试,代码如下:
CODE:  [Copy to clipboard]
setlocal enabledelayedexpansion
for %%a in (1 3) do (set m=%%a
echo !m!
)
echo !m!
echo %m%
pause
-------- 6.2 批处理中的结果(放在根目录下运行):

  Quote:
C:\>setlocal enabledelayedexpansion

C:\>for %a in (1 3) do (
set m=%a
echo
echo !m!
)

C:\>(
set m=1
echo
echo !m!
)
ECHO 处于打开状态。
1

C:\>(
set m=3
echo
echo !m!
)
ECHO 处于打开状态。
3

C:\>echo 3
3

C:\>echo !m!
3

C:\>pause
请按任意键继续. . .

试验6.3 (请注意cmd下的结果与在P文件的结果不同)

  Quote:
C:\>setlocal DISABLEEXTENSIONS

C:\>for %a in (1 3) do (set m=%a
More? echo !m!
More? echo %m%
More? )

C:\>(
set m=1
echo !m!
echo %m%
)
!m!
%m%

C:\>(
set m=3
echo !m!
echo %m%
)
!m!
%m%

C:\>exit

-------------- 6.3 批处理代码:
CODE:  [Copy to clipboard]
setlocal DISABLEEXTENSIONS
for %%a in (1 3) do (set m=%%a
echo !m!
echo %m%
)
echo !m!
echo %m%
pause
------------- 6.3 批处理的结果(在C:根目录下的运行结果)

  Quote:
C:\>setlocal DISABLEEXTENSIONS

C:\>for %a in (1 3) do (
set m=%a
echo !m!
echo
)

C:\>(
set m=1
echo !m!
echo
)
!m!
ECHO 处于打开状态。

C:\>(
set m=3
echo !m!
echo
)
!m!
ECHO 处于打开状态。

C:\>echo !m!
!m!

C:\>echo 3
3

C:\>pause
请按任意键继续. . .

试验七
这个命令cmd /E:off下去不光一些系统变量不能正常显示,连某些命令的帮助都有了问题...请看下面:
/E:ON   启用命令扩展
/E:OFF  停用命令扩展
另外这个命令放在P的开头,下面的语句将不会执行,不知为何.

  Quote:
C:\>cmd /E:off
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\>echo %time%
%time%

C:\>echo %cd%
%cd%

C:\>echo %path%
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;G:\cmd

C:\>echo %windir%
C:\WINDOWS

C:\>echo %date%
%date%

C:\>set a=%time%

C:\>echo %a%
%time%

C:\>set b=%windir%

C:\>echo %b%
C:\WINDOWS

C:\>echo %time%&&pause&&echo %time%
%time%
请按任意键继续. . .
%time%

C:\>setlocal /?
开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后
所做的环境改动只限于批处理文件。要还原原先的设置,必须执
行 ENDLOCAL。达到批处理文件结尾时,对于该批处理文件的每个
尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被执行。

SETLOCAL

C:\>cmd /E:on
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\>echo %time%
14:34:36.37

C:>setlocal /?
开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后
所做的环境改动只限于批处理文件。要还原原先的设置,必须执
行 ENDLOCAL。达到批处理文件结尾时,对于该批处理文件的每个
尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被执行。

SETLOCAL

如果命令扩展名被启用,SETLOCAL 会如下改变:

SETLOCAL 批命令现在可以接受可选参数:
        ENABLEEXTENSIONS / DISABLEEXTENSIONS
            启动或停用命令处理器扩展名。详细信息,请参阅 CMD /?。
        ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION
            启动或停用延缓环境变量扩展名。详细信息,请
            参阅 SET /? 。
无论在 SETLOCAL 命令之前它们的设置是什么,这些修改会一直
保留到匹配的 ENDLOCAL 命令。

如果有一个参数,SETLOCAL 命令将设置 ERRORLEVEL 的值。
如果有两个有效参数中的一个,该值则为零。用下列技巧,您
可以在批脚本中使用这个来决定扩展名是否可用:

    VERIFY OTHER 2>nul
    SETLOCAL ENABLEEXTENSIONS
    IF ERRORLEVEL 1 echo Unable to enable extensions

这个方法之所以有效,是因为在 CMD.EXE 的旧版本上,SETLOCAL
不设置 ERRORLEVEL 值。具有不正确参数的 VERIFY 命令将
ERRORLEVEL 值初始化成非零值。

C:\>exit

试验一大家看出了什么没?尤其是那个转义字符^
这里再给三个testcode,结合这3个testcode我想可以解释 echo 多行输出
CODE:  [Copy to clipboard]
^
pause
CODE:  [Copy to clipboard]
^

pause
CODE:  [Copy to clipboard]
^


pause
------------------------------------------------------------------------------------------------------------------------------

[ Last edited by plp626 on 2008-2-10 at 03:26 AM ]
作者: qq43142691     时间: 2008-2-4 07:17
传说中的沙发???
精品啊。。没有人要??都会了??
作者: quhao441673011     时间: 2008-2-4 10:45
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
作者: wjmm     时间: 2008-7-2 10:42
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
作者: danjiang     时间: 2008-7-2 12:14
不错




欢迎光临 中国DOS联盟论坛 (http://cndos.fam.cx/forum/) Powered by Discuz! 2.5