批处理之延迟环境变量扩展

来源:互联网 发布:日本经典电影知乎 编辑:程序博客网 时间:2024/06/09 15:33

所谓延迟变量扩展,实际上是指批处理运行命令时将变量扩展时机延迟到命令运行时,而不是加载时。

@echo off

set a=1

if %a%==1 set a=2 & echo %a%

pause

输出结果为:

1

原因是在 if 语句开始正式运行之前,批处理脚本引擎已经将该条语句扩展为

if 1==1 set a=2 & echo 1

为了避免%a%被过早扩展,我们就可以引入延迟变量扩展机制

@echo off & setlocal enabledelayedexpansion

set a=1

if %a%==1 set a=2 & echo !a!

pause

输出结果为:

2

上面例子中粗体的部分也可以看出延迟变量扩展的语法:

1. 使用 setlocal enabledelayedexpansion 启用延迟变量扩展

2. 用 !a! 来使用变量 a; 注意 %a% 仍可使用,但会被过早扩展,即使已经启用延迟变量扩展

@echo off & setlocal enabledelayedexpansion

set a=1

if %a%==1 set a=2 & echo %a%

pause

输出结果为:

1

除了上述用法之外,延迟变量扩展还可用于变量的嵌套,比如:

@echo off

set cd=5

set a=c

set b=d

echo %a%%b% ==> 输出 cd

要输出%a%%b%所指向的环境变量的值,就要启用延迟变量扩展

@echo off & setlocal enabledelayedexpansion

set cd=5

set a=c

set b=d

echo !%a%%b%! ==> 输出 5

下面是另外一个嵌套循环变量的例子

@echo off & setlocal enabledelayedexpansion

set a=abcdefghijk

for /l %%i in (1,1,10) do (

 cls

 echo !a:~0,%%i!

 ping 10 127.1 > nul

)

pause

------------------------------------------------------------------------------

提示:在没有开启变量延迟的情况下,某条命令行中的变量改变,必须到下一条命令才能体现。这一点也可以加以利用,看例子。
例:交换两个变量的值,且不用中间变量
@echo off
::目的:交换两个变量的值,但是不使用临时变量

set var1=abc
set var2=123
echo 交换前: var1=%var1% var2=%var2%
set var1=%var2%& set var2=%var1%
echo 交换后: var1=%var1% var2=%var2%
pause

 

 

  

