admin 管理员组

文章数量: 887021

Windows 7 - 命令行参考 - SET

概述

对于程序员来 说,DRY原则(Don't Repeat Youself)可以说是程序员的天职。程序员通过编写程序把企业中的工作流程实现自动化,可以减少企业中工作人员大量的重复工作。一个程序员把自己的代 码封装成库,可以减少另一个程序员的重复工作。那么对于程序员操作自己电脑的重复工作来说,最好的方式也就是通过程序实现自动化。而通过操作系统的命令行 脚本是实现这类自动化工作最常用的手段,在Unix系列操作系统中,在命令行解释器(例如Bash)中编写脚本似乎是天经地义的事情,而在Windows 操作系统中,由于很多应用程序通过图形用户界面(GUI)操作,没有提供相应的命令行调用方式,因此限制了在Windows操作系统中通过命令行脚本实现 自动化,随着越来越多的应用程序增加支持命令行,而且Windows操作系统自身也提供了很多的的命令行程序,就应该尽量通过编写命令行脚本来实现重复操 作。而在编写命令行脚本中,变量赋值至关重要。由于在命令行脚本中调用应用程序是由命令行解释器将一行代码按照一定的规则解析成应用程序名称和一系列参 数,然后运行应用程序并把参数传递给应用程序。并不能像编程语言那样有着严格的语法,因此,错误的变量赋值不仅可能会导致应用程序没有获取预期的参数,而 且这些参数中如果包含用户输入的信息的话,还有可能会导致安全问题。在Windows操作系统中的命令行解释器是cmd.exe,位 于%SystemRoot%/system32/,在命令行解释器cmd.exe中变量赋值的命令是SET,本文的内容就是参照Windows XP、Windows Server 2003、Windows Vista、Windows Server 2008在微软官方网站中的帮助以及Windows 7命令行中SET命令编辑整理得到的。相关链接附在本后。笔者的附注使用标注颜色的注释区分。

Set

显 示、设置或删除CMD.EXE环境变量。如果没有任何参数,set 命令将显示当前环境设置。

语法

set [<Variable>=[<String>]]
set [/p] <Variable>=[<PromptString>]
set /a <Variable>=<Expression>

此处的语法定 义并不严格,还包括:

  • set <Variable-Prefix>
  • set /a <Expression>

参数

参数 描述

<Variable>

指定需要设置或修改的环境变量

SET 命令不允许变量名含有等号

<String>

指定要与指定环境变量关联的字 符串

/p

Variable 值设置成用户输入的一行

<PromptString>

可选,指定一个提示用户输入的消息。该参数与/p命令行选项配合使用

/a

String 设置成可求值的数字表达式

<Expression>

指定一个数值表达式。参看注释了解可以在Expression中使用的有效操作符。

/?

在命令提示符下显示帮

针对前 面额外说明的语法的参数

<Variable-Prefix>,启用命令扩展(默认)并 使用一个值来运行 set ,则会显示以<Variable-Prefix>开头的所有匹配的变量。

注释

  • 使用命令扩展有效时使用SET
    启用命令扩展(默认)并单独运行 set 时,将显示当前所有的环境变量。如果使用一个值来运行 set ,则会显示以该值开头的所有匹配的变量。
    如果在当前环境中找不到该 变量名称,SET 命令将把 ERRORLEVEL设置成 1。
  • 使用特殊字符
    字符 <、>、|、& 和 ^ 是特殊的命令外壳字符,在 String 中使用时必须在其前面使用转义符 (^) 或用引号引起来(即," StringContaining & Symbol " )。 如果要使用引号将含有一个特殊字符的字符串引起来,则该引号将被设置成环境变量值的一部分。
    Windows中命令行解释器的解析方式和特殊字符与 Unix并不相同,例如程序员的入门程序Hello, World!,在Bash中可以写成:

    read -p "Please input your name:" yourname
    echo Hello, ${yourname}!

    如果输入Bash中的 特殊字符时,程序仍能正确输出。例如输入>时,就会输出

    Hello, >!

    如果在Windows的命令行解 释器中写成:

    SET /p YOURNAME=Please input your name:
    ECHO Hello, %YOURNAME%!

    在输入>时,会创建一个文件名为!的文件,内容是Hello, 。原因在于命令行解释器先替换变量

    ECHO Hello, >!

    然后将>解释成了输出重定向。而按照文档中推荐的方式使用引号,比如说程序写成

    ECHO Hello, "%YOURNAME%"!

    ECHO "Hello, %YOURNAME%!"

    结果将是:

    Hello, ">"!

    "Hello, >!"

    结果中就带有了引号,与预期不符。因此请尽量避免使用SET /p由用户输入字符,特别要说明的是网络上常见的DeQuote.bat脚本并不能妥善的解决这个问题。
  • 使用环境变量
    使用环境变量可控制某些批处理文件和程序的行为,还可控制 Windows XP 和 MS-DOS 子系统的显示和工作方式。在 Autoexec.nt 文件中,常用 set 命令设置环境变量。
  • 显示当前的环境设置
    只键入 set 命令时,将显示当前的环境设置。这些设置通常包含用来帮助查找磁盘上程序的 COMSPEC 和 PATH 环境变量。Windows XP 使用的其他两个环境变量是 PROMPT 和 DIRCMD。
  • 使用参数
    指定变量和字符串的值时,指定的变量值将被添加到该环境,而且该字符串与该变量关联。如果环境中已经存在该变量,新的字符串值将替代旧的字符串值。
    如果只为 set 命令指定一个变量和一个等号(没有字符串),则与该变量关联的字符串值将被清除(就像变量根本不存在一样)。
  • 使用 /a
    下表按优先性从高到低的顺序列出了支持 /a 的运算符。
    运算符 执行的操作

    ( )

    分组

    ! ~ -
    一元运算符
    * / %
    算术运算符

    + -

    算术运算符

    << >>

    逻辑移位

    &

    按 位“与”运算

    ^

    按位“异或”运算

    |

    按 位“或”运算

    = *= /= %= += -= &= ^= |= <<= >>=

    赋值

    ,

    表达式 分隔符

    在微软官方网站的Windows XP文档中,没有包括! ~ -这三个一元运算符。而且* / % + -这五个算术运算符写在了一行上。!代表逻辑非,也就是!非零值=0,!0=1。~代表按位取反,也就是~x=1-x。-代表取相反数。
    如果使用逻辑 (&& ||) 或取模 (%) 运算符,请使用引号将表达式字符串引起来。表达式中的非数字字符串将被视为环境变量名,其值将转化成数字然后才进行处理。如果指定当前环境中没有定义的环 境变量名,将会分配零值,允许您对环境变量进行算术运算,而不需要使用 % 检索值。
    如果从命令脚本外的命令行运行 set /a , 则会显示该表达式的最终值。
    数值是指十进制的数字,在前缀加 0× 则表示十六进制数字,加 0 则表示八进制数字。因此,0×12 与 18 相同,也与 022 相同,八进制表示法可能会引起混淆。例如,08 和 09 不是有效数字,因为 8 和 9 不是有效的八进制数字。
  • 使用 /p
    要求包含提示字符串。
  • 支持延迟的环境变量扩展
    已经添加延迟的环境变量扩展支持。默认情况下禁用该支持,不过可使用 cmd /v 启用或禁用它。
  • 在批处理文件中使用 set
    创建批处理文件时,可以使用 set 命令创建变量,然后像使用编号变量 %0%9 一样使用这些变量。另外,也可以使用 %0%9 变量作为 set 命令的输入。
  • 从批处理文件调用 set 变量
    从批处理文件调用变量值时,必须将该值用百分号 (%) 括起来。例如,如果批处理程序创建了一个环境变量 BAUD,则可以在命令行中键入 %baud% ,将与 BAUD 关联的字符串作为可替换参数使用。 
  • 使用“故障恢复控制台”中的 set
    set 命令具有不同的参数,可从“故障恢复控制台”中获得。
  • 环境变量替换已如下增强:
        %PATH:str1=str2%
    会 扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
  • 也 可以为扩展名指定子字符串。
        %PATH:~10,5%
    会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏移量 10)字符开始的五个字符。如果没有指定长度,则采用默认值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,使用的数字则是环境变量数值长度 加上指定的偏移量或长度。
        %PATH:~-10%
    会提取 PATH 变量的最后十个字符。
        %PATH:~0,-2%
    会提取 PATH 变量的所有字符,除了最后两个。
  • 终于添加了延迟环境变量扩充的支持。该支 持总是按默认值被停用,但也可以通过 CMD.EXE 的 /V 命令行开关而被启用/停用。请参阅 CMD /?
    考虑到读取一行文本时所遇到的 目前扩充的限制时,延迟环境变量扩充是很有用的,而不是执行的时候。以下例子说明直接变量扩充的问题:
        set VAR=before
        if "%VAR%" == "before" (
            set VAR=after
            if "%VAR%" == "after" @echo If you see this, it worked
        )
    不会显示消息,因为在读到第一个 IF 语句时,BOTH 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% - 扩展到调用命令处理器的原始命令行。

