您的位置:首页 > 其它

批处理命令学习笔记——特殊符号

2016-12-08 13:40 405 查看
三. 批处理中的特殊符号

批处理中的特殊符号主要有下面几种:

  @     > <
    &     |     ~
    %     ^     * ?
    ()     -     +
    :     "     /
    =     ;     ,
    !  


除上面的特殊字符之外,本节还介绍了系统保留文件名和变量赋值的问题。

1. @ 命令

在批处理程序中,@表示关闭当前命令的回显,即不显示 @ 后面的命令。这可以参见Echo 命令。

2. >、< 重定向命令

重定向命令其实也包括“|”,详见 | ,这里不再详细讲述。下面的讲述主要摘自WindowsXP的帮助文档,原文中存在一些编辑错误,作者对之进行了修订。这相当于是官方发布的权威解释。

重定向命令将命令输入和输出数据流从默认位置重定向到不同的位置。输入或输出数据流的位置一般被称为句柄。下表列出了可用于将命令输入和输出数据流进行重定向的操作符。
重定向操作符说明
<从文件中而不是从键盘中读入命令输入。
>将命令输出写入到文件或设备(例如打印机)中,而不是写在命令提示符窗口中。
>>将命令输出添加到文件末尾而不删除文件中的信息。
>&将一个句柄的输出写入到另一个句柄的输入中。
<&从一个句柄读取输入并将其写入到另一个句柄输出中。
默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由 Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。下表列出可用了的句柄。
句柄句柄的数字代号说明
STDIN0键盘输入
STDOUT1输出到命令提示符窗口
STDERR2错误输出到命令提示符窗口
UNDEFINED3-9这些句柄由应用程序和各个具体工具单独定义
数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将前 10 个句柄中的任何一个重定向到该程序。要指定想使用的句柄,可在重定向操作符前面键入该句柄的数字。如果未定义句柄,则采用默认值。默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。键入 > 或 < 操作符之后,必须指定要读取或写入数据的位置。可以指定文件名或另一个现有的句柄。

重定向命令输入 (<)

要从键盘或设备重定向命令输入,请使用 < 操作符。例如,要从 File.txt 而不是键盘(句柄 0 )得到 sort 命令的输入,请键入:

sort <file.txt
File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。

< 操作符可以打开具有只读访问的指定文件名。所以,不能使用该操作符向文件中写入信息。例如,如果以 <&2 启动程序,则所有试图读取句柄 0 的操作都将失败,因为句柄 2 最初是以只写访问打开的。

重定向命令输出 (>)

几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的命令也会在命令提示符窗口显示消息和提示。

要将命令输出从命令提示符窗口重定向到文件或设备,请使用 > 操作符。可以在许多命令中使用该操作符。例如,要将 dir 输出重定向到 Dirlist.txt,请键入:

dir >dirlist.txt
如果 Dirlist.txt 不存在,Cmd.exe 将创建该文件。如果 Dirlist.txt 存在,Cmd.exe 将使用 dir 命令的输出替换文件中的信息。

> 操作符可以打开具有只写访问属性的指定文件。所以,不能使用该操作符读取文件。例如,如果使用重定向 >&0 启动程序,则所有试图写入句柄 1 的操作都将失败,因为句柄 0 最初是以只读访问打开的。

使用 >> 重定向操作符追加输出

要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续的大于号(即 >>)。例如,下面的例子将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾:

netstat >>tcpinfo.txt
使用 <& 操作符重定向输入和复制

要使用重定向输入操作符 <&,指定的文件必须已经存在。如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件中的字符作为输入发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄复制到系统现有的句柄中。

例如,要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,请键入:

findfile file.txt >search.txt 2<&1
使用 >& 操作符重定向输出和复制

如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆盖该文件内容。如果指定了句柄,Cmd.exe 将文件复制到现有句柄中。

要将包括句柄 2(即 STDERR)的所有输出从 ipconfig 命令重定向到句柄 1(即 STDOUT),然后将输出重定向到 Output.log,请键入:

ipconfig.exe >>output.log 2>&1
关于 >& 和 <& 的区别

上面关于 >& 和 <& 的用法,来自于微软的官方帮助文档,其彼此的区别,则颇让人含混。可以说是不解释还明白,越解释则越让人糊涂了。让人糊涂的原因在于,在使用 <& 的例子中,2 作为标准的错误输出,它是不需要输入的,它复制句柄 1 的意义何在呢?直观上,2 >& 1,是很好理解的,即命令的错误输出被重定向到设备或者文件 1,也就是标准输出上去了。而默认输入设备一般只有1个,如果重定向了,需指定其它的文件或者设备,比如 0<COM1,当指定的目标文件或者设备是一个现存的句柄时,需要使用一个 & 符号,比如 0<&3,而一般情况下,只有用户程序才知道这个句柄
3 是个什么设备,普通应用根本用不着。那么 2<&1 又能说明什么问题呢?我们通过下面的例子来理解一下这个区别:

deflate <test.c >test.bin

deflate <test.c >testout.bin 2>&1

deflate <test.c >testin.bin 2<&1

deflate <test.c 2<&1 >testinpre.bin

deflate <test.c 2>&1 >testoutpre.bin

deflate.exe是一个压缩应用程序,默认从键盘获取输入,再输出到屏幕。压缩比通过错误输出打印出来。通过比较第一行命令和第二行命令,发现使用重定向输出和复制的 testout.bin 比 test.bin 多了一个压缩比信息字符串。由此可以说明,命令确实是将错误信息输出到testout.bin中去了。而对 testin.bin 和 testout.bin 进行比较的结果,两个文件完全相同。第四行命令与第五行命令的执行结果则完全与第一行命令相同,即压缩比信息在屏蔽上打印,压缩后的文件存到了 .bin 文件中。

根据以上情况,可以认为,在一般情况下,使用 >& 和使用 <& 并没有什么差别。事实上,我们要需要了解到 2>&1 可以将错误输出同时重定向到同一个文件就足够了。

3. & 与字符

第一种用法:& 组合命令,格式如下:

第一条命令 & 第二条命令 [& 第三条命令...]

用这种方法可以同时执行多条命令,而不管命令是否执行成功。

C:\>dir z: & dir c:\Ex4rch
第二种用法:&& 组合命令,格式如下:

第一条命令 && 第二条命令 [ && 第三条命令...]

用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令。组合命令使用的例子:

@copy trojan.exe \\%1\admin$\system32 && if not errorlevel 1 echo IP %1 USER %2 PASS %3 >>victim.txt

4. | 或字符

第一种用法:| 管道命令,其实这种用法也被当作一个重定向操作符,格式如下:

第一条命令 | 第二条命令 [| 第三条命令...]

将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见。

time /t >> D:\IP.log

netstat -n -p tcp | find ":3389" >> D:\IP.log

start Explorer
看出来了么?用于终端服务允许我们为用户自定义起始的程序,来实现让用户运行下面这个bat,以获得登录用户的IP。

第二种用法:|| 组合命令 ,格式如下:

第一条命令 || 第二条命令 [|| 第三条命令...]

当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令。

5. ~ 变量扩展

变量扩展功能,比如有一个变量 %%i 指示一个文件名,那么 %%~fi 就可以扩展变量到这个文件的完整路径了。可以参考Call 命令、FOR 命令以及Set 命令的详细说明。

6. % 变量引用

引用变量的值。除了前面多次提到的批处理的输入参数及 FOR 的循环变量之外,还包括系统环境变量的扩展。系统环境变量的扩展需要使用两个百分号 “%” 将变量名括起来。比如 %time% 可以扩展到当前的系统时间。

7. ^ 转义字符(脱字符)

主要用来取消特殊定义字符的特殊性。比如要在屏幕显示一些特殊的字符,象> >> | ^等时,就可以在其前面加一个 ^ 符号来显示这个 ^ 后面的字符。^^ 就是显示一个^,^| 就是显示一个|字符了。如:

@echo 3 ^> 2 ?

@if 3 GTR 2 (echo Yes) else echo No!
运行后显示:

3 ^> 2 ?

Yes
8. * ? 通配符

* 代表任意个任意字符,?代表任意单个字符。比如想在c盘的根目录查找c盘根目录里所有的文本文件(.txt),那么就可以输入命令:

dir c:\*.txt
当然,* 字符也可以作为算术运算的乘法运算符,比如:

@set /a x = 4 * 2

@set x
得到的结果是:

x=8
9. () 优先级指定

命令包含或者是具有优先权的界定符,跟C语言中的()具有相似的功能,比如for命令要用到这个(),我们还可以在if、echo等命令中见到它的身影。这里不再详细叙述。

10. - 范围指定

范围表示符,比如日期的查找,for命令里的tokens操作中就可以用到这个字符。当然,- 字符也可以作为算术运算的加法。

11. + 文件连接

主要是在copy命令里面会用到它,表示将很多个文件合并为一个文件,就要用到这个 + 字符了。当然,+ 字符也可以作为算术运算的加法。

12. : 冒号字符

第一种用法:: 标签定位

标签定位符,可以接受goto命令所指向的标签。具体可参见Goto 命令。

第二种用法::: 注释功能

它与@rem具有相似的功能,具体可参见Rem 命令。

13. "" 字符串引用

字符串界定符,在表示带有空格的路径时常要用""来指定路径,在一些命令里面也需要""符号。例如:

dir c:\program files
将会提示:

C:\>dir c:\program files

驱动器 C 中的卷是 SYSTEM

卷的序列号是 C875-8CEE

c:\ 的目录

c:\ 的目录

找不到文件

正确的命令应该写成下面这样:

dir "c:\program files"
14. / 参数声明

参数声明符,也可以表示算术表达式里的除法。比如:

dir /s/b/a-d
表示“dir”命令指定的不同的参数。

15. = 赋值符号

赋值符号,用于变量的赋值,比如“set a=windows”的意思意思是将“windows”这个字符串赋给变量“a”。还可以用于算术运算。详情参见Set 命令。

16. ; 列表分隔符

这个符号一般用在 DIR 命令上,用于分隔待显示文件或者目录的列表。例如:

c:\>dir c:\;"c:\program files"
17. , 参数分隔符

相当于空格,在某些特殊的情况下可以用来代替空格使用。例如:

c:\>dir,c:\
18. ! 变量延时扩展

变量延时扩展,与 % 的作用相似,但仅在启用变量延时扩展时才有效,具体可参见Set 命令。值得注意的是,变量延时扩展并不能象普通的变量引用那样,它不能截取子字符串,不能进行子字符串替换。

19. 保留文件名

微软里面内置了下列单词不能够在创建的文件名中间使用:

PRN LPT# COM# CON NUL AUX

其中,PRN代表打印机,LPT表示并行端口,#代表一个阿拉伯数字,比如lpt0、lpt1等。COM表示串行端口,#意义与 LPT# 中相同。CON表示 CONSOLE 控制台,当作为输入时一般是键盘,当作为输出时,一般是默认的显示器屏幕。NUL表示一个虚拟文件,即不存在的文件。AUX表示一个辅助设备。除了这些单词之外,以下的特殊符号不能被使用在文件名中:

"、\、/、|、:、>、<、*、?

20. 关于变量赋值

大多数字符都可以用作变量的值,包括空格。如果使用特殊字符作为变量的值,比如 <, >, |, &, or ^, 必须在这些特殊字符之前加上脱字符(^)或者使用引号将它们括起来。如果使用引号,那么引号也会被当作变量名的一部分。例如:

要创建变量的值为 new&name,键入:

set varname=new^&name

要创建变量的值为 "new&name",键入:

set varname="new&name"

与符号“&”,管道操作符“|”以及括号“()”作为特殊字符,在作为参数传递给应用程序时,必须在该特殊字符前使用脱字符(^)或者加上双引号。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dos windows 批处理 详解