常见环境变量  

      %ALLUSERSPROFILE% 局部 返回所有“用户配置文件”的位置。
  %APPDATA% 局部 返回默认情况下应用程序存储数据的位置。
  %CD% 局部 返回当前目录字符串。
  %CMDCMDLINE% 局部 返回用来启动当前的 Cmd.exe 的准确命令行。
  %CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
  %COMPUTERNAME% 系统 返回计算机的名称。
  %COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。

 %DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。
  %ERRORLEVEL% 系统 返回最近使用过的命令的错误代码。通常用非零值表示错误。
  % HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
  %HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
  %HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
  %LOGONSEVER% 局部 返回验证当前登录会话的域控制器的名称。
  %NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
  %OS% 系统 返回操作系统的名称。Windows 2000 将操作系统显示为 Windows_NT。
  %PATH% 系统 指定可执行文件的搜索路径。
  %PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
  %PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值: x86,IA64。
  %PROCESSOR_IDENTFIER% 系统 返回处理器说明。
  %PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
  %PROCESSOR_LEVEL% 系统 返回处理器的版本号。
  %PROMPT% 局部 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
  %RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
  %SYSTEMDRIVE% 系统 返回包含 Windows XP 根目录(即系统根目录)的驱动器。
  %SYSTEMROOT% 系统 返回 Windows XP 根目录的位置。
  %TEMP% and %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其它应用程序则需要 TMP。
  %TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关 time 命令的详细信息,请参阅 Time。
  %USERDOMAIN% 局部 返回包含用户帐户的域的名称。
  %USERNAME% 局部 返回当前登录的用户的名称。
  %UserPrefix% 局部 返回当前用户的配置文件的位置。
  %WINDIR% 系统 返回操作系统目录的位置。
      
         
       Windows 常见的系统目录简写环境变量
 

        所谓的Windows系统目录简写环境变量,就是为一些常用且固定的Windows系统目录的路径建立一个与之对应的相对简单的缩写,使之更容易输入或定位。

  Windows系统默认情况下都是安装在电脑C盘的Windows目录下,但这并不是固定的,如果你的系统不是安装在这个目录下,那么程序想要定位你的某个系统目录的话,就需要使用到目录简写环境变量了。使用这些环境变量,程序员或系统管理员无需事先了解你的系统安装位置,就能轻易的找到所要使用的系统目录路径。

  下面,我就来为大家介绍一些常见的Windows系统目录简写环境变量

  %SYSTEMDRIVE%

  这代表的是Windows系统所在磁盘分区,也就是Windows系统所安装到的盘符根目录,通常就是C盘的根目录了。

  %HOMEDRIVE%

  这和上面介绍的%SYSTEMDRIVE%的功能是一样的。

  %SYSTEMROOT%

  它所指向的是Windows系统所在的目录,通常就是C:/Windows。

  %WINDIR%

  和%SYSTEMROOT%的功能相同,指向Windows所在目录。

  %ProgramFiles%

  指向Program Files的路径,通常情况下是C:/Program Files。

  %CommonProgramFiles%

  指向公用文件(Common Files)目录,通常是C:/Program Files/Common Files。

  %USERPROFILE%

  指向当前帐户的用户目录,通常是C:/Documents and Settings/当前用户名。

  %HOMEPATH%

  功能和上面的%USERPROFILE%是一样的。

  %ALLUSERSPROFILE%

  指向所有用户的用户目录,通常是C:/Documents and Settings/All Users。

  %APPDATA%

  指向当前用户的Application Data目录,通常是C:/Documents and Settings/当前用户名/Application Data。

  很多文章都会介绍一个叫做%ALLAPPDATA%的变量,说它是指向C:/Documents and Settings/All Users/Application Data的,但其实这个变量并不能使用。

  %TEMP%

  它指向的是当前用户的临时文件目录,通常是C:/Documents and Settings/当前用户名/Local Settings/Temp。

  %TMP%

  与%TEMP%的指向相同。

  %ComSpec%

  指向C:/WINDOWS/System32/cmd.exe,也就是命令提示符。

 

另外再记录一下 Xcopy 的用法

XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]
                           [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]
                           [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z]
                           [/EXCLUDE:file1[+file2][+file3]...]

source       指定要复制的文件。
destination 指定新文件的位置和/或名称。
/A           只复制有存档属性集的文件,
               但不改变属性。
/M           只复制有存档属性集的文件,
               并关闭存档属性。
/D:m-d-y     复制在指定日期或指定日期以后更改的文件。
               如果没有提供日期,只复制那些源时间
               比目标时间新的文件。
/EXCLUDE:file1[+file2][+file3]...
               指定含有字符串的文件列表。每一个字符串
               必须在文件的单独行中。如果有任何
               字符串与要被复制的文件的绝对路径
               相符,那个文件将不会得到复制。
               例如,指定如 /obj/ 或 .obj 的字符串会排除
               目录 obj 下面的所有文件或带有
               .obj 扩展名的文件。
/P           创建每个目标文件前提示。
/S           复制目录和子目录,除了空的。
/E           复制目录和子目录,包括空的。
               与 /S /E 相同。可以用来修改 /T。
/V           验证每个新文件。
/W           提示您在复制前按键。
/C           即使有错误,也继续复制。
/I           如果目标不存在,又在复制一个以上的文件,
               则假定目标一定是一个目录。
/Q           复制时不显示文件名。
/F           复制时显示完整的源和目标文件名。
/L           显示要复制的文件。
/G           允许将没有经过加密的文件复制到
               不支持加密的目标。
/H           也复制隐藏和系统文件。
/R           覆盖只读文件。
/T           创建目录结构,但不复制文件。
               不包括空目录或子目录。/T /E 包括
               空目录和子目录。
/U           只复制已经存在于目标中的文件。
/K           复制属性。一般的 Xcopy 会重置只读属性。
/N           用生成的短名复制。
/O           复制文件所有权和 ACL 信息。
/X           复制文件审核设置(隐含 /O)。
/Y           复制文件审核设置(隐含 /O)。
               现存目标文件。
/-Y          导致提示以确认改写一个
               现存目标文件。
/Z            用重新启动模式复制网络文件。

