Perl Unicode全攻略

转载:http://www.cnblogs.com/starspace/archive/2008/12/10.html

耐心看完本文,相信你今后在unicode处理上不会再有什么问题。

本文内容适用于perl 5.8及其以上版本。

perl internal form

在Perl看来, 字符串只有两种形式。 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string。 也就是说: Perl只认识两种编码: Ascii(octets)和utf8(string)。

utf8 flag

那么perl如何确定一个字符串是octets还是utf8编码的字符串呢? perl可没有什么智能, 他完全是靠字符串上的utf8 flag。在perl内部, 字符串结构由两部分组成: 数据utf8 flag。比如字符串“中国”在perl内部的存储是这样:

utf8 flag     

数据

On

中国


如果utf8 flag是On的话, perl就会把中国当成utf8字符串来处理, 如果utf8 flag为Off, perl就会把他当成octets来处理。所有字符串相关的函数包括正则表达式都会受utf8 flag的影响。让我们来看个例子:

程序代码:

use Encode;
use strict;

my $str = "中国";
Encode::_utf8_on($str);
print length($str) . "/n";
Encode::_utf8_off($str);
print length($str) . "/n";


运行结果是:

2
6


这里我们使用Encode模块的_utf8_on函数和_utf8_off函数来开关字符串“中国”的utf8 flag。可以看到, utf8 flag打开的时候,“中国”被当成utf8字符串处理, 所以其长度是2。 utf8 flag关闭的时候,“中国”被当成octets(字节数组)处理, 出来的长度是6(我的编辑器用的是utf8编码, 如果你的编辑器用的是gb2312编码, 那么长度应该是4)。

再来看看正则表达式的例子:

程序代码:

use Encode;
use strict;

my $a = "china----中国";
my $b = "china----中国";
Encode::_utf8_on($a);
Encode::_utf8_off($b);
$a =~ s//W+//g;
$b =~ s//W+//g;
print $a, "/n";
print $b, "/n";


运行结果:

Wide character in print at unicode.pl line 10.
china中国
china


结果第一行是一条警告, 这个我们稍后再讨论。结果的第二行说明, utf8 flag开启的情况下, 正则表达式中的/w能够匹配中文, 反之则不能。

如何确定一个字符串的utf8 flag是否已开启? 使用Encode::is_utf8($str)。这个函数并不是用来检测一个字符串是不是utf8编码, 而是仅仅看看它的utf8 flag是否开启。

eq

eq是一个字符串比较操作符, 只有当字符串的内容一致并且utf8 flag的状态也是一致的时候, eq才会返回真。


理论就是上面这些, 一定要搞明白, 记清楚! 下面是实际应用。



unicode转码

如果你有一个字符串“中国”, 它是gb2312编码的。 如果它的utf8 flag是关闭的, 它就会被当成octets来处理, length()会返回4, 这通常不是你想要的。 而如果你开启它的utf8 flag, 则它会被当做utf8编码的字符串来处理。由于它本来的编码是gb2312的, 不是utf8的,这就可能导致错误发生。由于gb2312和utf8内码范围部分重叠, 所以很多时候, 不会有错误报出来, 但是perl可能已经错误地拆解了字符。严重的时候, perl会报警, 说某个字节不是合法的utf8内码。

解决的方法很显然, 如果你的字符串本来不是utf8编码的, 应该先把它转成utf8编码, 并且使它的utf8 flag处于开启状态。对于一个gb2312编码的字符串, 你可以使用

程序代码:

$str = Encode::decode("gb2312", $str);


来将其转化为utf8编码并开启utf8 flag。如果你的字符串编码本来就是utf8, 只是utf8 flag没有打开, 那么你可以使用以下三种方式中的任一种来开启utf8 flag:

程序代码:

$str = Encode::decode_utf8($str);
$str = Encode::decode("utf8", $str);
Encode::_utf8_on($str);


最后一种方式效率最高, 但是官方不推荐。以下划线开头的函数是内部函数, 出于礼貌, 一般不从外部调用。

字符串连接

. 是字符串连接操作符。连接两个字符串时, 如果两个字符串的utf8 flag都是Off, 那么结果字符串也是Off. 如果其中任何一个字符串的utf8 flag是On的话, 那么结果字符串的utf8 flag将是On。连接字符串并不会改变它们原来的编码, 所以如果你把两个不同编码的字符串连在一起, 那么以后不管对这个字符串怎么转码, 都总会有一段是乱码。这种情况一定要避免, 连接两个字符串之前应该确保它们编码一致。如有必要, 先进行转码, 再连接字符串。

perl unicode编程基本原则

对于任何要处理的unicode字符串, 1)把它的编码转换成utf8; 2)开启它的utf8 flag

字符串来源

为了应用上面说到的基本原则, 我们首先要知道字符串本来的编码和utf8 flag开关情况, 这里我们讨论几种情况。

1) 命令行参数和标准输入。 从命令行参数或标准输入(STDIN)来的字符串, 它的编码跟locale有关。如果你的locale是zh_CN或zh_CN.gb2312, 那么进来的字符串就是gb2312编码, 如果你的locale是zh_CN.gbk, 那么进来的编码就是gbk, 如果你的编码是zh_CN.UTF8, 那进来的编码就是utf8。 不管是什么编码, 进来的字符串的utf8 flag都是关闭的状态。

2) 你的源代码里的字符串。 这要看你编写源代码时用的是什么编码。 在editplus里, 你可以通过“文件”->“另存为”查看和更改编码。 在linux下, 你可以cat一个源代码文件, 如果中文正常显示, 说明源代码的编码跟locale是一致的。源代码里的字符串的utf8 flag同样是关闭的状态。

如果你的源代码里含有中文, 那么你最好遵循这个原则: 1) 编写代码时使用utf8编码, 2)在文件的开头加上“use utf8;”语句。这样, 你源代码里的字符串就都会是utf8编码的, 并且utf8 flag也已经打开。

3) 从文件读入。 这个毫无疑问, 你的文件是什么编码, 读进来就是什么编码了。读进来以后, utf8 flag是off状态。

4) 抓取网页。网页是什么编码就是什么编码, utf8 flag是off状态。网站的编码可以从响应头里或者html的标签里获得。也有可能出现响应头和html head里都没说明编码的情况, 这个就是做的很不礼貌的网页了。这时候只能用程序来猜:

程序代码:

use Encode;
use LWP::Simple qw(get);
use strict;

my $str = get "http://www.sina.com.cn";

eval {my $str2 = $str; Encode::decode("gbk", $str2, 1)};
print "not gbk: $@/n" if $@;

eval {my $str2 = $str; Encode::decode("utf8", $str2, 1)};
print "not utf8: $@/n" if $@;

eval {my $str2 = $str; Encode::decode("big5", $str2, 1)};
print "not big5: $@/n" if $@;


输出:

程序代码:

not utf8: utf8 "/xD0" does not map to Unicode at /usr/local/lib/perl/5.8.8/Encode.pm line 162.

not big5: big5-eten "/xC8" does not map to Unicode at /usr/local/lib/perl/5.8.8/Encode.pm line 162.


我们给decode函数传递了第三个参数, 要求有异常字符的时候报错。我们用eval捕获错误, 转码失败说明字符串本来不是这种编码。另外注意我们每次都把$str拷贝到$str2, 这是因为decode第三个参数为1时, decode以后, 传给它的字符串参数(第二个参数会被清空)。我们拷贝一下, 这样每次被清空的都是$str2, $str不变。

来看结果, 既然不是utf8, 也不是big5, 那就应该是gbk了。对于其他不知编码的字符串, 也可以使用这种方法来猜。不过因为几种编码的内码范围都差不多, 所以如果字符串比较短, 就可能出不了异常字符, 所以这个方法只适用于大段的文字。

输出

字符串在程序内被正确地处理后, 要展现给用户。这时我们需要把字符串从perl internal form转化成用户能接受的形式。简单地说, 就是把字符串从utf8编码转换成输出的编码或表现界面的编码。这时候, 我们使用$str = Encode::encode('charset', $str);。同样可以分为几种情况。

1) 标准输出。标准输出的编码跟locale一致。输出的时候utf8 flag应该关闭, 不然就会出现我们前面看到的那行警告:

Wide character in print at unicode.pl line 10.


2) GUI程序。这个应该是不用干什么, utf8编码, utf8 flag开启就行。没有实际测试过。

3) http post。看网页表单要求什么编码。utf8 flag开或关无所谓, 因为http post发送出去的只是字符串中的数据部分, 不管utf8 flag。

PerlIO

PerlIO为我们的输入/输出转码提供了便利。它可以针对某个文件句柄, 输入的时候自动帮你转码并开启utf8 flag, 输出的时候, 自动帮你转码并关闭utf8 flag。假设你的终端locale是gb2312, 看下面的例子:

程序代码:

use strict;
binmode(STDIN, ":encoding(gb2312)");
binmode(STDOUT, ":encoding(gb2312)");
while (<>) {
    chomp;
    print $_, length, "/n";
}


运行后输入"中国", 结果:

中国2


这样我们就省去了输入和输出时转码的麻烦。PerlIO可以作用于任何文件句柄, 具体请参考perldoc PerlIO。

相关API

都是Encode模块的:

$octets = encode(ENCODING, $string [, CHECK]) 把字符串从utf8编码转成指定的编码, 并关闭utf8 flag。

$string = decode(ENCODING, $octets [, CHECK]) 把字符串从其他编码转成utf8编码, 并开启utf8 flag, 不过有个例外就是, 如果字符串是仅仅ascii编码或EBCDIC编码的话, 不开启utf8 flag。

is_utf8(STRING [, CHECK]) 看看utf8 flag是否开启。如果第二个参数为真, 则同时检查编码是否符合utf8。这个检测不一定准确, 跟decode方式检测效果一样。

_utf8_on(STRING) 打开字符串的utf flag

_utf8_off(STRING) 关闭字符串的utf flag

最后两个是内部函数, 不推荐使用。

参考perldoc Encode。

utf8和utf-8

前面我们提到的一直都是utf8。在perl中, utf8和utf-8是不一样的。utf-8是指国际上标准的utf-8定义, 而utf8是perl在国际标准上做了一些扩展, 能兼容的内码要比国际标准的多一些。perl internal form使用的是utf8。另外顺便提一下, 字符集的名称是不区分大小写的并且“_”和“-”是等价的。

EBCDIC

EBCDIC是一套遗留的宽字符解决方案, 不同于unicode, 它不是Ascii的超集。上面介绍的方案并不完全适用于EBCDIC。关于EBCDIC, 请参考perldoc perlebcdic。 

posted @ 2008-12-10 14:31 starspace 阅读(56) | 评论(0) | 编辑

实例详细介绍各种字符集编码转换问题 [转]

本文背景:
本人在编程时需要匹配字符串,由此想到了如果文件是各种字符编码的话,匹配结果有可能不正确,那么,如何判断不同的字符集?如何在不同字符集之间做转换?对于UNICODE编码逐渐通用的情况下,我们软件人员如何从容应对? 本文首先对常用字符集进行总结,然后在字符集的显示及转换上以实例介绍,最后总结了编程中遇到的编码问题。
本文目的:
对字符集编码做详细介绍,关键配以实例讲解,降低问题的复杂度。
本文内容:
1.    常用字符集分类
1.1 简介
·         ASCII及其扩展字符集
作用:表语英语及西欧语言。
位数:ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。
范围:ASCII从00到7F,扩展从00到FF。
 
·         ISO-8859-1字符集
作用:扩展ASCII,表示西欧、希腊语等。
位数:8位,
范围:从00到FF,兼容ASCII字符集。
 
·         GB2312字符集
作用:国家简体中文字符集,兼容ASCII。
位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。
范围:高字节从A1到F7, 低字节从A1到FE。将高字节和低字节分别加上0XA0即可得到编码。
 
·         BIG5字符集
作用:统一繁体字编码。
位数:使用2个字节表示,表示13053个汉字。
范围:高字节从A1到F9,低字节从40到7E,A1到FE。
 
·         GBK字符集
作用:它是GB2312的扩展,加入对繁体字的支持,兼容GB2312。
位数:使用2个字节表示,可表示21886个字符。
范围:高字节从81到FE,低字节从40到FE。
 
·         GB18030字符集
作用:它解决了中文、日文、朝鲜语等的编码,兼容GBK。
位数:它采用变字节表示(1 ASCII,2,4字节)。可表示27484个文字。
范围: 1 字节从00到7F; 2字节高字节从81到FE,低字节从40到7E和80到FE;4字节第一三字节从81到FE,第二四字节从30到39。
 
·         UCS字符集
作用:国际标准 ISO 10646 定义了通用字符集 (Universal Character Set)。它是与UNICODE同类的组织,UCS-2和UNICODE兼容。
位数:它有UCS-2和UCS-4两种格式,分别是2字节和4字节。
范围:目前,UCS-4只是在UCS-2前面加了0x0000。
 
