Board logo

标题: [转贴] 批处理的参数、筛选器和重定向符 [打印本页]

作者: cjiabing    时间: 2011-8-3 13:00     标题: 批处理的参数、筛选器和重定向符

微软官方网站对于批处理有许多“官方”的介绍,因为缺乏交流条件,我们往往缺乏系统和深入的学习。搜索了一下论坛,发现批处理参数、筛选器、重定向操作符等方面的内容有所缺漏,特地整理了这三部分内容,转帖到此,希望能和大家一起系统而深入地学习。这三个内容都是批处理利器,不懂得使用批处理参数、筛选器和重定向符的批处理高手不算是真正的高手。
参考地址:
使用批处理文件:http://msdn.microsoft.com/zh-cn/library/cc758944
命令行解释器概述:http://msdn.microsoft.com/zh-cn/library/cc737438
命令行参考:http://msdn.microsoft.com/zh-cn/library/cc785423
有关新命令行工具的列表,请参阅新命令行工具。http://msdn.microsoft.com/zh-cn/library/cc738152
有关命令行工具的完整列表,请参阅命令行参考 A-Z。http://msdn.microsoft.com/zh-cn/library/cc778084
有关一般背景知识,请参阅命令行解释器概述。http://msdn.microsoft.com/zh-cn/library/cc737438
有关配置命令提示符的帮助,请参阅配置命令提示符。http://msdn.microsoft.com/zh-cn/library/cc737937

一、使用批处理参数
可以在批处理文件内的任何地方使用批处理参数,以提取有关环境设置的信息。

Cmd.exe 提供批处理参数扩展变量(%0 到 %9)。在批处理文件中使用批处理参数时,%0 将由批处理文件名替换,而 %1 到 %9 将由在命令行键入的相应参数替换。要访问超出 %9 的参数,必须使用 shift 命令。有关 shift 命令的详细信息,请参阅 Shift。%* 批处理参数是传递到批处理文件中的所有参数(不包括 %0)的通配符引用。

例如,要将 Folder1 中的内容复制到 Folder2,其中 %1 和 %2 将分别由值 Folder1 和 Folder2 替换,请在批处理文件 Mybatch.bat 中键入如下内容:

xcopy %1\*.* %2

要运行该文件,请键入:

mybatch.bat C:\folder1 D:\folder2

这与在批处理文件中键入如下内容是等效的:

xcopy C:\folder1 \*.* D:\folder2

也可以在批处理参数中使用修改符。修改符使用当前的驱动器和目录信息将批处理参数作为部分或完整的文件或目录名进行扩展。要使用修改符,请键入百分号 (%) 字符,后面是波形符号 (~) 字符,然后键入合适的修改符(即 %~modifier)。

下表列出了可在扩展中使用的修改符。

修饰符 描述
%~1  扩展 %1 并删除任何外围引号 ("")。
%~f1  将 %1 扩展到完全限定的路径名。
%~d1  将 %1 扩展到驱动器盘符。
%~p1  将 %1 扩展到路径。
%~n1  将 %1 扩展到文件名。
%~x1  将 %1 扩展到文件扩展名。
%~s1  扩展的路径仅包含短名称。
%~a1  将 %1 扩展到文件属性。
%~t1  将 %1 扩展到文件日期和时间。
%~z1  将 %1 扩展到文件大小。
%~$PATH:1  搜索 PATH 环境变量中列出的目录,并将 %1 扩展到第一个找到的目录的完全限定名称。如果没有定义环境变量名称,或没有找到文件,则此修改符扩展成空字符串。


下表列出了可用于获取综合结果的修改符和限定符的可能组合情况:

修饰符  描述  
%~dp1     将 %1 扩展到驱动器盘符和路径。
%~nx1     将 %1 扩展到文件名和扩展名。
%~dp$PATH:1     在 PATH 环境变量列出的目录中搜索 %1,并扩展到第一个找到的目录的驱动器盘符和路径。
%~ftza1     将 %1 扩展到类似 dir 的输出行。


注意

在上面的例子中,可以使用其他批处理参数值替换 %1 和 PATH。


%* 修改符是唯一可代表在批处理文件中传递的所有参数的修改符。不能将该修改符与 %~ 修改符组合使用。%~ 语法必须通过有效的参数值来终止。

不能以与使用环境变量相同的方式使用批处理参数。不能搜索和替换值,或检查子字符串。但是,可以将参数分配给环境变量,然后对该环境变量进行操作。