命令行开关 /Y 可以预先在 COPYCMD 环境变量中设置。
这可能被命令行上的 /-Y 改写。

列如我要复制一个文件夹到C盘目录下面可以用

XCOPY "xxx xx" "%SYSTEMDRIVE%" /Y /E

   
  

在命令行中对环境变量进行编辑


   查看当前可用的所有环境变量(=系统变量+用户变量)

  查看某个环境变量,如PATH
  set PATH
  添加环境变量,如xxx=aa
  set xxx=aa
  将环境变量(如xxx)的值置为空
  set xxx=
  在某个环境变量(如PATH)后添加新的值(如d:/xxx)
  set PATH=%PATH%;d:/xxx
  (注:在dos窗口中以命令行方式对环境变量的操作只对当前窗口的应用有效)

百度百科中的词条内容仅供参考,如果您需要解决具体问题
(尤其在法律、医学等领域),建议您咨询相关领域专业人士。
本词条对我有帮助416
 
              环境变量系列应用(一)

  环境变量是由 Windows 可以使用的与符号名称相关的环境信息(例如,驱动器、路径或文件名)组成的字符串。它们控制着多种程序的行为。例如,TEMP 环境变量指定程序放置临时文件的位置。任何用户都可以添加、修改或删除用户的环境变量。但是,只有管理员才能添加、修改或删除系统环境变量

  一、添加或更改环境变量的数值

  依次点击“开始→设置→控制面板→性能和维护→系统”,弹出系统属性对话框。点击“高级”选项卡,接着单击“环境变量”按钮,这时会弹出”环境变量“对话框(如图所示)。另外,你还可以通过鼠标右键点击桌面上的“我的电脑”图标,选择“属性”,然后打开“高级”选项卡,再点击“环境变量”按钮来打开“环境变量”对话框。在这里你可以“新建”、“编辑”、“删除”环境变量


  注意:如果不是以管理员身份登录到本地计算机,则惟一能更改的环境变量是用户变量。要更改系统变量则必须以管理员的身份登录。对系统环境变量的修改将在下次启动计算机时生效。

  二、环境变量的应用实战

  妙用一:快速打开特定的目录

  在Windows有许多目录是我们经常需要访问的目录,例如TEMP目录,在这个目录中存放有系统的临时文件,我们经常要访问该目录,将其中的临时文件清除,以提高系统的性能。通常情况下我们要打开TEMP目录,必须首先启动资源管理器,接着打开C盘,然后再找到Documents and Settings文件夹,打开以自己账户名命名的目录,然后找到Local Settings目录,最后才是打开TEMP目录。虽然TEMP目录就在Local Settings目录下,但是默认情况下,Local Settings目录具有隐藏属性,我们是看不到该目录的。还必须点击资源管理器菜单栏中的“工具→文件夹选项”命令,在文件夹选项对话框中点击“查看”选项卡,然后选中“显示所有文件和文件夹”才能够看到Local Settings目录。可见,要打开TEMP目录十分的麻烦。

  但是如果你熟悉环境变量,那么你完全可以利用环境变量来快速地打开TEMP目录。点击“开始→运行”,在弹出的运行对话框中输入“%temp%”(实际输入时不包括外侧的双引号,下同)或者输入“%TMP”,回车后就可以立以资源管理器的形式打开“C:/Documents and Settings/qs/Local Settings/Temp”目录了。

  另外,你还可以举一反三:

  要打开Windows目录,就在运行对话框中输入“%systemroot%”;

  要打开Windows目录下的TEMP目录,就在运行对话框中输入“TEMP”。
  
         