·         UNICODE字符集
作用:为世界650种语言进行统一编码,兼容ISO-8859-1。
位数:UNICODE字符集有多个编码方式,分别是UTF-8,UTF-16和UTF-32。
UTF-8 采用变长字节 (1 ASCII, 2 希腊字母, 3 汉字, 4 平面符号) 表示,网络传输, 即使错了一个字节,不影响其他字节,而双字节只要一个错了,其他也错了,具体如下:
如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。UTF-8最多可用到6个字节。
 
UTF-16 采用2字节,Unicode中不同部分的字符都同样基于现有的标准。这是为了便于转换。从 0x0000到0x007F是ASCII字符,从0x0080到0x00FF是ISO-8859-1对ASCII的扩展。希腊字母表使用从0x0370到0x03FF 的代码,斯拉夫语使用从0x0400到0x04FF的代码,美国使用从0x0530到0x058F的代码,希伯来语使用从0x0590到0x05FF的代 码。中国、日本和韩国的象形文字(总称为CJK)占用了从0x3000到0x9FFF的代码;
由于0x00在c语言及操作系统文件名等中有特殊意义,故很多情况下需要UTF-8编码保存文本,去掉这个0x00。举例如下:
UTF-16: 0x0080 = 0000 0000 1000 0000
UTF-8:   0xC280 = 1100 0010 1000 0000
UTF-32:采用4字节。
优缺点:
·        UTF-8、UTF-16和UTF-32都可以表示有效编码空间 (U+000000-U+10FFFF) 内的所有Unicode字符。
·        使用UTF-8编码时ASCII字符只占1个字节,存储效率比较高,适用于拉丁字符较多的场合以节省空间。
·        对于大多数非拉丁字符(如中文和日文)来说,UTF-16所需存储空间最小,每个字符只占2个字节。
·        Windows NT内核是Unicode(UTF-16),采用UTF-16编码在调用系统API时无需转换,处理速度也比较快。
·        采用UTF-16和UTF-32会有Big Endian和Little Endian之分,而UTF-8则没有字节顺序问题,所以UTF-8适合传输和通信。
·        UTF-32采用4字节编码,一方面处理速度比较快,但另一方面也浪费了大量空间,影响传输速度,因而很少使用。
 
1.2 按所表示的文字分类

  

语言
字符集
正式名称
英语、西欧语
ASCII,ISO-8859-1
MBCS 多字节
简体中文
GB2312
MBCS 多字节
繁体中文
BIG5
MBCS 多字节
简繁中文
GBK
MBCS 多字节
中文、日文及朝鲜语
GB18030
MBCS 多字节
各国语言
UNICODE,UCS
DBCS 宽字节

 
 
 
 
 
 
2.  如何判断字符集
2.1 字节序
首先说一下字节序对编码的影响,字节序分为Big Endian字节序和Little Endian字节序。不同的处理器可能不一样。所以,传输时需要告诉处理器当时的编码字节序。对于前者而言,高位字节存在低地址,低字节存于高地址;后者相反。例如,0X03AB,
Big Endian字节序是
0000: 0 3
0001: AB
Little Endian字节序是
0000: AB
0001: 0 3
 
2.2 编码识别
·        UNICODE
根据前几个字节可以判断UNICODE字符集的各种编码,叫做Byte Order Mask方法BOM:
UTF-8: EFBBBF (符合UTF-8格式,请看上面。但没有含义在UCS即UNICODE中)
UTF-16 Big Endian:FEFF (没有含义在UCS-2中)
UTF-16 Little Endian:FFFE (没有含义在UCS-2中)
UTF-32 Big Endian:0000FEFF (没有含义在UCS-4中)
UTF-32 Little Endian:FFFE0000 (没有含义在UCS-4中)
·        GB2312
      高字节和低字节的第1位都是1。
·         BIG5,GBK&GB18030
高字节的第1位为1。操作系统有默认的编码,常为GBK,可以下载别的并升级。通过判断高字节的第1位从而知道是ASCII或者汉字编码。
 