二、使用筛选器
命令筛选器与命令重定向竖线 (|) 联合使用,它实际上是一个命令,包含在可读取命令的输入、可转换输入并写入输出的命令中。筛选器命令可以帮助您排序、查看和选择部分命令输出。

筛选器命令可以划分、重排或提取通过它们的部分信息。下表列出 Windows Server 2003 家族中可用的筛选器命令。

命令  描述  
More
在一个命令提示符窗口中每次显示一个文件的内容或一个命令的输出。

查找
在文件和命令输出中搜索您所指定的字符。

Sort
按字母顺序排列文件和命令输出。

要将输入从文件发送到筛选器命令,请使用小于号 (<)。如果要使筛选器命令从其他命令获得输入,请使用竖线 (|)。

使用 more 命令
more 命令在一个命令提示符窗口中每次显示一个文件的内容或一个命令的输出。例如,要在一个命令提示符窗口中每次显示一个名为 List.txt 的文件的内容,请键入:

more < list.txt

此时将出现一个包含信息的命令提示符窗口,然后在命令提示符窗口底部出现 -- More -- 提示。要继续前进到下一个命令提示符窗口,请在键盘上按任意键(除 Pause 之外)。要停止命令且不查看详细信息,请按 Ctrl+C。

使用产生多个输出命令提示符窗口的命令时,可以使用 more 命令。例如,假定要查看硬盘上的目录树。如果命令提示符窗口不能将目录在一屏内全部显示出来,请使用带竖线 (|) 和 more 命令的 tree 命令,如下所示:

tree c:\ | more

出现由 tree 命令产生的第一个输出命令提示符窗口,后面跟着 -- More -- 提示。输出暂停,直到用户按键盘上的任意键为止(Pause 除外)。

使用 find 命令
find 命令在文件中搜索指定的字符串或文本。Cmd.exe 显示与在命令提示符窗口中指定的字符串或文本相匹配的所有行。可以把 find 命令用作筛选器命令,也可以用作标准命令。有关如何将 find 用作标准命令的详细信息,请参阅 查找。

要将 find 命令用作筛选器命令,必须包含小于号 (<) 和要搜索的字符串或文本。默认情况下,find 搜索区分大小写。例如,下面的命令查找文件 Trade.txt 中所有的“Pacific Rim”字符串:

find "Pacific Rim" < trade.txt

输出不包括出现“pacific rim”的任何字符串。输出只包括所有首字母大写的“Pacific Rim”字符串。

要保存 find 命令的输出而不是在命令提示符窗口显示输出,请键入大于号 (>) 和要存储输出内容的文件的名称。例如,下面的命令查找文件 Trade.txt 中存在的“Pacific Rim”字符串,并将结果保存在 Nwtrade.txt 文件中:

find "Pacific Rim" < trade.txt > nwtrade.txt

使用 sort 命令
sort 命令按字母顺序排列文本文件或命令的输出。例如,下列命令对名为 List.txt 的文件的内容进行排序,并在命令提示符窗口中显示排序结果:

sort < list.txt

在此示例中,sort 命令对 List.txt 文件的行按字母列表进行排序并显示结果,但不更改文件。要保存 sort 命令的输出而不是显示输出,请键入大于号 (>) 和文件名。例如,以下命令对 List.txt 文件的行按字母顺序排序,并将结果存储到 Alphlist.txt 文件中:

sort < list.txt > alphlist.txt

要对命令输出进行排序,请键入该命令,键入竖线 (|),然后键入 sort(即,command | sort)。例如,下列命令对包括字符串“Jones”(即,find 命令输出)的行按字母顺序进行排序:

find "Jones" maillst.txt | sort

三、使用命令重定向操作符
可以使用重定向操作符将命令输入和输出数据流从默认位置重定向到其他位置。输入或输出数据流的位置称为句柄。

下表将列出可用的句柄。

句柄 句柄的数字代号 描述
STDIN
0
键盘输入

STDOUT
1
输出到命令提示符窗口

STDERR
2
错误输出到命令提示符窗口

UNDEFINED
3-9
句柄由应用程序单独定义,它们是各个工具特有的


数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序,并对该程序前 10 个句柄中的任何一个句柄进行重定向。要指定要用的句柄,请在重定向操作符之前键入该句柄的数字。如果未定义句柄,则默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。键入 < 或 > 操作符之后,必须指定数据的读写位置。可以指定文件名或其他现有的句柄。

要指定重定向到现有句柄,请使用与 (&) 字符,后面接要重定向的句柄号(即 &句柄号)。例如,下面的命令可以将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):

2>&1

