- ·上一篇文章:FreeDOS 下的 sys 命令帮助
- ·下一篇文章:cmd下命令-ipc$指南
- ·百度中搜索更多的关于“cmd下 有关变量延迟及命令扩展的控制试验”相关内容
- ·谷歌中搜索更多的关于“cmd下 有关变量延迟及命令扩展的控制试验”相关内容
- ******申明******
- 本站文章内容有部分为收录网络中其他网友内容,DOS资源站不保证所有的代码都适合你使用。
- 由于编辑匆忙,有可能造成某些脚本文件出现丢失代码或代码无法运行的情况,请网友根据情况自行修改。
- 如果能将出错部分反馈给我,那就更好了。
cmd下 有关变量延迟及命令扩展的控制试验
下面是偶从命令提示符(xp版)下做的若干小实验,然后把结果全部粘贴过来的(不信的话可以亲手试试).
每个试验都反映了相应的问题,请仔细看个中的差别变化,能把每个试验反映的问题解释清楚那确实不简单!
好! 试验开始了:
试验一
注意:
第7行是直接输入回车
第8行是输入空格再输入回车(请右键全选)
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
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
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
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
试验三
这个试验以及试验七说明了什么?
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
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 看能否达到同样的延迟效果?
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
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,这次看看有新变化区别否?
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 停用延缓的环境扩展。
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!有何不同?
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 批处理中的代码
set "a="
echo !a!
echo %a%
setlocal enabledelayedexpansion
set a=1
echo !a!
echo %a%
pause
代码输出结果(根目录下运行):
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
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 批处理中的代码:
for %%a in (1 3) do (set m=%%a
echo %m%
echo !m!
)
echo %m%
echo !m!
pause
-6.1 代码输出结果(根目录下运行):
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文件的结果不同在何处,)
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 批处理来模拟测试,代码如下:
setlocal enabledelayedexpansion
for %%a in (1 3) do (set m=%%a
echo !m!
)
echo !m!
echo %m%
pause
6.2 批处理中的结果(放在根目录下运行):
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文件的结果不同)
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 批处理代码:
setlocal DISABLEEXTENSIONS
for %%a in (1 3) do (set m=%%a
echo !m!
echo %m%
)
echo !m!
echo %m%
pause
- 6.3 批处理的结果(在C:根目录下的运行结果)
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的开头,下面的语句将不会执行,不知为何.
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 多行输出:
^
pause
^
pause
^
pause