环境变量系列应用(二)

   妙用二 让多操作系统共享应用程序

  现如今,安装多操作系统的朋友是越来越多了,多操作系统有多操作系统的好处,但弊端也很明显,在甲操作系统中安装的所有应用程序,到了乙操作系统中几乎全都消失得无影无踪了。要使用这些应用程序不得不在每一个操作系统中都重新安装一遍。这样问题是解决了,但要消耗大量的硬盘空间,着实地让你心疼。其实,巧妙地利用环境变量,我们就可以让多操作系统共享应用程序,而不需要在每一个操作系统中都重新安装。

  下面以在C盘安装有Windows 98,后来又在D盘安装了Windows 2000,并且所有的应用程序都是在Windows 98中安装的为例加以说明。

  第一步,Windows 2000 安装好后,进入到C盘的“C:/Program Files”目录中,依次展开各个应用程序文件夹,找到应用程序的可执行性文件,点右键,选择右键菜单中的“发送到→桌面快捷方式”,这样各个应用程序的桌面快捷方式就建立好了。

  第二步,试着点击桌面上的各个快捷方式,看各个应用程序能不能正常运行,这时你会发现有些应用程序可以正常运行(如:ACDSee、Foxmail、WPS 2000等),而有些需要重新输入序列号进行注册才可以正常运行(如:WinZip、Dreamweaver、Firework、Flash、CuteFTP等),特别是有些程序(如:Photoshop等)打开后弹出一系列对话框,显示无法找到*****动态链接库以及无法找到指定的路径*****等等信息,但只要一路单击“确定”,仍然能够打开。今天我们讲的就是这种启动出现错误提示的程序,巧妙利用环境变量可以让这些错误提示不再出现,并且可以让应用程序正常使用。


图1

  第三步,在Windows 2000的桌面上,右键点击桌面上的“我的电脑”图标,选择“属性”,然后打开“高级”选项卡,再点击“环境变量”按钮打开“环境变量”对话框。在“系统变量”列表框中找到“Path”变量,点击“编辑”按钮,在弹出的“编辑系统变量”对话框,我们可以看到“变量值”文本框中已经存在以下内容:“%SystemRoot%/system32;%SystemRoot%;%SystemRoot%/System32/Wbem”,保持原有内容不变,在后面加上以下内容:“;C:/WINDOWS;C:/WINDOWS/SYSTEM;C:/WINDOWS/SYSTEM32”,点“确定”按钮,然后重新启动计算机,双击Photoshp.exe时,你便会发现再也没有前面列举的那些对话框了。


图2

   妙用三 让设备管理器显示出更多的设备细节

  按照上述方法进入到“环境变量”对话框中,点“新建”按钮,弹出“新建用户变量”对话框,如图1所示,在“变量名”文本框中输入“devmgr_show_details”,在“变量值”文本框中输入“1”,点“确定”按钮,并关闭系统属性对话框。

  好了,现在启动设备管理器,双击某一个具体的设备,弹出“属性”窗口,仔细看一下,是不是多出了一个“详细信息”的选项卡,如图2所示。里面的选项十分丰富,可以帮助用户详细了解硬件设备的具体参数。

  另外,如果你只是临时想使用一下“详细信息”选项卡,只要在“运行”对话框中输入“CMD”,打开命令提示符窗口,输入“set devmgr_show_details=1”,然后再输入“start devmgmt.msc”,如图3所示,即可为设备管理器添加“详细信息”选项卡,但这只是临时的,待下次重启设备管理器时“详细信息”选项卡将不再出现。

 
图3
环境变量系列应用(三)


  妙用四:让故障恢复控制台更强大

  现在玩多操作系统的朋友越来越多了,众所周知,利用Windows 2000/XP/2003操作系统的故障恢复控制台可以快速有效地解决Windows自身和多操作系统引导过程中发生的各种各样的故障。因此,故障恢复控制台被许多用户喻为系统的救命稻草。但是,默认情况下系统会对故障恢复控制台做出许多的限制,例如:不允许访问驱动器和文件夹,不允许进行软盘复制和访问等等。这对我们在故障恢复控制台下进行系统的维护修复工作造成了很大的不便。你可以利用环境变量轻松解除这些限制。

  当你在故障恢复控制台下工作时,如遇到限制感到不便时,在命令提示符下键入以下命令,即可解除限制:

  Set AllowAllPaths = TRUE ——允许访问所有文件和目录 ;

  Set AllowWildCards = TRUE——允许在命令行中使用通配符 ;

  Set AllowRemovableMedia = TRUE——允许将文件复制到可移动存储介质中;

  Set NoCopyPrompt = TRUE——覆盖现有文件时不显示提示;

  好了,现在你在故障恢复控制台下已经有足够的自由了。需要说明的是通过Set命令设置的环境变量只对当前的故障恢复控制台有效,下次重新引导使用故障恢复控制台时,必须重新利用Set命令设置环境变量。 另外,Set命令的用法和当前所有的环境变量用户可以在命令提示符后键入Set来获得。
原创粉丝点击