示例

要设置名为 TEST^1 的环境变量,请键入:

set testVar=test^^1

要设置名为 TEST&1 的环境变量,请键入:

set testVar=test^&1

Set 将变量值设置成等号 (=) 后的内容。如果键入:

set testVar="test^1"

将得到如下结果:

testVar="test^1"

要设置名为 INCLUDE 的环境变量,使字符串 C:/Inc(驱动器 C 上的 /Inc 目录)与该变量关联,请键入:

set include=c:/inc

然后,可以通过用百分号 (%) 将名称 INCLUDE 括起来,从而在批处理文件中使用字符串 C:/Inc。例如,可能在批处理文件中包含以下命令,以便可以显示与 INCLUDE 环境变量关联的目录内容。

dir %include%

处理此命令时,字符串 C:/Inc 将替代 %include%

另外,还可以在批处理程序中使用 set ,将新目录添加到 PATH 环境变量中。例如:

@echo off

rem ADDPATH.BAT adds a new directory

rem to the path environment variable.

set path=%1;%path%

set

启用命令扩展(默认)并使用一个值来运行 set 时,则会显示与该值匹配的变量。例如,如果在命令提示符下键入 set p , 将得到如下结果:

Path=C:/WINNT/system32;C:/WINNT;C:/WINNT/System32/Wbem

PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH

PROCESSOR_ARCHITECTURE=x86PROCESSOR_IDENTIFIER=x86

Family 6 Model 8 Stepping 1, GenuineIntel

PROCESSOR_LEVEL=6PROCESSOR_REVISION=0801

ProgramFiles=C:/Program Files

PROMPT=$P$G

[Windows - 命令行参考 - Set - 文档]

Windows XP 命令行参考 Set英文版, http://technet.microsoft/zh-cn/library/bb490998%28en-us%29.aspx
Windows XP 专业版产品文档 命令行参考 Set英文版, http://www.microsoft/resources/documentation/windows/xp/all/proddocs/en-us/set.mspx
Windows Server 2003 命令行参考 Set中文版, http://technet.microsoft/zh-cn/library/cc772691%28WS.10%29.aspx
Windows Server 2003 命令行参考, Set英文版, http://technet.microsoft/en-us/library/cc772691%28WS.10%29.aspx
Windows Vista / Windows Server 2008 命令行参考 Set英文版, http://technet.microsoft/zh-cn/library/cc754250%28WS.10%29.aspx

[Windows - 官方网站]

Windows 7 简体中文管方网站, http://www.microsoft/china/windows/windows-7/

[Windows - 相关问题]

Windows Vista / Windows Server 2008 命令行参考 Set英文版, http://technet.microsoft/zh-cn/library/cc754250%28WS.10%29.aspx

本文标签: 命令行 Windows set