3.      编程:各字符集编码的读取
注意,下面的例子都会用到这个文件,读取这个文件。在Encodeing 选项中可以选择ASCII编码、UTF-8、UNICODE Big Endian、UNICODE Little Endian。其中,ASCII编码包括:ASCII、ISO-8859-1、GB2312、BIG5、GBK等在ASCII基础上扩展的编码。当选用ASCII编码保存时,系统会调用默认的一种ASCII编码方式,一般的中文系统使用GB2312或GBK。可以通过更改控制面板中的语言选项更改。
 
 
3.1 读取 ASCII 编码
选择ASCII编码保存文件,文件内容是:您好, Ye Ming!
C++程序读取并显示如下:
FILE *myfile=fopen("CharsetExample.txt","rb");
            char a[100];
            fgets(a,100,myfile);
            printf("字节数=%d/n",strlen(a));
            printf("16进制值=");
            for(int i=0;i
                        printf("%hhx/t",a[i]);
            printf("/n字符串输出=%s/n",a);
 
结果输出:
字节数=13
16进制值=c4 fa ba c3 2c 59 65 20 4d 69 6e 67 21
字符串输出=您好,Ye Ming!
您=c4fa, 好=bac3,其它只占一个字节。printf函数发现字节的第1位是1时,会继续联合下一个字节按照默认的ASCII编码如GB2312显示汉字。
 
为了测试一下系统能否显示繁体中文字,将文本更改为: 案與產品
保存为ASCII编码,然后运行程序。结果可以显示出来,说明系统用GBK或BIG5解码了。在控制面板把BIG5去掉,还能正常显示,说明系统默认的是GBK解码。
注解 1 文本是按字节读,二进制是按逻辑单位读;这个例子用二进制读和用文本读的结果是一样的,因为逻辑单位char是1个字节的。
 
3.2 读取 UTF-8 编码
选择UTF-8编码保存文件,文件内容是:您好, Ye Ming!
C++程序读取并显示如下:
            FILE *myfile=fopen("CharsetExample.txt","rb");
            char a[100];
            fgets(a,100,myfile);
            printf("字节数=%d/n",strlen(a));
            printf("16进制值=");
            for(int i=0;i
                        printf("%hhx/t",a[i]);
            printf("/n字符串输出=%s/n",&a[3]);
 
结果输出:
字节数=18
16进制值= ef bb bf e6 82 a8 e5 a5 bd 2c 59 65 20 4d 69 6e 67 21
字符串输出=乱码,Beijing!
其中,ef bb bf 是UTF-8的头标识;您=e6 82 a8,好=e5 a5 bd。
其他是单字节的ASCII码。
输出字符串时要去掉前三个字节。但是,还是出现了乱码!
之所以出现乱码,是因为系统按默认的GB2312去解UTF-8的码,所以在库里找不到或找不对对应的汉字,所以出现3个乱码,因为按两两组合所以有3个乱码。
 
3.3 读取 UTF-16 Big Endian
选择UTF-8编码保存文件,文件内容是:您好, Ye Ming!
C++程序读取并显示如下:
 
FILE *myfile=fopen("CharsetExample.txt","rb");
            char a[100];
            fgets(a,100,myfile);
            printf("字节数=%d/n",strlen(a));
            printf("16进制值=");
            for(int i=0;i
                        printf("%hhx/t",a[i]);
            printf("/n字符串输出=%s/n",&a[2]);
结果输出:
字节数=6
16进制值= fe ff 60 a8 59 7d
字符串输出=三个符号
其中,fe ff 是UTF-16 Big Endian的头标识;60是可以输出的,a859输出乱码,7d是可以输出的。输出字符串时要去掉前两个字节。
 
理论上字节数应该是2+11*2=24。可是,输出为什么只有6呢?在UTF-16中,每个字符都用两个字节表示,而ASCII符号只用一个字节,高位用0表示,所以,当遇到0后,strlen认为串结束了。这就是UTF-16的缺点,前面提到过。
将程序的一句更改后:
for(int i=0;i<24;i++)
16进制值= fe ff 60 a8 59 7d 0 2c 0 59……
同样,字符串仍然无法显示。
 
3.4 读取 UTF-16 Little Endian
文本文件用UTF-16 Little Endian编码时,其输出结果是:
16进制值= ff fe a8 60 7d 59 2c 0 59 0 ……
 
4.      编程:各字符集编码的显示
4.1 直接显示
由于中文系统默认的编码是中文编码,一般是GBK。所以,ASCII编码的显示没有问题。但是,遇到UNICODE编码就会有问题了,如上面的例子,显示会出现乱码。
接下来本文介绍一种读取UNICODE文件并正确显示中文的方法。
4.1.1 文件编码为 UNICODE Big Endian
本件保存为UNICODE Big Endian,文本=您好, Ye Ming!
·        错误:按文本方式读
读文本程序如下:
FILE *myfile;
            wchar_t *name=L"CharsetExample.txt";
            myfile=_wfopen(name,L"rt");
            fseek(myfile,0,0);
            wchar_t buffw[100];
            fgetws(buffw,100,myfile);
            printf("字节数=%d/n",wcslen(buffw));
            printf("16进制值=");
            for(int i=0;i
            printf("%hhx/t",buffw[i]);
//设置本地化信息,.936是简体中文的Code Page。wcout需要依靠它决定将宽字符按什么编码显示
            setlocale(LC_ALL, ".936");
            printf("/n字符串输出=");
   wcout<
结果如下:
字节数=6
16进制值= fe ff 60 a8 59 7d
字符串输出=’”Y}
文本是按UNICODE编码的,每个字符是两字节,ASCII字符高位用0代替。按文本方式打开文件读时,是按字节的读写,一个字节就存进了两个字节大小的结构wchar_t中。遇到0时,它认为文件已经结束,停止操作。
·        正确:按二进制方式读
读文本程序如下:
   将myfile=_wfopen(name,L"rt")改为myfile=_wfopen(name,L"rb");
结果如下:
 字节数=12
16进制值= fffe a860 7d59 2c00 5900….
字符串输出=乱码
这一次二进制结果是对的,但是,为什么还是乱码呢?问题出在wcout函数上,x86是按照Little Endian字节序处理数据的,它将2c00处理了而不是002c。我们看一下如果文本保存为UNICODE Little Endian, 会怎么样?
 
4.1.2 文件编码为 UNICODE Little Endian
本件保存为UNICODE Little Endian,文本=您好, Ye Ming!
·         错误:按文本方式读
基本同上,故略。
·         正确:按二进制方式读
   将myfile=_wfopen(name,L"rt")改为myfile=_wfopen(name,L"rb");
结果如下:
字节数=12
16进制值= feff 60a8 597d 2c 59….
字符串输出=您好, Ye Ming!
输出正确,^_^。
4.1.3 文件编码为 UTF-8
对于UTF-8而言,UTF-8的编码其实不属于宽字符,它还是MBCS。wcout函数只能显示宽字符,不能够正确显示它的编码,所以输出为乱码或空。
 
4.2   编码转换后显示
4.2.1 文件编码为 UNICODE Big Endian
由于字节序的问题,需要转换成Little Endian 才能正确显示,因为x86系列用的是Little Endian。转换后,请用下面小节的方法显示。
 
4.2.2 文件编码为 UNICODE Little Endian
读文件程序如下:
            FILE *myfile;
            wchar_t *name=L"CharsetExample.txt";
            myfile=_wfopen(name,L"rb");
            fseek(myfile,0,0);
            wchar_t buffw[100];
            fgetws(buffw,100,myfile);
            printf("字节数=%d/n",wcslen(buffw));
            printf("16进制值=");
            for(int i=0;i
                        printf("%hhx/t",buffw[i]);
//宽字符转换成多字节,第一个参数是Code Page,windows定义了若干Code Page,用来处理不同语言编码的。CP_ACP是ASCII编码,这里主要是求出转换后的字节数。Buffw+1主要是去掉头标记 feff
UNICODE à ASCII 编码
int len = WideCharToMultiByte( CP_ACP, 0, buffw+1, wcslen(buffw+1), NULL, NULL, NULL, NULL );
            LPSTR lpsz = new CHAR[len+1];
            //下面才是真正的转换。
WideCharToMultiByte( CP_ACP, 0, buffw+1, wcslen(buffw+1), lpsz, len, NULL,NULL );
            printf("%d",len);
            lpsz[len]='/0';
      printf("/n%s/n",lpsz);
 
      结果如下:
      字节数=12
   16进制值=feff 60a8 597d 2c 59….
字符串输出=您好, Ye Ming!
      转换完后,系统函数printf会按照系统默认编码显示出来。
 
4.2.3 文件编码为 UTF-8
文件保存为UTF-8,有两种情况:
·        错误:按宽字符存取
程序如下:
FILE *myfile;
            wchar_t *name=L"CharsetExample.txt";
            myfile=_wfopen(name,L"rb");
            fseek(myfile,3,0);
            wchar_t buffw[100];
            fgetws(buffw,100,myfile);
            printf("字节数=%d/n",wcslen(buffw));
            printf("16进制值=");
            for(int i=0;i
                        printf("%hhx/t",buffw[i]);
           
…………….
结果如下:
字节数=7
      16进制值=82e6 e5a8 bda5 592c 2065 694d 676e
    
可以看出,16进制值缺了21,这就是感叹号的ASCII值。当以fgetws读取文件时,21落单了,所以不能读进wchar_t。
 
·        正确:按字节存取
程序如下:
FILE *myfile;
            wchar_t *name=L"CharsetExample.txt";
            myfile=_wfopen(name,L"rb");
            fseek(myfile,3,0);
            char buff[100];
            //取得所有UTF-8字节
            fgets(buff,100,myfile);
            printf("字节数=%d/n",strlen(buff));
            printf("16进制值=");
            for(int i=0;i
                        printf("%hhx/t",buff[i]);
 
第一步, UTF-8 à UNICODE
由于从UTF-8不能直接转换为ASCII编码,必须以UNICODE为跳板;这里用到参数CP_UTF8,因为我们是将UTF-8转换为UNICODE,注意:WideChar在本函数中指的肯定是UNICODE。
            int num=MultiByteToWideChar(CP_UTF8,NULL,buff,-1,NULL,NULL);
            wchar_t *buffw2=new wchar_t[num];
            MultiByteToWideChar(CP_UTF8,NULL,buff,-1,buffw2,num);
 
第二步, UNICODE à ASCII 编码
            这个函数跟之前用过了。
int len = WideCharToMultiByte( CP_ACP, 0, buffw2, num, NULL, NULL, NULL, NULL );
            LPSTR lpsz = new CHAR[len+1];
            WideCharToMultiByte( CP_ACP, 0, buffw2, num, lpsz, len, NULL, NULL );
            lpsz[len]='/0';
            printf("/n字符串输出=");
      printf("%s/n",lpsz);
 
结果如下:
字节数=15
      16进制值=e6 82 a8 e5 a5 bd 2c 59 65 20 4d 69 6e 67 21
      字符串输出=您好, Ye Ming!
结果正确,*_*。
 
4.3 转换编码的另外一种方法
·         mbstowcs
          char *ccname="我们";
            wchar_t * wwname=new wchar_t[2];
            //依赖于Locale而不是Code Page
            setlocale(LC_CTYPE,"chs");
            mbstowcs(wwname,ccname,2);
            wcout<
 
·         wcstombs
wchar_t *wname=L"叶明";
            char * cname=new char[4];
            setlocale(LC_TIME,"chs");
            wcout<
            wcstombs(cname,wname,4);
            printf("%s/n",cname);
 
5.     思考字符集编码对软件的影响
请参考本人另外一篇文章: UNICODE 编码对软件编程的影响
 
6.    常用参数
   ·        ASCII码参照表
 
  •  Code Page 参数
     下面是部分的Code Page:
       CP0 ASCII
       CP932 Shift-JIS
       CP936 GBK
       CP950 Big5 
       CP20936 GB2312
       CP65001 UTF-8
       CP65000 UTF-7
  • Locale 参数
   由于国家和本地习惯的不同,在处理文字、日期、数字、货币格式等问题都会有所不同,Locale就是用来解决这个问题。
C语言的Locale定义,分为以下几类:
     LC_ALL:代表所有的locale
     LC_CTYPE:用来处理文字编码
     LC_MESSAGES:信息的显示,你可能会在这样一个目录看到大量的mo文件
     LC_TIME:时间格式
     LC_NUMERIC:数字格式
     LC_MONETARY:货币格式
     LC_COLLATE:字母顺序和特殊字符的比较
  其中比较重要的是:
  字符编码LC_CTYPE和本地化的信息显示LC_MESSAGES 。
  设置Locale举例如下:
    setLocale(LC_ALL, "chs")
  值可取下面值:
    zh_CN.utf8
    chs
    Chinese-simplified
    ZHI
   .936

posted @ 2008-12-10 14:29 starspace 阅读(183) | 评论(0) | 编辑

Perl对中文的处理问题

发信人: chaoslawful (Skeleton Warrior), 信区: Perl
标 题: 关于Perl对中文的处理问题
发信站: BBS 水木清华站 (Sat Oct 25 12:17:27 2003), 转信

大家经常使用正则表达式的字符集从字符串中抽取或排除中文字符,但是这样做很费事,效果也并不是很理想。实际上Perl从5.6开始已经开始在内部使用 utf8编码来表示字符,也就是说对中文以及其他语言字符的处理应该是完全没有问题的。关键在于目前使用的编辑器以及文件格式并不都能很好地支持 utf8,委屈了Perl的强大能力。实际上我们只需要利用好Encode这个模块便能充分发挥Perl的utf8字符的优势了。

下面就以中文文本的处理为例进行说明(注意:编辑下面这段程序不能用使用utf8编码的编辑器),比如有一个字符串"测试文本",我们想要把这个中文字符串拆成单个字符,可以这样写:
use Encode;
use Encode::CN; #可写可不写
$dat="测试文本";
$str=decode("gb2312",$dat);
@chars=split //,$str;
foreach $char (@chars) {
print encode("gb2312",$char),"/n";
}
结果大家试一试就知道了,应该是令人满意的。

这里主要用到了Encode模块的decode、encode函数。要了解这两个函数的作用我们需要清楚几个概念:
1、Perl字符串是使用utf8编码的,它由Unicode字符组成而不是单个字节,每个utf8编码的Unicode字符占1~4个字节(变长)。
2、进入或离开Perl处理环境(比如输出到屏幕、读入和保存文件等等)时不是直接使用Perl字符串,而需要把Perl字符串转换成字节流,转换过程中使用何种编码方式完全取决于你(或者由Perl代劳)。一旦Perl字符串向字节流的编码完成,字符的概念就不存在了,变成了纯粹的字节组合,如何解释这些组合则是你自己的工作。

我们可以看出如果想要Perl按照我们的字符概念来对待文本,文本数据就需要一直用Perl字符串的形式存放。但是我们平时写出的每个字符一般都被作为纯 ASCII字符保存(包括在程序中明文写出的字符串),也就是字节流的形式,这里就需要encode和decode函数的帮助了。

encode函数顾名思义是用来编码Perl字符串的。它将Perl字符串中的字符用指定的编码格式编码,最终转化为字节流的形式,因此和Perl处理环境之外的事物打交道经常需要它。其格式很简单:
$octets = encode(ENCODING, $string [, CHECK])
这里$string是Perl字符串,ENCODING是给定的编码方式,$octets则是编码之后的字节流,CHECK表示转换时如何处理畸变字符(也就是Perl认不出来的字符)。一般不需要使用CHECK,让Perl按默认规则处理即可。
编码方式视语言环境的不同有很大变化,默认可以识别utf8、ascii、ascii-ctrl、iso-8859-1等,中文环境(CN)增加了 euc-cn(gb2312与之等价)、cp936(gbk与之等价)、hz等,还有日文环境(JP)、韩文(KR)等等,在此不一一尽数。

decode函数则是用来解码字节流的。它按照你给出的编码格式解释给定的字节流,将其转化为使用utf8编码的Perl字符串,一般来说从终端或者文件取得的文本数据都应该用decode转换为Perl字符串的形式。它的格式为:
$string = decode(ENCODING, $octets [, CHECK])
$string、ENCODING、$octets和CHECK的含义同上。

现在就很容易理解上面写的那段程序了。因为字符串是用明文写出的,存放的时候已经是字节流形式,丧失了本来的意义,所以首先就要用decode函数将其转换为Perl字符串,由于汉字一般都用gb2312格式编码,这里decode也要使用gb2312编码格式。转换完成后Perl对待字符的行为就和我们一样了,平时对字符串进行操作的函数基本上都能正确对字符进行处理,除了那些本来就把字符串当成一堆字节的函数(如vec、pack、unpack等)。于是split就能把字符串切成单个字符了。最后由于在输出的时候不能直接使用utf8编码的字符串,还需要将切割后的字符用encode函数编码为 gb2312格式的字节流,再用print输出。

Encode模块的初步应用大概就是这样,详细情况还是要参阅模块的文档。实际上如果我们使用UltraEditor等等支持编辑utf8编码文件的编辑器写程序,基本上用不着Encode模块,在程序开头加上一句use utf8就行。这时Perl默认包括程序本身在内的所有的字符都是Unicode字符,可以随便使用Unicode范围内的字符,甚至可以用非英文字符作为标识符,只是输出的时候可能还需要用Encode模块。比如用UE的utf8编码模式编辑这个程序:
use utf8;
$单价=10;
$数量=100;
$总额=$单价*$数量;
print "$总额/n";
可以在Perl 5.6以后的版本中正常运行并给出结果,是不是很爽?:) 这种模式最大的优点就是在字符串中可以混合多种语言的文字,就算中日韩英加上阿拉伯字符都在一个字符串中出现也没问题;不像使用Encode模块那样必须固定一种编码方式,中日韩英字符同时出现还好办,因为gbk包含了所有这些字符,可是再加上一些非亚洲语言字符就不一定能处理了。所以以后用 Unicode编码应该是大势所趋。

希望写的这些能对大家有所帮助。

发信人: chaoslawful (Skeleton Warrior), 信区: Perl
标 题: 对Perl处理中文字符的一点补充
发信站: BBS 水木清华站 (Thu Oct 30 09:45:23 2003), 转信

从Perl5.8开始的版本除了使用Encode模块将中文字符转换成utf8字符以外,还可以使用use encoding指示符来更方便地处理。如下所示

use encoding 'gbk';
$str="你好";
print length($str)."/n";
@chars=split //,$str;
print "@chars/n";

还可以指定输入输出使用不同的编码方式,达到转换编码的目的
use encoding 'gbk',STDOUT=>'utf8'; # 输入用gbk编码,输出用utf8编码
或者
use encoding 'gbk',STDIN=>'utf8'; # 输入用utf8编码,输出用gbk编码

如果想用汉字作变量名,达到和use utf8指示符相同的效果,可以这样写

use encoding 'gbk',Filter=>1;
$变量=10;
print "$变量/n";

不过这样会降低兼容性,所以不推荐使用。更详细的描述可参考perldoc encoding

--
出塞
王昌龄
秦时明月汉时关,万里长征人未还。
但使龙城飞将在,不教胡马度阴山。

※ 来源:·BBS 水木清华站 smth.org·[FROM: 219.224.192.56]

posted @ 2008-12-10 14:28 starspace 阅读(68) | 评论(0) | 编辑

perl对中文的处理(encode,decode)

最近在处理中文时遇到乱码的问题,google了一下,发现下面这篇文章。茅塞顿开!

Perl从5.6开始已经开始在内部使用utf8编码来表示字符,也就是说对中文以及其他语言字符的处理应该是完全没有问题的。我们只需要利用好Encode这个模块便能充分发挥Perl的utf8字符的优势了。

下面就以中文文本的处理为例进行说明,比如有一个字符串"测试文本",我们想要把这个中文字符串拆成单个字符,可以这样写:

use Encode;
$dat="测试文本";
$str=decode("gb2312",$dat);
@chars=split //,$str;
foreach $char (@chars) {
print encode("gb2312",$char),"/n";
}

结果大家试一试就知道了,应该是令人满意的。

这里主要用到了Encode模块的decode、encode函数。要了解这两个函数的作用我们需要清楚几个概念:

1、Perl字符串是使用utf8编码的,它由Unicode字符组成而不是单个字节,每个utf8编码的Unicode字符占1~4个字节(变长)。

2、进入或离开Perl处理环境(比如输出到屏幕、读入和保存文件等等)时不是直接使用Perl字符串,而需要把Perl字符串转换成字节流,转换过程中使用何种编码方式完全取决于你(或者由Perl代劳)。一旦Perl字符串向字节流的编码完成,字符的概念就不存在了,变成了纯粹的字节组合,如何解释这些组合则是你自己的工作。

我们可以看出如果想要Perl按照我们的字符概念来对待文本,文本数据就需要一直用Perl字符串的形式存放。但是我们平时写出的每个字符一般都被作为纯ASCII字符保存(包括在程序中明文写出的字符串),也就是字节流的形式,这里就需要encode和decode函数的帮助了。

encode函数顾名思义是用来编码Perl字符串的。它将Perl字符串中的字符用指定的编码格式编码,最终转化为字节流的形式,因此和Perl处理环境之外的事物打交道经常需要它。其格式很简单:
$octets = encode(ENCODING, $string [, CHECK])

$string:  Perl字符串
encoding: 是给定的编码方式
$octets:  是编码之后的字节流
check:   表示转换时如何处理畸变字符(也就是Perl认不出来的字符)。一般不需使用

编码方式视语言环境的不同有很大变化,默认可以识别utf8、ascii、ascii-ctrl、
iso-8859-1等。

decode函数则是用来解码字节流的。它按照你给出的编码格式解释给定的字节流,将其转化为使用utf8编码的Perl字符串,一般来说从终端或者文件取得的文本数据都应该用decode转换为Perl字符串的形式。它的格式为:

$string = decode(ENCODING, $octets [, CHECK])
$string、ENCODING、$octets和CHECK的含义同上。

现在就很容易理解上面写的那段程序了。因为字符串是用明文写出的,存放的时候已经是字节流形式,丧失了本来的意义,所以首先就要用decode函数将其转换为Perl字符串,由于汉字一般都用gb2312格式编码,这里decode也要使用gb2312编码格式。转换完成后Perl对待字符的行为就和我们一样了,平时对字符串进行操作的函数基本上都能正确对字符进行处理,除了那些本来就把字符串当成一堆字节的函数(如vec、pack、unpack等)。于是split就能把字符串切成单个字符了。最后由于在输出的时候不能直接使用utf8编码的字符串,还需要将切割后的字符用encode函数编码为gb2312格式的字节流,再用print输出。

posted @ 2008-12-10 14:27 starspace 阅读(108) | 评论(0) | 编辑

perl与中文信息处理

一、文件分割 

#!/usr/bin/perl
#此程序将一个大文本文件分成两个。

#以一个.txt结尾被分割文件作为参数。
#如果没有提供待分割文本,那么程序中止运行。
die if $#ARGV == -1;

#输入文件以.txt结尾,输出文件替换.txt扩展名为.out1和.out2
$outfile1 = $ARGV[0];
$outfile2 = $ARGV[0];
$outfile1 =~ s//..+$//.out1/i;
$outfile2 =~ s//..+$//.out2/i;

#打开输入输出文件以供读写
open(OUT1, "> $outfile1") or die "无法创建第一个新文件用以保存分割结果/n";
open(OUT2, "> $outfile2") or die "无法创建第二个新文件用以保存分割结果/n";

# $Line获取文件的总行数
open(TXT, $ARGV[0]) or die "无法打开被分割文件。/n";
@Lines=;
$Lines = @Lines;
close (TXT);

# 如果行号小于总行数的一半,写入结果文件out1,大于一半,写入out2
$LineNo = 0;
open(TXT, $ARGV[0]) or die "无法打开被分割文件。/n";
while ($line = ) {
    $LineNo +=1;
    if ($LineNo < ($Lines/2+1) ) {
        print OUT1 $line;
    }
    else{
        print OUT2 $line;
        }
  }
  print "已经分割完毕!";
 
#关闭输入、输出文件
close(TXT);
close(OUT1);
close(OUT2);


sub usage
        {
        print "/n/tusage = perl edit3.pl INPUTFILE/n";
        } 

 

##############################################

二、字频统计 

#!/usr/bin/perl
#如果在文本中使用大字符集,那么将文本保存成utf-8格式。
#并将下面的注释标志去掉,同时给后面的简体中文编码语句加注释标记
#use utf8;

#使用简体中文编码,否则拆分单个汉字会出错。
use encoding "euc-cn";

#如果不提供待统计文本,退出程序
die if $#ARGV == -1;

#打开待统计文件
open(TXT, $ARGV[0]) or die "无法打开待统计文件。/n";

#哈希表,用于存放“汉字=>频率值”对。
%frequency = ();

#读取每一行,用chomp()删除句末换行符,否则会出错。
#用split函数将字符串分割为每一个汉字。每找到一个汉字,该字频率加1。
while($string = ){
    chomp($string);
    foreach $character (split //, $string) {
    $frequency{$character}++;
}
}

#打印统计结果。
print "字频统计结果是: /n";

while ( ($k,$v) = each %frequency ) {
print "$k => $v/n";
}

#排序后打印结果。
print "字频统计结果是(由小到大排序后): /n";

@character = sort {$frequency{$a} <=> $frequency{$b} }( keys %frequency);
foreach $character (@character){
    print "$character => $frequency{$character}/n";
}

####################################################

三、回文

#从一个词表中查找回文,或者从古诗中查找回文诗。
#!/usr/bin/perl
use encoding "euc-cn";
open(TXT, $ARGV[0]) or die "无法打开词表。/n";

#用reverse()函数将一个词颠倒,用eq操作符作比较,去掉双音重迭词。
while($word = ){
    chomp ($word);
    if ($word eq reverse ($word) && length($word)> 2){
        print "$word/n";
    }
}
 

 我用一个词表测试,找到如下的回文词。
八十八
白蛋白
背对背
背靠背
补一补
不得不
不可不
不能不
大哥大
等一等
东北东
东南东
动不动
对不对
多得多
多伦多
俄亥俄
二十二
敢不敢
各顾各
狗咬狗
国与国
好不好
会不会
记日记
肩并肩
九十九
铐手铐
克拉克
空对空
里外里
六零六
六六六
六十六
骂天骂
美不美
面对面
难上难
能不能
怕只怕
七十七
人对人
三十三
石灰石
时不时
实打实
史前史
试一试
是不是
手把手
手拉手
手牵手
手挽手
说的说
四十四
梯恩梯
文言文
五十五
心连心
心贴心
锌镀锌
惺惺惜惺惺
亚细亚
岩浆岩
要不要
一对一
一九九一
硬碰硬
有没有
愈来愈
越来越
纸盒纸
嘴对嘴

posted @ 2008-12-10 14:23 starspace 阅读(153) | 评论(0) | 编辑

CMD 命令速查手册

ASSOC 显示或修改文件扩展名关联。
AT 计划在计算机上运行的命令和程序。
ATTRIB 显示或更改文件属性。
BREAK 设置或清除扩展式 CTRL+C 检查。
CACLS 显示或修改文件的访问控制列表(ACLs)。
CALL 从另一个批处理程序调用这一个。
CD 显示当前目录的名称或将其更改。
CHCP 显示或设置活动代码页数。
CHDIR 显示当前目录的名称或将其更改。
CHKDSK 检查磁盘并显示状态报告。
CHKNTFS 显示或修改启动时间磁盘检查。
CLS 清除屏幕。
CMD 打开另一个 Windows 命令解释程序窗口。
COLOR 设置默认控制台前景和背景颜色。
COMP 比较两个或两套文件的内容。
COMPACT 显示或更改 NTFS 分区上文件的压缩。
CONVERT 将 FAT 卷转换成 NTFS。您不能转换
当前驱动器。
COPY 将至少一个文件复制到另一个位置。
DATE 显示或设置日期。
DEL 删除至少一个文件。
DIR 显示一个目录中的文件和子目录。
DISKCOMP 比较两个软盘的内容。
DISKCOPY 将一个软盘的内容复制到另一个软盘。
DOSKEY 编辑命令行、调用 Windows 命令并创建宏。
ECHO 显示消息,或将命令回显打开或关上。
ENDLOCAL 结束批文件中环境更改的本地化。
ERASE 删除至少一个文件。
EXIT 退出 CMD.EXE 程序(命令解释程序)。
FC 比较两个或两套文件,并显示
不同处。
FIND 在文件中搜索文字字符串。
FINDSTR 在文件中搜索字符串。
FOR 为一套文件中的每个文件运行一个指定的命令。
FORMAT 格式化磁盘,以便跟 Windows 使用。
FTYPE 显示或修改用于文件扩展名关联的文件类型。
GOTO 将 Windows 命令解释程序指向批处理程序
中某个标明的行。
GRAFTABL 启用 Windows 来以图像模式显示
扩展字符集。
HELP 提供 Windows 命令的帮助信息。
IF 执行批处理程序中的条件性处理。
LABEL 创建、更改或删除磁盘的卷标。
MD 创建目录。
MKDIR 创建目录。
MODE 配置系统设备。
MORE 一次显示一个结果屏幕。
MOVE 将文件从一个目录移到另一个目录。
PATH 显示或设置可执行文件的搜索路径。
PAUSE 暂停批文件的处理并显示消息。
POPD 还原 PUSHD 保存的当前目录的上一个值。
PRINT 打印文本文件。
PROMPT 更改 Windows 命令提示符。
PUSHD 保存当前目录,然后对其进行更改。
RD 删除目录。
RECOVER 从有问题的磁盘恢复可读信息。
REM 记录批文件或 CONFIG.SYS 中的注释。
REN 重命名文件。
RENAME 重命名文件。
REPLACE 替换文件。
RMDIR 删除目录。
SET 显示、设置或删除 Windows 环境变量。
SETLOCAL 开始批文件中环境更改的本地化。
SHIFT 更换批文件中可替换参数的位置。
SORT 对输入进行分类。
START 启动另一个窗口来运行指定的程序或命令。
SUBST 将路径跟一个驱动器号关联。
TIME 显示或设置系统时间。
TITLE 设置 CMD.EXE 会话的窗口标题。
TREE 以图形模式显示驱动器或路径的目录结构。
TYPE 显示文本文件的内容。
VER 显示 Windows 版本。
VERIFY 告诉 Windows 是否验证文件是否已正确
写入磁盘。
VOL 显示磁盘卷标和序列号。
XCOPY 复制文件和目录树。

ASSOC

显示或修改文件扩展名关联
ASSOC [.ext[=[fileType]]]
.ext      指定跟文件类型关联的文件扩展名
fileType  指定跟文件扩展名关联的文件类型
键入 ASSOC 而不带参数,显示当前文件关联。如果只用文件扩展
名调用 ASSOC,则显示那个文件扩展名的当前文件关联。如果不为
文件类型指定任何参数,命令会删除文件扩展名的关联。
返回页首

AT

AT 命令安排在特定日期和时间运行命令和程序。
要使用 AT 命令,计划服务必须已在运行中。
AT [//computername] [ [id] [/DELETE] | /DELETE [/YES]]
AT [//computername] time [/INTERACTIVE]
[ /EVERY:date[,...] | /NEXT:date[,...]] "command"
//computername       指定远程计算机。 如果省略这个参数,
会计划在本地计算机上运行命令。
id                   指定给已计划命令的识别号。
/delete              删除某个已计划的命令。如果省略 id,
计算机上所有已计划的命令都会被删除。
/yes                 不需要进一步确认时,跟删除所有作业
的命令一起使用。
time                 指定运行命令的时间。
/interactive         允许作业在运行时,与当时登录的用户
桌面进行交互。
/every:date[,...]    每个月或每个星期在指定的日期运行命
令。如果省略日期,则默认为在每月的
本日运行。
/next:date[,...]     指定在下一个指定日期(如,下周四)运
行命令。如果省略日期,则默认为在每
月的本日运行。
"command"            准备运行的 Windows NT 命令或批处理
程序。
返回页首

ATTRIB

显示或更改文件属性。
ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [[drive:] [path] filename] [/S [/D]]
+   设置属性。
-    清除属性。
R   只读文件属性。
A   存档文件属性。
S   系统文件属性。
H   隐藏文件属性。
[drive:][path][filename]
指定要处理的文件属性。
/S  处理当前文件夹及其子文件夹中的匹配文件。
/D  也处理文件夹。
返回页首

BREAK

设置或清除 DOS 系统的扩展 CTRL+C 检测
这个命令是为了与 DOS 系统的兼容而保留的,在 Windows XP
里不起作用。
如果命令扩展名被启用,并且操作平台是 Windows XP,
BREAK 命令会在被调试程序调试时输入一个硬代码中断点。
返回页首

CACLS

显示或者修改文件的访问控制表(ACL)
CACLS filename [/T] [/E] [/C] [/G user:perm] [/R user [...]]
[/P user:perm [...]] [/D user [...]]
filename      显示 ACL。
/T            更改当前目录及其所有子目录中
指定文件的 ACL。
/E            编辑 ACL 而不替换。
/C            在出现拒绝访问错误时继续。
/G user:perm  赋予指定用户访问权限。
Perm 可以是: R  读取
W  写入
C  更改(写入)
F  完全控制
/R user  撤销指定用户的访问权限(仅在与 /E 一起使用时合法)。
/P user:perm  替换指定用户的访问权限。
Perm 可以是: N  无
R  读取
W  写入
C  更改(写入)
F  完全控制
/D user       拒绝指定用户的访问。
在命令中可以使用通配符指定多个文件。
也可以在命令中指定多个用户。
缩写:
CI - 容器继承。
ACE 会由目录继承。
OI - 对象继承。
ACE 会由文件继承。
IO - 只继承。
ACE 不适用于当前文件/目录。
返回页首

CALL

从批处理程序调用另一个批处理程序。
CALL [drive:][path]filename [batch-parameters]
batch-parameters   指定批处理程序所需的命令行信息。
如果命令扩展名被启用,CALL 会如下改变:
CALL 命令现在将卷标当作 CALL 的目标接受。语法是:
CALL:label arguments
一个新的批文件上下文由指定的参数所创建,控制在卷标被指定
后传递到语句。您必须通过达到批脚本文件末两次来 "exit" 两次。
第一次读到文件末时,控制会回到 CALL 语句的紧后面。第二次
会退出批脚本。键入 GOTO /?,参看 GOTO  : EOF  扩展名的描述,
此描述允许您从一个批脚本返回。
另外,批脚本文本参数参照(%0、%1、等等)已如下改变:
批脚本里的 %* 指出所有的参数(如 %1 %2 %3 %4 %5 ...)
批参数(%n)的替代已被增强。您可以使用以下语法:
%~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 可以被其他有效数值替换。
%~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %*
使用
返回页首

CD

显示当前目录名或改变当前目录。
CHDIR [/D] [drive:][path]
CHDIR [..]
CD [/D] [drive:][path]
CD [..]
..   指定要改成父目录。
键入 CD 驱动器: 显示指定驱动器中的当前目录。
不带参数只键入 CD,则显示当前驱动器和目录。
使用 /D 命令行开关,除了改变驱动器的当前目录之外,
还可改变当前驱动器。
如果扩展命令名被启用,CHDIR 会如下改变:
当前的目录字符串会被转换成使用磁盘名上的大小写。所以,
如果磁盘上的大小写如此,CD  C : /TEMP 会将当前目录设为
C:/Temp。
CHDIR 命令不把空格当作分隔符,因此有可能将目录名改为一个
带有空格但不带有引号的子目录名。例如:
cd /winnt/profiles/username/programs/start menu
与下列相同:
cd "/winnt/profiles/username/programs/start menu"
在扩展功能停用的情况下,您必须键入以上命令。
返回页首

CHCP

显示或设置活动代码页编号。
CHCP [nnn]
nnn   指定代码页编号。
不加参数键入 CHCP 显示活动代码页编号。
返回页首

CHDIR

显示当前目录名或改变当前目录。
CHDIR [/D] [drive:][path]
CHDIR [..]
CD [/D] [drive:][path]
CD [..]
..   指定要改成父目录。
键入 CD 驱动器: 显示指定驱动器中的当前目录。
不带参数只键入 CD,则显示当前驱动器和目录。
使用 /D 命令行开关,除了改变驱动器的当前目录之外,
还可改变当前驱动器。
如果扩展命令名被启用,CHDIR 会如下改变:
当前的目录字符串会被转换成使用磁盘名上的大小写。所以,
如果磁盘上的大小写如此,CD  C : /TEMP 会将当前目录设为
C:/Temp。
CHDIR 命令不把空格当作分隔符,因此有可能将目录名改为一个
带有空格但不带有引号的子目录名。例如:
cd /winnt/profiles/username/programs/start menu
与下列相同:
cd "/winnt/profiles/username/programs/start menu"
在扩展功能停用的情况下,您必须键入以上命令。
返回页首

CHKDSK

检查磁盘并显示状态报告。
CHKDSK [volume[[path]filename]]] [/F] [/V] [/R] [/X] [/I] [/C] [/L[:size]]
volume          指定驱动器(后面跟一个冒号)、装入点
或卷名。
filename        仅用于 FAT/FAT32: 指定要检查是否有碎片的文件。
/F              修复磁盘上的错误。
/V              在 FAT/FAT32 上: 显示磁盘上每个文件的完整路径和名称。
在 NTFS 上: 如果有清除消息,将其显示。
/R              查找不正确的扇区并恢复可读信息(隐含 /F)。
/L:size       仅用于 NTFS:  将日志文件大小改成指定的 KB 数。
如果没有指定大小,则显示当前的大小。
/X               如果必要,强制卷先卸下。
卷的所有打开的句柄就会无效(隐含 /F)。
/I                仅用于 NTFS: 对索引项进行强度较小的检查。
/C               仅用于 NTFS: 跳过文件夹结构的循环检查。
/I 和 /C 命令行开关跳过卷的某些检查,减少运行 Chkdsk 所需的时间。
返回页首

CHKNTFS

在启动时显示或修改磁盘检查。
CHKNTFS volume [...]
CHKNTFS /D
CHKNTFS /T[:time]/r/nCHKNTFS /X volume [...]
CHKNTFS /C volume [...]
volume:        指定驱动器(后面跟一个冒号)、装入点
或卷名。
/D             将计算机恢复成默认状态, 启动时检查所有驱动器,
并对有问题的驱动器执行 chkdsk 命令。
/T:time        将 AUTOCHK 初始递减计数时间改成指定的
时间量,单位为秒数。如果没有指定
时间,则显示当前设置。
/X             排除启动时不作检查的驱动器。上次执行此命令
排除的驱动器此时无效。
/C             安排启动时检查驱动器,如果驱动器有问题,运行 chkdsk。
如果没有指定命令行开关,CHKNTFS 会显示每一驱动器有问题的位的状态。
返回页首

CLS

清除屏幕。
CLS
返回页首

CMD

启动 Windows XP 命令解释程序一个新的实例
CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
[[/S] [/C | /K] string]
/C      执行字符串指定的命令然后终断
/K      执行字符串指定的命令但保留
/S      在 /C 或 /K 后修改字符串处理(见下)
/Q      关闭回应
/D      从注册表中停用执行 AutoRun 命令(见下)
/A      使向内部管道或文件命令的输出成为 ANSI
/U      使向内部管道或文件命令的输出成为 Unicode
/T:fg   设置前景/背景颜色(详细信息,请见 COLOR /?)
/E:ON   启用命令扩展(见下)
/E:OFF  停用命令扩展(见下)
/F:ON   启用文件和目录名称完成字符 (见下)
/F:OFF  停用文件和目录名称完成字符(见下)
/V:ON   将 ! 作为定界符启动延缓环境变量扩展。如: /V:ON 会
允许 !var! 在执行时允许 !var! 扩展变量 var。var 语法
在输入时扩展变量,这与在一个 FOR 循环内不同。
/V:OFF  停用延缓的环境扩展。
请注意,如果字符串有引号,可以接受用命令分隔符 '&&' 隔开
的多个命令。并且,由于兼容原因,/X 与 /E:ON 相同,/Y 与
/E:OFF 相同,并且 /R 与 /C 相同。忽略任何其他命令行开关。
如果指定了 /C 或 /K,命令行开关后的命令行其余部分将作为命令行处
理;在这种情况下,会使用下列逻辑处理引号字符("):
1.   如果符合下列所有条件,那么在命令行上的引号字符将被
保留:
- 不带 /S 命令行开关
- 整整两个引号字符
- 在两个引号字符之间没有特殊字符,特殊字符为下列中的
一个: <>()@^|
- 在两个引号字符之间有至少一个空白字符
- 在两个引号字符之间有至少一个可执行文件的名称。
2.  否则,老办法是,看第一个字符是否是一个引号字符,如果
是,舍去开头的字符并删除命令行上 的最后一个引号字符,
保留最后一个引号字符之后的文字。
如果 /D 未在命令行上被指定,当 CMD.EXE 开始时,它会寻找
以下 REG_SZ/REG_EXPAND_SZ 注册表变量。如果其中一个或
两个都存在,这两个变量会先被执行。
HKEY_LOCAL_MACHINE/Software/Microsoft/Command Processor/AutoRun
和/或
HKEY_CURRENT_USER/Software/Microsoft/Command Processor/AutoRun
命令扩展是按默认值启用的。您也可以使用 /E:OFF,为某一
特定调用而停用扩展。您可以在机器上和/或用户登录会话上
启用或停用 CMD.EXE 所有调用的扩展,这要通过设置使用
REGEDT32.EXE 的注册表中的一个或两个 REG_DWORD 值:
HKEY_LOCAL_MACHINE/Software/Microsoft/Command Processor/EnableExtensions
和/或
HKEY_CURRENT_USER/Software/Microsoft/Command Processor/EnableExtensions
到 0x1 或 0x0。用户特定设置比机器设置有优先权。命令行
开关比注册表设置有优先权。
命令行扩展包括对下列命令所做的更改和/或添加:
DEL 或 ERASE
COLOR
CD 或 CHDIR
MD 或 MKDIR
PROMPT
PUSHD
POPD
SET
SETLOCAL
ENDLOCAL
IF
FOR
CALL
SHIFT
GOTO
START (同时包括对外部命令调用所做的更改)
ASSOC
FTYPE
有关详细信息,请键入 HELP 命令名。
延迟变量环境扩展不按默认值启用。您可以用/V:ON 或 /V:OFF
命令行开关,为 CMD.EXE 的某个调用而启用或停用延迟环境变量扩充。
您可以在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有
调用的完成,这要通过设置使用 REGEDT32.EXE 的注册表中的
一个或两个 REG_DWORD 值:
HKEY_LOCAL_MACHINE/Software/Microsoft/Command Processor/DelayedExpansion
和/或
HKEY_CURRENT_USER/Software/Microsoft/Command Processor/DelayedExpansion
到 0x1 或 0x0。用户特定设置比机器设置有优先权。命令行开关
比注册表设置有优先权。
如果延迟环境变量扩充被启用,惊叹号字符可在执行时间,被用来
代替一个环境变量的数值。
文件和目录名完成不按默认值启用。您可以用 /F:ON 或 /F:OFF
命令行开关,为 CMD.EXE 的某个调用而启用或停用文件名完成。 您可以
在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有调用的
完成,这要通过设置使用 REGEDT32.EXE 的注册表中的一个或两个
REG_DWORD 值:
HKEY_LOCAL_MACHINE/Software/Microsoft/Command Processor/CompletionChar
HKEY_LOCAL_MACHINE/Software/Microsoft/Command Processor/PathCompletionChar
和/或
HKEY_CURRENT_USER/Software/Microsoft/Command Processor/CompletionChar
HKEY_CURRENT_USER/Software/Microsoft/Command Processor/PathCompletionChar
由一个控制字符的十六进制值作为一个特定参数(例如,0x4 是
Ctrl-D,0x6 是 Ctrl-F)。 用户特定设置优先于机器设置。命令行开关
优先于注册表设置。
如果完成是用 /F:ON 命令行开关启用的,两个要使用的控制符是: 目录名
字完成用 Ctrl-D, 文件名完成用 Ctrl-F。 要停用注册表中的某个
字符,请用空格(0x20)的数值,因为此字符不是控制字符。
如果键入两个控制字符中的一个,完成会被调用。完成功能将
路径字符串带到光标的左边,如果没有通配符,将通配符附加
到左边,并建立相符的路径列表。然后,显示第一个相符的路
径。如果没有相符的路径,则发出嘟嘟声,不影响显示。之后,
重复按同一个控制字符会循环显示相符路径的列表。将 Shift 键
跟控制字符同时按下,会倒着显示列表。如果对该行进行了任
何编辑,并再次按下控制字符,保存的相符路径的列表会被丢弃,
新的会被生成。如果在文件和目录名完成之间切换,会发生
同样现象。两个控制字符之间的唯一区别是文件完成字符符合
文件和目录名,而目录完成字符只符合目录名。如果文件完成
被用于内置式目录命令(CD、MD 或 RD),就会使用目录完成。
将引号将相符路径括起来,完成代码可以正确处理含有空格
或其他特殊字符的文件名。同时,如果备份,然后从行内调用
文件完成,完成被调用是位于光标右方的文字会被丢弃。
需要引号的特殊字符是:

&()[]{}^=;!'+,`~
返回页首

COLOR

设置默认的控制台前景和背景颜色。
COLOR [attr]
attr        指定控制台输出的颜色属性
颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为
前景。每个数字可以为以下任何值之一:
0 = 黑色       8 = 灰色
1 = 蓝色       9 = 淡蓝色
2 = 绿色       A = 淡绿色
3 = 湖蓝色     B = 淡浅绿色
4 = 红色       C = 淡红色
5 = 紫色       D = 淡紫色
6 = 黄色       E = 淡黄色
7 = 白色       F = 亮白色
如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时
的颜色。这个值来自当前控制台窗口、/T 开关或
DefaultColor 注册表值。
如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令
会将 ERRORLEVEL 设置为 1。
例如: "COLOR fc" 在亮白色上产生亮红色
返回页首

COMP

比较两个文件或两个文件集的内容。
COMP [data1] [data2] [/D] [/A] [/L] [/N=number] [/C] [/OFF[LINE]]
data1      指定要比较的第一个文件的位置和名称。
data2      指定要比较的第二个文件的位置和名称。
/D         用十进制格式显示不同处。
/A         用 ASCII 字符显示不同处。
/L         显示不同的行数。
/N=number  只比较每个文件中第一个指定的行数。
/C         比较文件时不分 ASCII 字母的大小写。
/OFF[LINE] 不要跳过带有脱机属性集的文件。
要比较文件集,在 data1 和 data2 参数中使用通配符。
返回页首

COMPACT

显示或改变 NTFS 分区上文件的压缩.
COMPACT [/C | /U] [/S[:dir]] [/A] [/I] [/F] [/Q] [filename [...]]
/C        压缩指定的文件。会给目录作标记,这样以后添加的文件
会得到压缩。
/U        解压缩指定的文件。会给目录作标记,这样以后添加的文
件不会得到压缩。
/S        在指定的目录和所有子目录中的文件上执行指定操作。
默认 "dir"是当前目录。
/A        显示具有隐藏或系统属性的文件。在默认
情况下,这些文件都是被忽略的。
/I        即使在错误发生后,依然继续执行指定的操作。在默认情况
下,COMPACT 在遇到错误时会停止。
/F        在所有
返回页首

CONVERT

将 FAT 卷转换成 NTFS。
CONVERT volume /FS:NTFS [/V] [/CvtArea:filename] [/NoSecurity] [/X]
volume      指定驱动器号(后面跟一个冒号)、
装载点或卷名。
/FS:NTFS    指定要被转换成 NTFS 的卷。
/V          指定 Convert 应该用详述模式运行。
/CvtArea:filename
将根目录中的一个接续文件指定为
NTFS 系统文件的占位符。
/NoSecurity 指定每个人都可以访问转换的文件
和目录的安全设置。
/X          如果必要,先强行卸载卷。
该卷的所有打开的句柄则无效。
返回页首

COPY

将一份或多份文件复制到另一个位置。
COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/A | /B ] source [/A | /B]
[+ source [/A | /B] [+ ...]] [destination [/A | /B]]
source       指定要复制的文件。
/A           表示一个 ASCII 文本文件。
/B           表示一个二进位文件。
/D           允许解密要创建的目标文件
destination  为新文件指定目录和/或文件名。
/V           验证新文件写入是否正确。
/N           复制带有非 8dot3 名称的文件时,
尽可能使用短文件名。
/Y           不使用确认是否要改写现有目标文件
的提示。
/-Y          使用确认是否要改写现有目标文件
的提示。
/Z           用可重新启动模式复制已联网的文件。
命令行开关 /Y 可以在 COPYCMD 环境变量中预先设定。
这可能会被命令行上的 /-Y 替代。除非 COPY
命令是在一个批文件脚本中执行的,默认值应为
在改写时进行提示。
要附加文件,请为目标指定一个文件,为源指定
数个文件(用通配符或 file1+file2+file3 格式)。
返回页首

DATE

显示或设置日期。
DATE  [/T | date]
显示当前日期设置和输入新日期的提示,请键入
不带参数的 DATE。要保留现有日期,请按 ENTER。
如果命令扩展名被启用,DATE 命令会支持 /T 开关;
该开关指示命令只输出当前日期,但不提示输出新日期。
返回页首

DEL

删除一个或数个文件。
DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
names         指定一个或数个文件或目录列表。通配符可被用来
删除多个文件。如果指定了一个目录,目录中的所
有文件都会被删除。
/P            删除每一个文件之前提示确认。
/F            强制删除只读文件。
/S            从所有子目录删除指定文件。
/Q            安静模式。删除全局通配符时,不要求确认。
/A            根据属性选择要删除的文件。
attributes      R  只读文件                     S  系统文件
H  隐藏文件                     A  存档文件
-  表示“否”的前缀
如果命令扩展名被启用,DEL 和 ERASE 会如下改变:
/S 开关的显示句法会颠倒,即只显示已经
删除的文件,而不显示找不到的文件。
返回页首

DIR

显示目录中的文件和子目录列表。
DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]
[drive:][path][filename]
指定要列出的驱动器、目录和/或文件。
/A          显示具有指定属性的文件。
attributes   D  目录                R  只读文件
H  隐藏文件            A  准备存档的文件
S  系统文件            -  表示“否”的前缀
/B          使用空格式(没有标题信息或摘要)。
/C          在文件大小中显示千位数分隔符。这是默认值。用 /-C 来
停用分隔符显示。
/D          跟宽式相同,但文件是按栏分类列出的。
/L          用小写。
/N          新的长列表格式,其中文件名在最右边。
/O          用分类顺序列出文件。
sortorder    N  按名称(字母顺序)     S  按大小(从小到大)
E  按扩展名(字母顺序)   D  按日期/时间(从先到后)
G  组目录优先           -  颠倒顺序的前缀
/P          在每个信息屏幕后暂停。
/Q          显示文件所有者。
/S          显示指定目录和所有子目录中的文件。
/T          控制显示或用来分类的时间字符域。
timefield   C  创建时间
A  上次访问时间
W  上次写入的时间
/W          用宽列表格式。
/X          显示为非 8dot3 文件名产生的短名称。格式是 /N 的格式,
短名称插在长名称前面。如果没有短名称,在其位置则
显示空白。
/4          用四位数字显示年
可以在 DIRCMD 环境变量中预先设定开关。通过添加前缀 - (破折号)
来替代预先设定的开关。例如,/-W。
返回页首

DISKCOMP

比较两张软盘的内容。
DISKCOMP [drive1: [drive2:]]
返回页首

DISKCOPY

把一张软盘的内容复制到另一张。
DISKCOPY [drive1: [drive2:]] [/V]
/V   校验信息复制得是否正确。
两张软盘的类型必须相同。
您可以为 drive1 和 drive2 指定同样的驱动器。
返回页首

DOSKEY

编辑命令行,重调用 Windows XP 命令,并创建宏。
DOSKEY [/REINSTALL] [/LISTSIZE=size] [/MACROS[:ALL | :exename]]
[/HISTORY] [/INSERT | /OVERSTRIKE] [/EXENAME=exename] [/MACROFILE=filename]
[macroname=[text]]
/REINSTALL          安装一组新的 Doskey。
/LISTSIZE=size      设置命令历史记录的缓冲区大小。
/MACROS             显示所有 Doskey 宏。
/MACROS:ALL         为具有 Doskey 宏的执行文件,显示所有的
Doskey 宏。
/MACROS:exename     显示指定执行文件的所有 Doskey 宏。
/HISTORY            显示保存在内存中的所有命令。
/INSERT             指定用键入的新文字插入旧文字中。
/OVERSTRIKE         指定新文字改写旧文字。
/EXENAME=exename    指定执行文件。
/MACROFILE=filename 指定安装的宏文件。
macroname           指定所创建宏的名称。
text                指定要登记的命令。
使用上下箭头键选择命令;ESC 清除命令行;F7 显示
命令历史记录;ALT+F7 清除命令历史记录;F8 搜索命令
历史记录;F9 按编号选择命令;ALT+F10 清除宏定义。
以下是 Doskey 宏定义的特殊码:
$T     命令分隔符号。允许一个宏可以含多个命令。
$1-$9  批处理参数。与批处理程序中的 %1-%9 相同。
$*     以命令行中命令名称后面的任何内容替换的符号。
返回页首

ECHO

显示信息,或将命令回显打开或关上。
ECHO [ON | OFF]
ECHO [message]
要显示当前回显设置,键入不带参数的 ECHO。
返回页首

ENDLOCAL

结束批处理文件中环境改动的本地化操作。在执行ENDLOCAL 之后
所做的环境改动不再仅限于批处理文件。批处理文件结束后,
原先的设置无法还原。
ENDLOCAL
如果命令扩展名被启用,ENDLOCAL 会如下改变:
如果相应的 SETLOCAL 用新的 ENABLEEXTENSIONS 或
DISABLEEXTENSIONS 选项启用或停用了命令扩展名,那么,在
ENDLOCAL 之后,命令扩展名的启用/停用状态会还原到执行
相应的 SETLOCAL 命令前的状态。
返回页首

ERASE

删除一个或数个文件。
DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
names         指定一个或数个文件或目录列表。通配符可被用来
删除多个文件。如果指定了一个目录,目录中的所
有文件都会被删除。
/P            删除每一个文件之前提示确认。
/F            强制删除只读文件。
/S            从所有子目录删除指定文件。
/Q            安静模式。删除全局通配符时,不要求确认。
/A            根据属性选择要删除的文件。
attributes      R  只读文件                     S  系统文件
H  隐藏文件                     A  存档文件
-  表示“否”的前缀
如果命令扩展名被启用,DEL 和 ERASE 会如下改变:
/S 开关的显示句法会颠倒,即只显示已经
删除的文件,而不显示找不到的文件。
返回页首

EXIT

退出 CMD.EXE 程序(命令翻译程序)或当前批处理脚本。
EXIT [/B] [exitCode]
/B          指定要退出当前批处理脚本而不是 CMD.EXE。如果从一个
批处理脚本外执行,则会退出 CMD.EXE
exitCode    指定一个数字号码。如果指定了 /B,将 ERRORLEVEL
设成那个数字。如果退出 CMD.EXE,则用那个数字设置
过程退出代码。
返回页首

FC

比较两个文件或两个文件集并显示它们之间的不同
FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/U] [/W] [/nnnn]
[drive1:][path1]filename1 [drive2:][path2]filename2
FC /B [drive1:][path1]filename1 [drive2:][path2]filename2
/A         只显示每个不同处的第一行和最后一行。
/B         执行二进制比较。
/C         不分大小写。
/L         将文件作为 ASCII 文字比较。
/LBn       将连续不匹配的最大值设为指定
的行数。
/N         在 ASCII 比较上显示行数。
/OFF[LINE] 不要跳过带有脱机属性集的文件。
/T         不要将 tab 扩充到空格。
/U         将文件作为 UNICODE 文字文件比较。
/W         为了比较而压缩空白(tab 和空格)。
/nnnn      指定不匹配处后必须连续匹配的行数。
[drive1:][path1]filename1
指定要比较的第一个文件或第一个文件集。
[drive2:][path2]filename2
指定要比较的第二个文件或第二个文件集。
返回页首

FIND

在文件中搜索字符串。
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
/V        显示所有未包含指定字符串的行。
/C        仅显示包含字符串的行数。
/N        显示行号。
/I        搜索字符串时忽略大小写。
/OFF[LINE] 不要跳过具有脱机属性集的文件。
"string"  指定要搜索的文字串,
[drive:][path]filename
指定要搜索的文件。
如果没有指定路径,FIND 将搜索键入的或者由另一命令产生的文字。
返回页首

FINDSTR

在文件中寻找字符串。
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file]
[/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
strings [[drive:][path]filename[ ...]]
/B        在一行的开始配对模式。
/E        在一行的结尾配对模式。
/L        按字使用搜索字符串。
/R        将搜索字符串作为一般表达式使用。
/S        在当前目录和所有子目录中搜索
匹配文件。
/I         指定搜索不分大小写。
/X        打印完全匹配的行。
/V        只打印不包含匹配的行。
/N        在匹配的每行前打印行数。
/M        如果文件含有匹配项,只打印其文件名。
/O        在每个匹配行前打印字符偏移量。
/P        忽略有不可打印字符的文件。
/OFF[LINE] 不跳过带有脱机属性集的文件。
/A:attr   指定有十六进位数字的颜色属性。请见 "color /?"
/F:file   从指定文件读文件列表 (/ 代表控制台)。
/C:string 使用指定字符串作为文字搜索字符串。
/G:file   从指定的文件获得搜索字符串。 (/ 代表控制台)。
/D:dir    查找以分号为分隔符的目录列表
strings   要查找的文字。
[drive:][path]filename
指定要查找的文件。
除非参数有 /C 前缀,请使用空格隔开搜索字符串。
例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或
"there" 。  'FINDSTR /C:"hello there" x.y' 文件 x.y  寻找
"hello there"。
一般表达式的快速参考:
.        通配符: 任何字符
*        重复: 以前字符或类别出现零或零以上次数
^        行位置: 行的开始
$        行位置: 行的终点
[class]  字符类别: 任何在字符集中的字符
[^class] 补字符类别: 任何不在字符集中的字符
[x-y]    范围: 在指定范围内的任何字符
/x       Escape: 元字符 x 的文字用法
/    字位置: 字的结束
有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。
返回页首

FOR

对一组文件中的每一个文件执行某个特定命令。
FOR %variable IN (set) DO command [command-parameters]
%variable  指定一个单一字母可替换的参数。
(set)      指定一个或一组文件。可以使用通配符。
command    指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到
支持:
FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,则指定与目录名匹配,而不与文件
名匹配。
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的
FOR 语句。如果在 /R 后没有指定目录,则使用当前
目录。如果集仅为一个单点(.)字符,则枚举该目录树。
FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。
因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
序列 (5 4 3 2 1)。
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
或者,如果有 usebackq 选项:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
filenameset 为一个或多个文件名。继续到 filenameset 中的
下一个文件之前,每份文件都已被打开、读取并经过处理。
处理包括读取文件,将其分成一行行的文字,然后将每行
解析成零或更多的符号。然后用已找到的符号字符串变量值
调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开
的第一个空白符号。跳过空白行。您可通过指定可选 "options"
参数替代默认解析操作。这个带引号的字符串包括一个或多个
指定不同解析选项的关键字。这些关键字为:
eol=c           - 指一个行注释字符的结尾(就一个)
skip=n          - 指在文件开始时忽略的行数。
delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
默认分隔符集。
tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
的 for 本身。这会导致额外变量名称的分配。m-n
格式为一个范围。通过 nth 符号指定 mth。如果
符号字符串中的最后一个字符星号,
那么额外的变量将在最后一个符号解析之后
分配并接受行的保留文本。
usebackq        - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单
引号字符为文字字符串命令并允许在 filenameset
中使用双引号扩起文件名称。
某些范例可能有助:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将
每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
空格定界符号。请注意,这个 for 程序体的语句引用 %i 来
取得第二个符号,引用 %j 来取得第三个符号,引用 %k
来取得第三个符号后的所有剩余符号。对于带有空格的文件
名,您需要用双引号将文件名括起来。为了用这种方式来使
用双引号,您还需要使用 usebackq 选项,否则,双引号会
被理解成是用作定义某个要分析的字符串的。
%i 专门在 for 语句中得到说明,%j 和 %k 是通过
tokens= 选项专门得到说明的。您可以通过 tokens= 一行
指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或
'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,
同时不能有 52 个以上都在使用中。
您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
用单引号将括号之间的 filenameset 括起来。这样,该字符
串会被当作一个文件中的一个单一输入行。
最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将
括号之间的 filenameset 变成一个反括字符串。该字符串会
被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进
内存,并被当作文件分析。因此,以下例子:
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
会枚举当前环境中的环境变量名称。
另外,FOR 变量参照的替换已被增强。您现在可以使用下列
选项语法:
~I         - 删除任何引号("),扩充 %I
%~fI        - 将 %I 扩充到一个完全合格的路径名
%~dI        - 仅将 %I 扩充到一个驱动器号
%~pI        - 仅将 %I 扩充到一个路径
%~nI        - 仅将 %I 扩充到一个文件名
%~xI        - 仅将 %I 扩充到一个文件扩展名
%~sI        - 扩充的路径只含有短名
%~aI        - 将 %I 扩充到文件的文件属性
%~tI        - 将 %I 扩充到文件的日期/时间
%~zI        - 将 %I 扩充到文件的大小
%~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充
到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩充到
空字符串
可以组合修饰符来得到多重结果:
%~dpI       - 仅将 %I 扩充到一个驱动器号和路径
%~nxI       - 仅将 %I 扩充到一个文件名和扩展名
%~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
到找到的第一个驱动器号和路径。
%~ftzaI     - 将 %I 扩充到类似输出线路的 DIR
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
比较易读,而且避免与不分大小写的组合键混淆。
返回页首

FORMAT

格式化磁盘以供 Windows XP 使用。
FORMAT volume [/FS:file-system] [/V:label] [/Q] [/A:size] [/C] [/X]
FORMAT volume [/V:label] [/Q] [/F:size]
FORMAT volume [/V:label] [/Q] [/T:tracks /N:sectors]
FORMAT volume [/V:label] [/Q]
FORMAT volume [/Q]
volume           指定驱动器(后面跟一个冒号)、装入点
或卷名。
/FS:filesystem  指定文件系统类型(FAT、FAT32 或 NTFS)。
/V:label        指定卷标。
/Q              执行快速格式化。
/C              仅适于 NTFS: 默认情况下,将压缩在该新建卷上
创建的文件。
/X              如果必要,先强制卸下卷。那时,该卷所有
已打开的句柄不再有效。
/A:size         替代默认配置单位大小。极力建议您在一般状况下使用
默认设置。
NTFS 支持 512、1024、2048、4096、8192、16K、32K、
64K。
FAT 支持 512、1024、2048、4096、8192、16K、32K、
64k,(128k、256k 用于大于 512 字节的扇区) 。
FAT32 支持 512、1024、2048、4096、8192、16k、32k、
64k,(128k 、256k 用于大于 512 字节的扇区)。
注意 FAT 及 FAT32 文件系统对卷上的群集数量有以下限制:
FAT: 群集数量 <= 65526
FAT32: 65526 < 群集数量 < 4177918
如果判定使用指定的群集大小无法满足以上需求,格式
化将立即停止。
NTFS 压缩不支持大于 4096 的分配单元。
/F:size         指定要格式化的软盘大小(1.44)
/T:tracks       为磁盘指定每面磁道数。
/N:sectors      指定每条磁道的扇区数。
返回页首

FTYPE

显示或修改用在文件扩展名关联中的文件类型
FTYPE [fileType[=[openCommandString]]]
fileType  指定要检查或改变的文件类型
openCommandString 指定调用这类文件时要使用的开放式命令。
键入 FTYPE 而不带参数来显示当前有定义的开放式命令字符串的
文件类型。 FTYPE 仅用一个文件类型启用时,它显示那个文件类
型目前的开放式命令字符串。如果不为开放式命令字符串指定,
FTYPE 命令将删除那个文件类型的开放式命令字符串。在一个
开放式命令字符串之内,命令字符串 %0 或 %1 被通过关联调用
的文件名所代替。%* 得到所有的参数,%2 得到第一个参数,
%3 得到第二个,等等。%~n 得到其余所有以 nth 参数打头的
参数;n 可以是从 2 到 9 的数字。例如:
ASSOC .pl=PerlScript
FTYPE PerlScript=perl.exe %1 %*
允许您启用以下 Perl 脚本:
script.pl 1 2 3
如果不想键入扩展名,则键入以下字符串:
set PATHEXT=.pl;%PATHEXT%
被启动的脚本如下:
script 1 2 3
返回页首

GOTO

将 cmd.exe 导向到批处理程序中带标签的行。
GOTO label
label   指定批处理程序中用作标签的文字字符串。
标签必须单独一行,并且以冒号打头。
如果命令扩展名被启用,GOTO 会如下改变:
GOTO 命令现在接受目标标签 :EOF,这个标签将控制转移到当前
批脚本文件的结尾。不定义就退出批脚本文件,这是一个容易的
办法。有关能使该功能有用的 CALL 命令的扩展名描述,请键入
CALL /?。
返回页首

GRAFTABL

请在图形模式下启用 Windows 显示扩展字符集。
GRAFTABL [xxx]
GRAFTABL /STATUS
xxx      指定代码页。
/STATUS  显示选定的同 GRAFTABL 一起使用的当前代码页。
返回页首

HELP

提供 Windows XP 命令的帮助信息。
HELP [command]
command - 显示该命令的帮助信息。
返回页首

IF

执行批处理程序中的条件处理。
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
NOT               指定只有条件为 false 的情况下, Windows XP 才
应该执行该命令。
ERRORLEVEL number 如果最后运行的程序返回一个等于或大于
指定数字的退出编码,指定条件为 true。
string1==string2  如果指定的文字字符串匹配,指定条件为 true。
EXIST filename    如果指定的文件名存在,指定条件为 true。
command           如果符合条件,指定要执行的命令。如果指定的
条件为 FALSE,命令后可跟一个执行 ELSE
关键字后的命令的 ELSE 命令。
ELSE 子句必须在 IF 之后出现在同一行上。例如:
IF EXIST filename. (
del filename.
) ELSE (
echo filename. missing.
)
因为 del 命令需要用一个新行终止,以下子句不会有效:
IF EXIST filename. del filename. ELSE echo filename. missing
由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也
不会有效:
IF EXIST filename. del filename.
ELSE echo filename. missing
如果都放在同一行上,以下子句有效:
IF EXIST filename. (del filename.) ELSE echo filename. missing
如果命令扩展名被启用,IF 会如下改变:
IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command
其中,比较运算符可以是:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
及 /I 开关;如果该开关被指定,则说明要进行的字符串比较不分
大小写。/I 开关可以用于 IF 的 string1==string2 的形式上。这些
比较都是通用的;原因是,如果 string1 和 string2 都是由数字
组成的,字符串会被转换成数字,进行数字比较。
CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样,除了它
是在跟与命令扩展名有关联的内部版本号比较。第一个版本
是 1。每次对命令扩展名有相当大的增强时,版本号会增加一个。
命令扩展名被停用时,CMDEXTVERSION 条件不是真的。
如果已定义环境变量,DEFINED 条件的作用跟 EXISTS 的一样,
除了它取得一个环境变量,返回的结果是 true。
如果没有名为 ERRORLEVEL 的环境变量,%ERRORLEVEL%
会扩充为 ERROLEVEL 当前数值的字符串表达式;否则,您会得到
其数值。运行程序后,以下语句说明 ERRORLEVEL 的用法:
goto answer%ERRORLEVEL%
:answer0
echo Program had return code 0
:answer1
echo Program had return code 1
您也可以使用以上的数字比较:
IF %ERRORLEVEL% LEQ 1 goto okay
如果没有名为 CMDCMDLINE 的环境变量,%CMDCMDLINE%
将在 CMD.EXE 进行任何处理前扩充为传递给 CMD.EXE 的原始
命令行;否则,您会得到其数值。
如果没有名为 CMDEXTVERSION 的环境变量,
%CMDEXTVERSION% 会扩充为 CMDEXTVERSION 当前数值的
字串符表达式;否则,您会得到其数值。
返回页首

LABEL

创建、更改或删除磁盘的卷标。
LABEL [drive:][label]
LABEL [/MP] [volume] [label]
drive:          指定驱动器名。
label           指定卷标签。
/MP             指定卷应该被当作安装点或卷名。
volume          指定驱动器(后面跟一个冒号)、装入点
或卷名。如果指定了卷名,/MP 标志则不必要。
返回页首

MD

创建目录。
MKDIR [drive:]path
MD [drive:]path
如果命令扩展名被启用,MKDIR 会如下改变:
如果需要,MKDIR 会在路径中创建中级目录。例如: 假设 /a 不
存在,那么:
mkdir /a/b/c/d
与:
mkdir /a
chdir /a
mkdir b
chdir b
mkdir c
chdir c
mkdir d
相同。如果扩展名被停用,则需要键入 mkdir /a/b/c/d。
返回页首

MKDIR

创建目录。
MKDIR [drive:]path
MD [drive:]path
如果命令扩展名被启用,MKDIR 会如下改变:
如果需要,MKDIR 会在路径中创建中级目录。例如: 假设 /a 不
存在,那么:
mkdir /a/b/c/d
与:
mkdir /a
chdir /a
mkdir b
chdir b
mkdir c
chdir c
mkdir d
相同。如果扩展名被停用,则需要键入 mkdir /a/b/c/d。
返回页首

MODE

配置系统设备。
串行口:        MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s]
[to=on|off] [xon=on|off] [odsr=on|off]
[octs=on|off] [dtr=on|off|hs]
[rts=on|off|hs|tg] [idsr=on|off]
设备状态:             MODE [device] [/STATUS]
打印重定向:   MODE LPTn[:]=COMm[:]
选定代码页:   MODE CON[:] CP SELECT=yyy
代码页状态:   MODE CON[:] CP [/STATUS]
显示模式:       MODE CON[:] [COLS=c] [LINES=n]
击键率:              MODE CON[:] [RATE=r DELAY=d]
返回页首

MORE

逐屏显示输出。
MORE [/E [/C] [/P] [/S] [/Tn] [+n]] < [drive:][path]filename
command-name | MORE [/E [/C] [/P] [/S] [/Tn] [+n]]
MORE /E [/C] [/P] [/S] [/Tn] [+n] [files]
[drive:][path]filename  指定要逐屏显示的文件。
command-name                 指定要显示其输出的命令 。
/E      启用扩展功能
/C      显示页面前先清除屏幕
/P      扩展 FormFeed 字符
/S      将多个空白行缩成一行
/Tn     将跳格键扩展成 n 个空格(默认值为 8)
命令行开关可以出现在 MORE 环境变量中。
+n      从第 n 行开始显示第一个文件
files    要显示的文件列表。 用空格分开列表中的文件。
如果扩展的功能已经启用,在 -- More -- 提示处会接受下列
命令:
P n     显示下 n 行
S n     略过下 n 行
F       显示下个文件
Q       退出
=       显示行号
?       显示帮助行
 显示下一页
   显示下一行
返回页首

MOVE

移动文件并重命名文件和目录。
要移动至少一个文件:
MOVE [/Y | /-Y] [drive:][path]filename1[,...] destination
要重命名一个目录:
MOVE [/Y | /-Y] [drive:][path]dirname1 dirname2
[drive:][path]filename1 指定您想移动的文件位置和名称。
destination             指定文件的新位置。目标可包含一个驱动器号
和冒号、一个目录名或组合。如果只移动一个文件
并在移动时将其重命名,您还可以包括文件名。
[drive:][path]dirname1  指定要重命名的目录。
dirname2                指定目录的新名称。
/Y                      取消确认改写一个现有目标文件的提示。
/-Y                     对确认改写一个现有目标文件发出提示。
命令行开关 /Y 可以出现在 COPYCMD 环境变量中。这可以用命令行上
的 /-Y 替代。默认值是,除非 MOVE 命令是从一个批脚本内
执行的,改写时都发出提示。
返回页首

PATH

为可执行文件显示或设置一个搜索路径。
PATH [[drive:]path[;...][;%PATH%]
PATH ;
键入 PATH ; 清除所有搜索路径设置并指示 cmd.exe 只在当前
目录中搜索。
键入 PATH 但不加参数,显示当前路径。
将 %PATH% 包括在新的路径设置中会将旧路径附加到新设置。
返回页首

PAUSE

暂停批处理程序,并显示以下消息:
请按任意键继续. . . 
返回页首

POPD

命令选项到保存在 PUSHD 命令里的目录。
POPD
如果命令扩展名被启用,从推目录堆栈 POPD 驱动器时,POPD
命令会删除 PUSHD 创建的临时驱动器号。
返回页首

PRINT

打印文本文件。
PRINT [/D:device] [[drive:][path]filename[...]]
/D:device   指定打印机设备。
返回页首

PROMPT

更改 cmd.exe 命令提示符。
PROMPT [text]
text    指定新的命令提示符。
提示符可以由普通字符及下列特定代码组成:
$A   & (短 and 符号)
$B   | (管道)
$C   ( (左括弧)
$D   当前日期
$E   Escape code (ASCII 码 27)
$F   ) (右括弧)
$G   > (大于符号)
$H   Backspace (擦除前一个字符)
$L   < (小于符号)
$N   当前驱动器
$P   当前驱动器及路径
$Q    = (等号)
$S     (空格)
$T   当前时间
$V   Windows XP 版本号
$_   换行
$$   $ (货币符号)
如果命令扩展名被启用,PROMPT 命令会支持下列格式化字符:
$+   根据 PUSHD 目录堆栈的深度,零个或零个以上加号(+)字符;
每个被推的层有一个字符。
$M   如果当前驱动器不是网络驱动器,显示跟当前驱动器号或
空字符串有关联的远程名。
返回页首

PUSHD

保存当前目录以供 POPD 命令使用,然后改到指定的目录。
PUSHD [path | ..]
path        指定要成为当前目录的目录。
如果命令扩展名被启用,除了一般驱动器号和路径,PUSHD
命令还接受网络路径。如果指定了网络路径,PUSHD 将创建一个
指向指定网络资源的临时驱动器号,然后再用刚定义的驱动器
号改变当前的驱动器和目录。可以从 Z: 往下分配临时驱动器
号,使用找到的第一个没有用过的驱动器号。
返回页首

RD

删除一个目录。
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path
/S      除目录本身外,还将删除指定目录下的所有子目录和
文件。用于删除目录树。
/Q      安静模式,带 /S 删除目录树时不要求确认
返回页首

RECOVER

从损坏的磁盘中恢复可读取的信息。
RECOVER [drive:][path]filename
在使用 RECOVER 命令以前,
先查阅 Windows XP 帮助内的联机命令参考。
返回页首

REM

在批处理文件或 CONFIG.SYS 里加上注解或说明。
REM [comment]
返回页首

REN

重命名文件。
RENAME [drive:][path]filename1 filename2.
REN [drive:][path]filename1 filename2.
请注意,您不能为目标文件指定新的驱动器或路径。
返回页首

RENAME

重命名文件。
RENAME [drive:][path]filename1 filename2.
REN [drive:][path]filename1 filename2.
请注意,您不能为目标文件指定新的驱动器或路径。
返回页首

REPLACE

替换文件。
REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [/P] [/R] [/W]
REPLACE [drive1:][path1]filename [drive2:][path2] [/P] [/R] [/S] [/W] [/U]
[drive1:][path1]filename 指定源文件。
[drive2:][path2]         指定要替换文件的
目录。
/A                       把新文件加入目标目录。不能和
/S 或 /U 命令行开关搭配使用。
/P                       替换文件或加入源文件之前会先提示您
进行确认。
/R                       替换只读文件以及未受保护的
文件。
/S                       替换目标目录中所有子目录的文件。
不能与 /A 命令选项
搭配使用。
/W                       等您插入磁盘以后再运行。
/U                       只会替换或更新比源文件日期早的文件。
不能与 /A 命令行开关搭配使用。
返回页首

RMDIR

删除一个目录。
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path
/S      除目录本身外,还将删除指定目录下的所有子目录和
文件。用于删除目录树。
/Q      安静模式,带 /S 删除目录树时不要求确认
返回页首

SET

显示、设置或删除 cmd.exe 环境变量。
SET [variable=[string]]
variable  指定环境变量名。
string    指定要指派给变量的一系列字符串。
要显示当前环境变量,键入不带参数的 SET。
如果命令扩展名被启用,SET 会如下改变:
可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配
SET 命令已使用的名称的所有变量的值。例如:
SET P
会显示所有以字母 P 打头的变量
如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL
设置成 1。
SET 命令不允许变量名含有等号。
在 SET 命令中添加了两个新命令行开关:
SET /A expression
SET /P variable=[promptString]
/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:
()                  - 分组
! ~ -               - 一元运算符
* / %               - 算数运算符
+ -                 - 算数运算符
<< >>               - 逻辑移位
- 按位“与”
^                   - 按位“异”
|                   - 按位“或”
= *= /= %= += -=    - 赋值
&= ^= |= <<= >>=
,                   - 表达式分隔符
如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用
引号扩起来。在表达式中的任何非数字字符串键作为环境变量
名称,这些环境变量名称的值已在使用前转换成数字。如果指定
了一个环境变量名称,但未在当前环境中定义,那么值将被定为
零。这使您可以使用环境变量值做计算而不用键入那些 % 符号
来得到它们的值。如果 SET /A 在命令脚本外的命令行执行的,
那么它显示该表达式的最后值。该分配的操作符在分配的操作符
左边需要一个环境变量名称。除十六进制有 0x 前缀, 八进制
有 0 前缀的,数字值为十进位数字。因此, 0x12 与 18 和 022
相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,
因为 8 和 9 不是有效的八进制位数。
/P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入
行之前,显示指定的 promptString。promptString 可以是空的。
环境变量替换已如下增强:
%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% - 扩展到调用命令处理器的原始命令行。
返回页首

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 值初始化成非零值。
返回页首

SHIFT

更改批处理文件中可替换参数的位置。
SHIFT [/n]
如果命令扩展名被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉
命令从第 n 个参数开始移位;n 介于零和八之间。例如:
SHIFT /2
会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。
返回页首

SORT

SORT [/R] [/+n] [/M kilobytes] [/L locale] [/REC recordbytes]
[[drive1:][path1]filename1] [/T [drive2:][path2]]
[/O [drive3:][path3]filename3]
/+n                         指定开始每个比较的字符号码 n。/+3 说明每个
比较应从每行的第三个字符开始。少于 n 个字符
的行排在其他行之前。按默认值,从每行的第一
个字符开始比较。
/L[OCALE] locale            用指定的区域设置替代系统默认区域设置。
""C"" 区域设置产生最快的排序顺序并且是当前的
唯一其他选择。排序总是不分大小写的。
/M[EMORY] kilobytes         指定用于排序的主内存量,单位为 KB。
最小内存量总是 160 KB。如果指定内存大小,
无论主内存的可用量是多少,指定的内存量
会全部用于排序。
要取得最佳性能,通常不指定内存大小。按默认
值,如果达到默认最大内存值,排序会一次完成
(非临时文件);否则,排序会分两次完成(没有
完全排序的数据存储在临时文件中);用于排序
和合并的内存量相等。如果输入和输出都是
文件, 默认最大内存量为可用主内存的 90%;
否则,为主内存的 45%。
/REC[ORD_MAXIMUM] characters 指定记录中的最大字符数量
(默认值为 4096,最大值为 65535)。
/R[EVERSE]                  颠倒排序顺序,即,从 Z 到 A,再从 9 到 0。
[drive1:][path1]filename1   指定要排序的文件。如果没有指定,
则排序标准输入。指定输入文件比将同一个文件
重定向为标准输入快。
/T[EMPORARY]
[drive2:][path2]          指定保留排序工作存储的目录路径,以防
主内存无法容纳数据。默认值是使用系统临时
目录。
/O[UTPUT]
[drive3:][path3]filename3 指定在哪个文件中储存经过排序的输入。
如果没有指定,数据会被写入标准输出。指定
输出文件比将标准输出重定向到同一个文件快。
返回页首

START

启动另一个窗口运行指定的程序或命令。
START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/WAIT] [/B] [command/program]
[parameters]
"title"     在窗口标题栏中显示的标题。
path        起始目录
B           在不创建新窗口的情况下开始应用程序。 除非
启动 ^C 处理,否则该应用程序会忽略 ^C 处理;
^Break 是唯一可以中断该应用程序的方式
I           新环境是传递给 cmd.exe 的原始环境,
而不是当前环境
MIN         开始时窗口最小化
MAX         开始时窗口最大化
SEPARATE    在分开的空间内开始 16 位 Windows 程序
SHARED      在分共享的空间内开始 16 位 Windows 程序
LOW         在 IDLE 优先级类别开始应用程序
NORMAL      在 NORMAL 优先级类别开始应用程序
HIGH        在 HIGH 优先级类别开始应用程序
REALTIME    在 REALTIME 优先级类别开始应用程序
ABOVENORMAL 在 ABOVENORMAL 优先级类别开始应用程序
BELOWNORMAL 在 BELOWNORMAL 优先级类别开始应用程序
WAIT        启动应用程序并等候它结束
command/program
如果是内部 cmd 命令或批文件,那么该命令处理器是
用 /K 命令行开关运行 cmd.exe 的。这表示该窗口在命令运行
后仍然存在。
如果不是内部 cmd 命令或批文件,则是一个程序,并
作为窗口应用程序或控制台应用程序运行。
parameters  这些为传送到命令/程序的参数
如果命令扩展名被启用,通过命令行或 START 命令的外部命令
调用会如下改变:
将文件名作为命令键入,非可执行文件    可以通过文件关联调用。
(例如, WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。
关于如何从命令脚本内部创建这些关联,请参阅 ASSOC 和
FTYPE 命令。
执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用
程序终止就返回命令提示。如果在命令脚本内执行,该新行为
则不会发生。
如果执行的命令行的第一个符号是不带扩展名或路径修饰符的
字符串 "CMD","CMD" 会被COMSPEC 变量的数值所替换。这
防止从当前目录抓出 CMD.EXE。
如果执行的命令行的第一个符号没有扩展名,CMD.EXE 会使用
PATHEXT 环境变量的数值来决定要以什么顺序寻找哪些扩展
名。PATHEXT 变量的默认值是:
.COM;.EXE;.BAT;.CMD
请注意,该语法跟 PATH 变量的一样,分号隔开不同的元素。
查找可执行文件时,如果没有相配的扩展名,看一看该名称是否
与目录名相配。如果确实如此,START 会在那个路径上调用
Explorer。如果从命令行执行,则等同于对那个路径作 CD /D。
返回页首

SUBST

将路径与驱动器号关联。
SUBST [drive1: [drive2:]path]
SUBST drive1: /D
drive1:        指定要指派路径的虚拟驱动器。
[drive2:]path  指定物理驱动器和要指派给虚拟驱动器的
路径。
/D             删除被替换的 (虚拟) 驱动器。
不加任何参数键入 SUBST,可以显示当前虚拟驱动器的清单。
返回页首

TIME

显示或设置系统时间。
TIME [/T | time]
显示当前时间设置和输入新时间的提示,请键入
不带参数的 TIME。要保留现有时间,请按 ENTER。
如果命令扩展名被启用,DATE 命令会支持 /T 命令行开关;该命令行开关告诉
命令只输出当前时间,但不提示输出新时间。
返回页首

TITLE

设置命令提示窗口的窗口标题。
TITLE [string]
string       指定命令提示窗口的标题。
返回页首

TREE

以图形显示驱动器或路径的文件夹结构。
TREE [drive:][path] [/F] [/A]
/F   显示每个文件夹中文件的名称。
/A   使用 ASCII 字符,而不使用扩展字符。
返回页首

TYPE

显示文本文件的内容。
TYPE [drive:][path]filename
返回页首

VER

显示 Windows XP 版本。
VER
返回页首

VERIFY

指示 cmd.exe 是否要验证文件是否已正确地写入磁盘。
VERIFY [ON | OFF]
要显示当前 VERIFY 设置,键入不带参数的 VERIFY。
返回页首

VOL

显示磁盘卷标和序列号(如果存在)。
VOL [drive:]
返回页首

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 改写。
返回页首

你可能感兴趣的:(Perl)