下表列出了可用于重定向输入和输出数据流的操作符。


重定向操作符  描述  
>
将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或句柄。

<
从文件而不是从键盘或句柄读入命令输入。

>>
将命令输出添加到文件末尾而不删除文件中已有的信息。

>&
将一个句柄的输出写入到另一个句柄的输入中。

<&
从一个句柄读取输入并将其写入到另一个句柄输出中。

|
从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。


默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由 Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。

重定向输入 (<)
要通过键盘将输入重定向到文件或设备,请使用 < 操作符。例如,要从 File.txt 获取 sort 命令的输入,请键入:

sort<file.txt

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

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

注意

0 是 < 重定向输入操作符的默认句柄。


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

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

dir>dirlist.txt

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

要运行 netsh routing dump 命令,然后将输出发送到 Route.cfg,请键入:

netsh routing dump>c:\route.cfg

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

注意

1 是 > 重定向输出操作符的默认句柄。


复制句柄
重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如,要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,请键入:

dir>c:\file.txt 2>&1

复制句柄时,可以复制该句柄原状态的所有特性。例如,如果一个句柄具有只读访问的属性,则该句柄的所有副本都具有只读访问属性。不能将一个具有只读访问属性的句柄复制到另一个具有只写访问属性的句柄。

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

例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,请键入:

< file.txt

要打开 File.txt,并在内容排序后将输出发送到命令提示符窗口(即 STDOUT),请键入:

sort< file.txt

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

findfile file.txt>search.txt 2<&1

要以句柄 0 输入读取(即 STDIN)的方式复制用户定义的句柄 3,请键入:

<&3

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

要将用户定义的句柄 3 复制到句柄 1,请键入:

>&3

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

ipconfig.exe>>output.log 2>&1

使用 >> 重定向操作符附加输出
要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续的大于号(即 >>)。例如,使用下列命令可以将 dir 命令生成的目录列表附加到 Dirlist.txt 文件:

dir>>dirlist.txt

要将 netstat 命令的输出附加到 Tcpinfo.txt 的末尾,请键入:

netstat>>tcpinfo.txt

使用管道操作符 (|)
管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其定向到另一个命令的输入(默认情况下是 STDIN)中。例如,使用下面的命令可以对目录进行分类:

dir | sort

在本例中,将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令的输出为止。sort 命令使用 dir 命令的输出作为输入,然后将输出发送到句柄 1(即 STDOUT)。

合并带重定向操作符的命令
通过合并带有其他命令和文件名的筛选器命令,可以创建自定义命令。例如,可以使用以下命令存储包含“LOG”字符串的文件名:

dir /b | find "log" loglist.txt

dir 命令的输出是通过 find 筛选器命令进行发送的。包含字符串“LOG”的文件名作为文件名列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存储在文件 Loglist.txt 中。

要在相同命令中使用多个筛选器,请使用管道 (|) 分隔筛选器。例如,下面的命令将搜索 C 盘上的每个目录以查找包含“LOG”字符串的文件名,并且在命令提示符窗口中每次显示一屏:

dir c:\ /s /b | find "log" | more

利用管道 (|) 可以对 Cmd.exe 进行定向,使其通过 find 筛选器命令发送 dir 命令输出。find 命令只选择包含字符串“LOG”的文件名。more 命令可以显示 find 命令选择的文件名(在命令提示符窗口中每次显示一屏)。有关筛选器命令的详细信息,请参阅使用筛选器。
作者: cjiabing    时间: 2011-8-3 13:03

本帖最后由 cjiabing 于 2011-8-3 13:10 编辑

使用举例:
1、能否告诉我,在批处理里,修改指定变量值的脚本吗??
如:D:\CLIENT\BIN\SET-CLIENT.BAT   此文件里的变量:
                                   JAVA SERVER=HTTP://192.168.1.2 和
                                   BASIC SERVER=HTTP://192.168.1.2
将这个两个变量的值修改成任意IP的脚本是什么??盼回复,谢谢!!!
解答:試例代碼:
  1. set ip1=%1
  2. set ip2=%2
  3. echo %ip1% %ip2%
复制代码

2、当一个分号 (;) 或等号 (=) 用作在批处理文件中的命令行参数,则将其视为一个空格。 在以下的批处理文件 TEST.BAT,例如对于    echo %1 %2 %3                               

命令行,并输出结果如下所示:    Command Line       Output   ------------       ------   test a=b           a b   test a;b           a b   test ;ab           ab   test =             ECHO is on (parsed as test)   test ;             ECHO is on




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2