在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

时间:2022-09-02 20:15:58
我的某磁盘分区的一个目录中有一批图片文件。
每“一组文件”是3个,文件名的格式是这样:
flag_XXX.png
flag_XXX_l.png
flag_XXX_ll.png
这儿的“XXX”是3个英文大写字母,在“同一组文件”内,是一样的;
这一批文件的文件名都是以“flag_”开头、扩展名都是png图片文件。
总共有220组,也就有 220×3 = 660个文件。

我想把文件名格式是“flag_XXX.png”的那一批文件“分离”出来(每一组文件是3种尺寸规格),
于是打开“命令提示符”窗口,进入“源文件所在目录”,然后执行一条DOS命令:
copy flag_???.png  目标存放目录
按照“文件名通配符”的约定,那么这条命令的执行结果,
应该只复制其中文件名格式为 flag_XXX.png的220个文件,但是结果却是这样:
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

很扯蛋的是,它把有一些文件名带 _l 或_ll 后缀的文件复制了、有一些又没有复制,
  害得我自己去“目标存放目录”中,删除多余的文件。
更扯蛋的是:多余的文件删除完之后,发现还少了一个文件,有一个文件名格式符合要求的文件,
  居然没有被复制过去!
又害得我用dir命令获取文件清单、对清单进行处理、比较,看是少了哪个文件!!!
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

大家说一说,微软的这“命令提示符”执行DOS命令的结果,为什么会如此扯蛋…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

35 个解决方案

#1


自己坐沙发…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#2


忘记了说,上面截图中,最后的那个,就是我当时复制文件时,所输入执行的copy命令。

不小心又要占一楼了。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#3


呃,居然没人来看看???

在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#4


flag_XXX.png       xxx不限定_后面的数位

#5


引用 4 楼 qq_36111921 的回复:
flag_ XXX.png       xxx不限定_后面的数位

你仔细看看我的“copy 命令”,我那儿用的是3个英文问号。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

我说的“XXX”只是一个文件名的字符形式而已,并不是实际为3个X 。
按“一贯”的DOS通配符规则,一个?只匹配1个字符。
我要处理的那批文件,文件名全是英文的,
因此也不存在“1个字符可能是1字节,也可能是2字节、3字节等”造成的任何差异。

按“DOS命令文件名通配符规则”,那么我的那条copy命令,
只应该复制到220个文件名格式为 flag_XXX.png的文件,
不应该把 XXX后带 _l或_ll后缀的文件复制过去。

但是,复制结果,却是:
有一些把文件把一组中3个文件都复制了、有一些文件是只多复制了一个带后缀的;
更离谱的是,其中一个文件是符合规则的文件没有被复制!
所以它复制的文件总数不是220个,而是316个。

但这个“316个文件”,谁能解释清楚它是怎么搞的!!!
这M$的程序是不是越搞越倒退了?

#6


原因很简单, 如果文件名不是8.3, 那它会有一个只有8.3字符的短文件名, 这是为了兼容早先的系统.
你用 dir /X 就看到了,所以这个问题还有点麻烦.

#7


引用 6 楼 tcmakebest 的回复:
原因很简单, 如果文件名不是8.3, 那它会有一个只有8.3字符的短文件名, 这是为了兼容早先的系统.
你用 dir /X 就看到了,所以这个问题还有点麻烦.

我觉得应该不是这个原因。
如果是因为它匹配了“长文件名”对应的 8.3短文件名造成,那么就应该复制的是660个文件。
因为 flag_XXX.png 刚好把“8.3格式”的空间占完的,它的文件名带 _l 和 _ll 后缀的都是“长文件名”的文件。
并且,我也进入那个文件夹用你说的 dir /x 命令查看了一下,确认所有的“长文件名”都有一个相应的短文件名。

dir 命令带 /x 参数后,居然不能使用“文件筛选” …………  在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………
我只好将输出重定向到一个文本文件中,然后统计以 flag开头的文件名个数(这个文件夹*有两千多文件)。
确认了以 flag开头的“短文件名”项目有440条,再加上“标准8.3格式”220条,共660个文件无误。

#8


难道“大牛”真的在水区?
移到水区看看。  在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

在: CSDN > CSDN论坛 > VB 摆了两天,没有哪个网友来回复;
然后移到: CSDN > CSDN论坛 > Windows专区 > 一般软件使用
放了一周,就那两个回复,还是没说到点子上的。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#9


robocopy 源文件夹 目标文件夹 "flag_???.png" /XF "flag_???_*.png"

#10


vb没人回?赵老湿难道没有攻占vb板块?

#11


引用 9 楼 luciferisnotsatan 的回复:
robocopy 源文件夹 目标文件夹 "flag_???.png" /XF "flag_???_*.png"


我主要想不明白的是,按“理论上说”,我的那个copy命令,
flag_???.png 应该是只匹配那批文件中的220个文件。

它凭什么把本不该匹配的文件,去“匹配”了一部分?
  注意,是“匹配了一部分”,又不是全部匹配了!
这不是很扯蛋么…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

不知道赵老湿那几天怎么没回复我的帖子。
其实他是经常在VB版块逛的。

#12


引用 11 楼 Chen8013 的回复:
Quote: 引用 9 楼 luciferisnotsatan 的回复:

robocopy 源文件夹 目标文件夹 "flag_???.png" /XF "flag_???_*.png"


我主要想不明白的是,按“理论上说”,我的那个copy命令,
flag_???.png 应该是只匹配那批文件中的220个文件。

它凭什么把本不该匹配的文件,去“匹配”了一部分?
  注意,是“匹配了一部分”,又不是全部匹配了!
这不是很扯蛋么…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

不知道赵老湿那几天怎么没回复我的帖子。
其实他是经常在VB版块逛的。


赵老湿 是不是 休假了。

没试过这样copy 图片,



引用 4 楼 qq_36111921 的回复:
flag_XXX.png       xxx不限定_后面的数位

flag_*.png       才是不限定 位数吧?

#13


引用 11 楼 Chen8013 的回复:
Quote: 引用 9 楼 luciferisnotsatan 的回复:

robocopy 源文件夹 目标文件夹 "flag_???.png" /XF "flag_???_*.png"


我主要想不明白的是,按“理论上说”,我的那个copy命令,
flag_???.png 应该是只匹配那批文件中的220个文件。

它凭什么把本不该匹配的文件,去“匹配”了一部分?
  注意,是“匹配了一部分”,又不是全部匹配了!
这不是很扯蛋么…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

不知道赵老湿那几天怎么没回复我的帖子。
其实他是经常在VB版块逛的。

你dir的是flag*, copy的是flag_???  dir时,没有那个下划线呢?
另外,前半部分相似的文件多了,短文件名前5字节不一定是flag_。你dir /x看下结果吧,估计就是一部分的短文件名前面已经不是flag_了

#14


楼主先帮我在这个帖子
http://bbs.csdn.net/topics/392028122
随便回复一句断下贴。

#15


6楼说对了原因估计。
解决的办法供参考:
for /f %f in ('dir /b ^| findstr /R "^flag_...\.png"') do copy %f e:\pes_2017_cpk\flag

#16


引用 13 楼 luciferisnotsatan 的回复:
Quote: 引用 11 楼 Chen8013 的回复:

Quote: 引用 9 楼 luciferisnotsatan 的回复:

robocopy 源文件夹 目标文件夹 "flag_???.png" /XF "flag_???_*.png"


我主要想不明白的是,按“理论上说”,我的那个copy命令,
flag_???.png 应该是只匹配那批文件中的220个文件。

它凭什么把本不该匹配的文件,去“匹配”了一部分?
  注意,是“匹配了一部分”,又不是全部匹配了!
这不是很扯蛋么…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

不知道赵老湿那几天怎么没回复我的帖子。
其实他是经常在VB版块逛的。

你dir的是flag*, copy的是flag_???  dir时,没有那个下划线呢?
另外,前半部分相似的文件多了, 短文件名前5字节不一定是flag_。你dir /x看下结果吧,估计就是一部分的短文件名前面已经不是flag_了

看清楚点啊,我本来就不需要copy那种文件的。
我需要的是,只copy以flag_开头、接着是3个英文字母的,文件名总长刚好是8个字符的那220个文件。
那些“长文件名”,按理说是不应该匹配到 flag_???.png里面的。

我那儿执行 dir flag*.png ,是要得到那一批文件的清单,然后看一下它少复制了哪个“标准格式”的文件。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………
这儿带不带下划线,是没有关系的,以flag开头的png图片,只有那660个。

你说的“短文件名前5字节不一定是flag_”,刚才我看了一下,好像是那么一回事。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………
等会儿我有空处理一下文件清单,看看具体结果。

#17


引用 16 楼 Chen8013 的回复:
你dir的是flag*, copy的是flag_???  dir时,没有那个下划线呢?
另外,前半部分相似的文件多了, 短文件名前5字节不一定是flag_。你dir /x看下结果吧,估计就是一部分的短文件名前面已经不是flag_了

看清楚点啊,我本来就不需要copy那种文件的。
我需要的是,只copy以flag_开头、接着是3个英文字母的,文件名总长刚好是8个字符的那220个文件。
那些“长文件名”,按理说是不应该匹配到 flag_???.png里面的。

我那儿执行 dir flag*.png ,是要得到那一批文件的清单,然后看一下它少复制了哪个“标准格式”的文件。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………
这儿带不带下划线,是没有关系的,以flag开头的png图片,只有那660个。

你说的“短文件名前5字节不一定是flag_”,刚才我看了一下,好像是那么一回事。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………
等会儿我有空处理一下文件清单,看看具体结果。

我说的是,copy命令认的是短文件名,而flag_aaa_I被翻译成flag_a~1,不代表flag_azz_II被翻译成flag_a~9,可能被翻成了flag~999,当然具体转换规则我没研究过。所以你那660个文件里,会有316个匹配了flag_,剩下的那些,短名字的前5字符就不是flag_,匹配不上就不copy了。

这面这些数据,用flag_???能配上几个?
10/13/2016  09:46 AM                 0 FLA458~1.TXT flag_xxx - Copy (15).txt
10/13/2016  09:46 AM                 0 FLF5B2~1.TXT flag_xxx - Copy (16).txt
10/13/2016  09:46 AM                 0 FL4240~1.TXT flag_xxx - Copy (17).txt
10/13/2016  09:46 AM                 0 FLE1DE~1.TXT flag_xxx - Copy (18).txt
10/13/2016  09:46 AM                 0 FL29D8~1.TXT flag_xxx - Copy (19).txt
10/13/2016  09:46 AM                 0 FLAG_X~1.TXT flag_xxx - Copy (2).txt

#18


引用 16 楼 Chen8013 的回复:
Quote: 引用 13 楼 luciferisnotsatan 的回复:

Quote: 引用 11 楼 Chen8013 的回复:

Quote: 引用 9 楼 luciferisnotsatan 的回复:

robocopy 源文件夹 目标文件夹 "flag_???.png" /XF "flag_???_*.png"


我主要想不明白的是,按“理论上说”,我的那个copy命令,
flag_???.png 应该是只匹配那批文件中的220个文件。

它凭什么把本不该匹配的文件,去“匹配”了一部分?
  注意,是“匹配了一部分”,又不是全部匹配了!
这不是很扯蛋么…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

不知道赵老湿那几天怎么没回复我的帖子。
其实他是经常在VB版块逛的。

你dir的是flag*, copy的是flag_???  dir时,没有那个下划线呢?
另外,前半部分相似的文件多了, 短文件名前5字节不一定是flag_。你dir /x看下结果吧,估计就是一部分的短文件名前面已经不是flag_了

看清楚点啊,我本来就不需要copy那种文件的。
我需要的是,只copy以flag_开头、接着是3个英文字母的,文件名总长刚好是8个字符的那220个文件。
那些“长文件名”,按理说是不应该匹配到 flag_???.png里面的。

我那儿执行 dir flag*.png ,是要得到那一批文件的清单,然后看一下它少复制了哪个“标准格式”的文件。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………
这儿带不带下划线,是没有关系的,以flag开头的png图片,只有那660个。

你说的“短文件名前5字节不一定是flag_”,刚才我看了一下,好像是那么一回事。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………
等会儿我有空处理一下文件清单,看看具体结果。

我说的是,copy命令认的是短文件名,而flag_aaa_I被翻译成flag_a~1,不代表flag_azz_II被翻译成flag_a~9,可能被翻成了flag~999,当然具体转换规则我没研究过。所以你那660个文件里,会有316个匹配了flag_,剩下的那些,短名字的前5字符就不是flag_,匹配不上就不copy了。

 这面这些数据,用flag_???能配上几个?
10/13/2016  09:46 AM                 0 FLA458~1.TXT flag_xxx - Copy (15).txt
 10/13/2016  09:46 AM                 0 FLF5B2~1.TXT flag_xxx - Copy (16).txt
 10/13/2016  09:46 AM                 0 FL4240~1.TXT flag_xxx - Copy (17).txt
 10/13/2016  09:46 AM                 0 FLE1DE~1.TXT flag_xxx - Copy (18).txt
 10/13/2016  09:46 AM                 0 FL29D8~1.TXT flag_xxx - Copy (19).txt
 10/13/2016  09:46 AM                 0 FLAG_X~1.TXT flag_xxx - Copy (2).txt 

#19


flag_xxx - Copy (2).txt  这个转成了 FLAG_X~1.TXT
flag_xxx - Copy (15).txt 转成 了FLA458~1.TXT 

#20


用 dir /x 获取文件清单。
然后数据处理数据结果就是,长文件名转换成短文件名后,
仍然以 flag_开头的只有96个,其它的基本上是“面目全非”了。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

copy命令按短文件名进行匹配,96+220 = 316个。
luciferisnotsatan 说对了。
我在主贴中说的“有一个文件名格式符合要求的文件没有被复制”,应该是我删除文件时误删了。

TMD微软那帮孙子太欺骗人了…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

问题搞清楚了,结贴去。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#21


引用 19 楼 luciferisnotsatan 的回复:
flag_xxx - Copy (2).txt  这个转成了 FLAG_X~1.TXT
flag_xxx - Copy (15).txt 转成 了FLA458~1.TXT 

按我那批文件的短文件名清单来看,那个 ~后面的数字范围为1到4,
如果还有“名字相似”的,那个短文件名就明显变化了。

#22


引用 20 楼 Chen8013 的回复:
用 dir /x 获取文件清单。
然后数据处理数据结果就是,长文件名转换成短文件名后,
仍然以 flag_开头的只有96个,其它的基本上是“面目全非”了。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

copy命令按短文件名进行匹配,96+220 = 316个。
luciferisnotsatan 说对了。
我在主贴中说的“有一个文件名格式符合要求的文件没有被复制”,应该是我删除文件时误删了。

TMD微软那帮孙子太欺骗人了…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

问题搞清楚了,结贴去。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

robocopy实际用下来,感觉也挺坑的,感觉上file部分的对应还是短名,而/XF  这个exclude file用的却是长名。估计file部分为了兼容copy这个命令的行为,而/XF是新的flag,所以就不去兼容8.3格式了。反正windows的命令行功能一向是弱爆了的

我贴的例子只是其中一段,实际上我复制了几十次flag_xxx.txt

#23


findstr 竟然可以用正则,这样就扩展得无比厉害了,总算跟赵老四学到干货了

#24


引用 23 楼 sysdzw 的回复:
findstr 竟然可以用正则,这样就扩展得无比厉害了,总算跟赵老四学到干货了

都已经结贴了,你才来。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

没有“深入研究”过DOS命令,只会那些比较基础、浅显的用法。
现在也不想去深究它了。

以后我直接写一段代码进行文件复制操作,免得又被微软的那帮孙子坑了…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#25


引用 23 楼 sysdzw 的回复:
findstr 竟然可以用正则,这样就扩展得无比厉害了,总算跟赵老四学到干货了

在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………用脚后跟思考,也能猜出在CSDN技术论坛泡了十几年的赵老四手里的干货有多少!

#26


“一万小时定律”不是吃闲饭的! 在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#27


虽然15楼没有得分,但仍然遮不住其内容中的好几个亮点! 在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#28


引用 25 楼 zhao4zhong1 的回复:
Quote: 引用 23 楼 sysdzw 的回复:

findstr 竟然可以用正则,这样就扩展得无比厉害了,总算跟赵老四学到干货了

在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………用脚后跟思考,也能猜出在CSDN技术论坛泡了十几年的赵老四手里的干货有多少!
只是干货比例奇低!

#29


引用 28 楼 sysdzw 的回复:
Quote: 引用 25 楼 zhao4zhong1 的回复:

Quote: 引用 23 楼 sysdzw 的回复:

findstr 竟然可以用正则,这样就扩展得无比厉害了,总算跟赵老四学到干货了

在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………用脚后跟思考,也能猜出在CSDN技术论坛泡了十几年的赵老四手里的干货有多少!
只是干货比例奇低!

比例高的话还能被称之为“干货”吗?水发或油发之后变大不了多少?
金子不都是最后被淘出来的那么一丢丢吗?
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#30


引用 24 楼 Chen8013 的回复:
Quote: 引用 23 楼 sysdzw 的回复:

findstr 竟然可以用正则,这样就扩展得无比厉害了,总算跟赵老四学到干货了

都已经结贴了,你才来。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

没有“深入研究”过DOS命令,只会那些比较基础、浅显的用法。
现在也不想去深究它了。

以后我直接写一段代码进行文件复制操作,免得又被微软的那帮孙子坑了…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

robocopy还是推荐用一用的。

#31


C:\> 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 的大写变量名
比较易读,而且避免与不分大小写的组合键混淆。

#32


引用 27 楼 zhao4zhong1 的回复:
虽然15楼没有得分,但仍然遮不住其内容中的好几个亮点! 在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

我KAO !
我不是按“某楼的回复”来给分的好不!
难道你觉得你在14楼的那个回复,有资格得分?
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

我主要看是谁的回复有实际价值,相应的分数给在那个人的头上罢了。
就算你15楼的回复“有亮点”,也偏题了。
我需要搞清楚的是我那次的copy命令为何跟我预期的结果不一样。

另外,象你31楼的那种回复,对我来说,纯粹就是属于灌水。
本来可以用一句话表达的,非要去 Ctrl+C 、Ctrl+V 来一大篇…………
床上等你 是不是按你回复内容的字数多少,给你结算工资啊???
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#33


C:\> 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 的文字用法
  \<xyz    字位置: 字的开始
  xyz\>    字位置: 字的结束

有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。

#34


处处留心皆学问
用空杯心态来学习

#35


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

下表将列出可用的句柄。

句柄      句柄的数字代号 描述
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 命令选择
的文件名(在命令提示符窗口中每次显示一屏)。有关筛选器命令的详细信息,请参阅
使用筛选器。

命令行解释器概述
命令行解释器是一个单独的软件程序,它可以在用户和操作系统之间提供直接的通讯。非图形命令行解释器用户界面提供运行基于字符的应用程序和实用程序的环境。通过使用类似于 MS-DOS 命令解释程序 Command.com 的单独字符,命令行解释器执行程序并在屏幕上显示其输出。Windows 服务器操作系统命令行解释器使用命令解释程序 Cmd.exe(该程序加载应用程序并指导应用程序之间的信息流动)将用户输入转换为操作系统可理解的形式。
可以使用命令行解释器创建和编辑可自动执行常规任务的批处理文件(也称作脚本)。例如,可以使用脚本自动管理用户帐户或夜间备份。还可以使用 Windows 脚本宿主 CScript 的命令行版本在命令行解释器中运行更高级的脚本。详细信息,请参阅运行 Windows 脚本宿主。通过使用批处理文件来执行操作,可比使用用户界面更有效率。批处理文件接受命令行上可用的所有命令。有关批处理文件和脚本的详细信息,请参阅使用批处理文件。
您可以自定义命令提示符窗口以易于查看并增强对程序运行方式的控制。有关自定义命令提示符窗口的详细信息,请参阅配置命令提示符。

使用命令语法
语法按命令及所带参数必须遵循的键入顺序出现。下面的 xcopy 命令示例显示了各种语法文本格式:

xcopy Source [Destination] [/w] [/p] [/c] [/v] [/q] [/f] [/l] [/g] [/d[:MM-DD-YYYY]] [/u] [/i] [/s [/e]] [/t] [/k] [/r] [/h] [{/a | /m}] [/n] [/o] [/x] [/exclude:File1[+[File2]][+[File3]] [{/y | /-y}] [/z]

下表说明如何解释不同的文本格式。

格式化图例
格式                                             含义
斜体                                             用户必须提供的信息
粗体                                             用户必须准确键入的要显示的元素
省略号(...)                                      在命令行中可多次重复的参数
中括号([])                                       可选项
大括号({});选项用竖线(|)分隔。例如:{even|odd}  用户必须从选项集合中选择一个
Courier字体                                      代码或程序输出

使用多个命令和条件处理符号
使用条件处理符号可以在单个命令行或脚本中运行多个命令。通过条件处理符号运行多个命令时,条件处理符号右边的命令根据条件处理符号左边命令的执行结果来发挥作用。例如,只有在前一个命令失败的情况下才可能需要运行一个新命令。或者,只有在前一个命令成功时才可能需要运行一个新命令。
可以使用下表列出的特殊字符来传递多个命令。

字符       语法                            定义
& [...]    Command1 & Command2             用来分隔一个命令行中的多个命令。Cmd.exe 运行第一个命令,然后运行第二个命令。
&& [...]   Command1 && Command2            只有在符号 && 前面的命令成功时,才运行该符号后面的命令。Cmd.exe 运行第一个命令,然后只有在第一个命令运行成功时才运行第二个命令。
|| [...]   Command1 || Command2            只有在符号 || 前面的命令失败时,才运行符号 || 后面的命令。Cmd.exe 运行第一个命令,然后只有在第一个命令未能运行成功(接收到大于零的错误代码)时才运行第二个命令。
( ) [...]  (Command1 & Command2)           用来分组或嵌套多个命令。
;或者,     Command1 Parameter1;Parameter2  用来分隔命令参数。

注意
“与”符号 (&)、管道符号 (|) 以及括号 () 是特殊字符,将它们作为参数传递时,必须在其前面加上转义字符 (^) 或引号。
如果某个命令成功完成操作,该命令就返回零 (0) 退出代码或不返回任何退出代码。有关退出代码的详细信息,请参阅 Microsoft Windows 部署和资源工具包。

嵌套命令行解释器
通过在命令提示符下打开新的 Cmd.exe 实例,可以在 Cmd.exe 内嵌套命令行解释器。默认情况下,Cmd.exe 的每个实例继承其父 Cmd.exe 应用程序的环境。通过嵌套 Cmd.exe 的实例,可以更改局部环境,而不会影响 Cmd.exe 的父应用程序。这使您能够保留 Cmd.exe 的原始环境,并在终止嵌套的命令行解释器之后返回到原始环境。但是在嵌套的命令行解释器中所做的更改将不会被保存。
要嵌套命令行解释器,请在命令提示符下键入:

cmd

出现类似于下面内容的消息:

Microsoft (R) Windows Server 2003 Standard Edition (TM)
(C) 版权所有 1985-2002 Microsoft Corp.
要关闭嵌套的命令行解释器,请键入 exit。

使用 setlocal 和 endlocal 命令,可以在 Cmd.exe 的实例中(或在脚本中)进一步将更改局部化。Setlocal 创建局部作用范围,而 endlocal 终止局部作用范围。在 setlocal 和 endlocal 作用范围内所做的更改将会被放弃,从而保持原始环境不变。这两个命令的嵌套最高可达到 32 级。有关 setlocal 和 endlocal 命令的详细信息,请参阅 Setlocal 和 Endlocal。

将环境变量与 Cmd.exe 一起使用
Cmd.exe 命令行解释器环境由确定命令行解释器和操作系统行为的变量进行定义。可以使用两种类型的环境变量(系统和局部)来定义命令行解释器环境或整个操作系统环境的行为。系统环境变量定义全局操作系统环境的行为。局部环境变量定义 Cmd.exe 当前实例环境的行为。
系统环境变量预置于操作系统之中,并可用于所有 Windows 服务器操作系统进程。只有具有管理凭据的用户才可以更改系统变量。这些变量最常用于登录脚本。
局部环境变量只有在创建变量时针对的目标用户登录到计算机时才有效。HKEY_CURRENT_USER 配置单元中设置的局部变量只对当前用户有效,但它们可定义全局操作系统环境的行为。

下表按优先顺序的降序描述变量的各种类型:
1.内置系统变量
2.在 HKEY_LOCAL_MACHINE 配置单元中找到的系统变量
3.在 HKEY_CURRENT_USER 配置单元中找到的局部变量
4.在 Autoexec.bat 文件中设置的所有环境变量和路径
5.在登录脚本(如果有的话)中设置的所有环境变量
6.在脚本或批处理文件中交互使用的变量

在命令行解释器中,Cmd.exe 的每个实例都继承其父应用程序的环境。因此,可以在不影响父应用程序环境的情况下更改新的 Cmd.exe 环境中的变量。
下表列出 Windows server operating system 的系统和本地环境变量。

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

设置环境变量
使用 set 命令创建、更改、删除或显示环境变量。set 命令只更改当前解释器环境中的变量。

要查看变量,请在命令提示符下键入:

set VariableName

要添加变量,请在命令提示符下键入:

set variablename=Value

要删除变量,请在命令提示符下键入:

set VariableName=

可以将大多数字符用作变量值,其中包括空格。如果使用特殊字符 <、>、|、& 或 ^,则必须在它们前面加上转义字符 (^) 或引号。如果使用引号,则必须将引号作为值的组成部分,因为等号后面的任何内容都会被视为值。请考虑下列示例:

要创建变量值 new&name,请键入:
set varname=new^&name

要创建变量值 "new&name",请键入:
set varname="new&name"

如果在命令提示符下键入 set varname=new&name,就会出现与下面内容类似的错误消息:
“'name' 不是内部或外部文件,也不是可运行的程序或批处理文件。”
变量名不区分大小写。但是,set 显示的变量与您键入的完全相同。可以在变量名中结合使用大写字母和小写字母,这样可以使代码更具有可读性(例如,UserName)。

注意

单个环境变量的最大大小为 8192 字节。
所有环境变量的大小总和(包括变量名和等号)最大为 65,536 KB。
替换环境变量值
要在命令行或脚本中启用变量值替换,请将变量名包括在百分号之中(即,%VariableName%)。使用百分号可以确保 Cmd.exe 引用变量值,而不是进行文字比较。为变量名定义变量值之后,请将变量名包括在百分号之中。Cmd.exe 搜索该变量名的所有实例,并用定义的变量值进行替换。例如,如果创建包含不同值(例如,用户名)的脚本,并且想要用这些值为每个用户定义 USERNAME 环境变量,可以使用包括在百分号之中的 USERNAME 来编写代码。运行此脚本时,Cmd.exe 将用变量值替换 %USERNAME%,这样就消除了为每个用户手动执行此任务的必要。变量替换是不可递归的。Cmd.exe 检查变量一次。有关变量替换的详细信息,请参阅 For 和 Call。

#1


自己坐沙发…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#2


忘记了说,上面截图中,最后的那个,就是我当时复制文件时,所输入执行的copy命令。

不小心又要占一楼了。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#3


呃,居然没人来看看???

在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#4


flag_XXX.png       xxx不限定_后面的数位

#5


引用 4 楼 qq_36111921 的回复:
flag_ XXX.png       xxx不限定_后面的数位

你仔细看看我的“copy 命令”,我那儿用的是3个英文问号。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

我说的“XXX”只是一个文件名的字符形式而已,并不是实际为3个X 。
按“一贯”的DOS通配符规则,一个?只匹配1个字符。
我要处理的那批文件,文件名全是英文的,
因此也不存在“1个字符可能是1字节,也可能是2字节、3字节等”造成的任何差异。

按“DOS命令文件名通配符规则”,那么我的那条copy命令,
只应该复制到220个文件名格式为 flag_XXX.png的文件,
不应该把 XXX后带 _l或_ll后缀的文件复制过去。

但是,复制结果,却是:
有一些把文件把一组中3个文件都复制了、有一些文件是只多复制了一个带后缀的;
更离谱的是,其中一个文件是符合规则的文件没有被复制!
所以它复制的文件总数不是220个,而是316个。

但这个“316个文件”,谁能解释清楚它是怎么搞的!!!
这M$的程序是不是越搞越倒退了?

#6


原因很简单, 如果文件名不是8.3, 那它会有一个只有8.3字符的短文件名, 这是为了兼容早先的系统.
你用 dir /X 就看到了,所以这个问题还有点麻烦.

#7


引用 6 楼 tcmakebest 的回复:
原因很简单, 如果文件名不是8.3, 那它会有一个只有8.3字符的短文件名, 这是为了兼容早先的系统.
你用 dir /X 就看到了,所以这个问题还有点麻烦.

我觉得应该不是这个原因。
如果是因为它匹配了“长文件名”对应的 8.3短文件名造成,那么就应该复制的是660个文件。
因为 flag_XXX.png 刚好把“8.3格式”的空间占完的,它的文件名带 _l 和 _ll 后缀的都是“长文件名”的文件。
并且,我也进入那个文件夹用你说的 dir /x 命令查看了一下,确认所有的“长文件名”都有一个相应的短文件名。

dir 命令带 /x 参数后,居然不能使用“文件筛选” …………  在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………
我只好将输出重定向到一个文本文件中,然后统计以 flag开头的文件名个数(这个文件夹*有两千多文件)。
确认了以 flag开头的“短文件名”项目有440条,再加上“标准8.3格式”220条,共660个文件无误。

#8


难道“大牛”真的在水区?
移到水区看看。  在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

在: CSDN > CSDN论坛 > VB 摆了两天,没有哪个网友来回复;
然后移到: CSDN > CSDN论坛 > Windows专区 > 一般软件使用
放了一周,就那两个回复,还是没说到点子上的。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#9


robocopy 源文件夹 目标文件夹 "flag_???.png" /XF "flag_???_*.png"

#10


vb没人回?赵老湿难道没有攻占vb板块?

#11


引用 9 楼 luciferisnotsatan 的回复:
robocopy 源文件夹 目标文件夹 "flag_???.png" /XF "flag_???_*.png"


我主要想不明白的是,按“理论上说”,我的那个copy命令,
flag_???.png 应该是只匹配那批文件中的220个文件。

它凭什么把本不该匹配的文件,去“匹配”了一部分?
  注意,是“匹配了一部分”,又不是全部匹配了!
这不是很扯蛋么…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

不知道赵老湿那几天怎么没回复我的帖子。
其实他是经常在VB版块逛的。

#12


引用 11 楼 Chen8013 的回复:
Quote: 引用 9 楼 luciferisnotsatan 的回复:

robocopy 源文件夹 目标文件夹 "flag_???.png" /XF "flag_???_*.png"


我主要想不明白的是,按“理论上说”,我的那个copy命令,
flag_???.png 应该是只匹配那批文件中的220个文件。

它凭什么把本不该匹配的文件,去“匹配”了一部分?
  注意,是“匹配了一部分”,又不是全部匹配了!
这不是很扯蛋么…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

不知道赵老湿那几天怎么没回复我的帖子。
其实他是经常在VB版块逛的。


赵老湿 是不是 休假了。

没试过这样copy 图片,



引用 4 楼 qq_36111921 的回复:
flag_XXX.png       xxx不限定_后面的数位

flag_*.png       才是不限定 位数吧?

#13


引用 11 楼 Chen8013 的回复:
Quote: 引用 9 楼 luciferisnotsatan 的回复:

robocopy 源文件夹 目标文件夹 "flag_???.png" /XF "flag_???_*.png"


我主要想不明白的是,按“理论上说”,我的那个copy命令,
flag_???.png 应该是只匹配那批文件中的220个文件。

它凭什么把本不该匹配的文件,去“匹配”了一部分?
  注意,是“匹配了一部分”,又不是全部匹配了!
这不是很扯蛋么…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

不知道赵老湿那几天怎么没回复我的帖子。
其实他是经常在VB版块逛的。

你dir的是flag*, copy的是flag_???  dir时,没有那个下划线呢?
另外,前半部分相似的文件多了,短文件名前5字节不一定是flag_。你dir /x看下结果吧,估计就是一部分的短文件名前面已经不是flag_了

#14


楼主先帮我在这个帖子
http://bbs.csdn.net/topics/392028122
随便回复一句断下贴。

#15


6楼说对了原因估计。
解决的办法供参考:
for /f %f in ('dir /b ^| findstr /R "^flag_...\.png"') do copy %f e:\pes_2017_cpk\flag

#16


引用 13 楼 luciferisnotsatan 的回复:
Quote: 引用 11 楼 Chen8013 的回复:

Quote: 引用 9 楼 luciferisnotsatan 的回复:

robocopy 源文件夹 目标文件夹 "flag_???.png" /XF "flag_???_*.png"


我主要想不明白的是,按“理论上说”,我的那个copy命令,
flag_???.png 应该是只匹配那批文件中的220个文件。

它凭什么把本不该匹配的文件,去“匹配”了一部分?
  注意,是“匹配了一部分”,又不是全部匹配了!
这不是很扯蛋么…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

不知道赵老湿那几天怎么没回复我的帖子。
其实他是经常在VB版块逛的。

你dir的是flag*, copy的是flag_???  dir时,没有那个下划线呢?
另外,前半部分相似的文件多了, 短文件名前5字节不一定是flag_。你dir /x看下结果吧,估计就是一部分的短文件名前面已经不是flag_了

看清楚点啊,我本来就不需要copy那种文件的。
我需要的是,只copy以flag_开头、接着是3个英文字母的,文件名总长刚好是8个字符的那220个文件。
那些“长文件名”,按理说是不应该匹配到 flag_???.png里面的。

我那儿执行 dir flag*.png ,是要得到那一批文件的清单,然后看一下它少复制了哪个“标准格式”的文件。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………
这儿带不带下划线,是没有关系的,以flag开头的png图片,只有那660个。

你说的“短文件名前5字节不一定是flag_”,刚才我看了一下,好像是那么一回事。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………
等会儿我有空处理一下文件清单,看看具体结果。

#17


引用 16 楼 Chen8013 的回复:
你dir的是flag*, copy的是flag_???  dir时,没有那个下划线呢?
另外,前半部分相似的文件多了, 短文件名前5字节不一定是flag_。你dir /x看下结果吧,估计就是一部分的短文件名前面已经不是flag_了

看清楚点啊,我本来就不需要copy那种文件的。
我需要的是,只copy以flag_开头、接着是3个英文字母的,文件名总长刚好是8个字符的那220个文件。
那些“长文件名”,按理说是不应该匹配到 flag_???.png里面的。

我那儿执行 dir flag*.png ,是要得到那一批文件的清单,然后看一下它少复制了哪个“标准格式”的文件。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………
这儿带不带下划线,是没有关系的,以flag开头的png图片,只有那660个。

你说的“短文件名前5字节不一定是flag_”,刚才我看了一下,好像是那么一回事。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………
等会儿我有空处理一下文件清单,看看具体结果。

我说的是,copy命令认的是短文件名,而flag_aaa_I被翻译成flag_a~1,不代表flag_azz_II被翻译成flag_a~9,可能被翻成了flag~999,当然具体转换规则我没研究过。所以你那660个文件里,会有316个匹配了flag_,剩下的那些,短名字的前5字符就不是flag_,匹配不上就不copy了。

这面这些数据,用flag_???能配上几个?
10/13/2016  09:46 AM                 0 FLA458~1.TXT flag_xxx - Copy (15).txt
10/13/2016  09:46 AM                 0 FLF5B2~1.TXT flag_xxx - Copy (16).txt
10/13/2016  09:46 AM                 0 FL4240~1.TXT flag_xxx - Copy (17).txt
10/13/2016  09:46 AM                 0 FLE1DE~1.TXT flag_xxx - Copy (18).txt
10/13/2016  09:46 AM                 0 FL29D8~1.TXT flag_xxx - Copy (19).txt
10/13/2016  09:46 AM                 0 FLAG_X~1.TXT flag_xxx - Copy (2).txt

#18


引用 16 楼 Chen8013 的回复:
Quote: 引用 13 楼 luciferisnotsatan 的回复:

Quote: 引用 11 楼 Chen8013 的回复:

Quote: 引用 9 楼 luciferisnotsatan 的回复:

robocopy 源文件夹 目标文件夹 "flag_???.png" /XF "flag_???_*.png"


我主要想不明白的是,按“理论上说”,我的那个copy命令,
flag_???.png 应该是只匹配那批文件中的220个文件。

它凭什么把本不该匹配的文件,去“匹配”了一部分?
  注意,是“匹配了一部分”,又不是全部匹配了!
这不是很扯蛋么…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

不知道赵老湿那几天怎么没回复我的帖子。
其实他是经常在VB版块逛的。

你dir的是flag*, copy的是flag_???  dir时,没有那个下划线呢?
另外,前半部分相似的文件多了, 短文件名前5字节不一定是flag_。你dir /x看下结果吧,估计就是一部分的短文件名前面已经不是flag_了

看清楚点啊,我本来就不需要copy那种文件的。
我需要的是,只copy以flag_开头、接着是3个英文字母的,文件名总长刚好是8个字符的那220个文件。
那些“长文件名”,按理说是不应该匹配到 flag_???.png里面的。

我那儿执行 dir flag*.png ,是要得到那一批文件的清单,然后看一下它少复制了哪个“标准格式”的文件。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………
这儿带不带下划线,是没有关系的,以flag开头的png图片,只有那660个。

你说的“短文件名前5字节不一定是flag_”,刚才我看了一下,好像是那么一回事。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………
等会儿我有空处理一下文件清单,看看具体结果。

我说的是,copy命令认的是短文件名,而flag_aaa_I被翻译成flag_a~1,不代表flag_azz_II被翻译成flag_a~9,可能被翻成了flag~999,当然具体转换规则我没研究过。所以你那660个文件里,会有316个匹配了flag_,剩下的那些,短名字的前5字符就不是flag_,匹配不上就不copy了。

 这面这些数据,用flag_???能配上几个?
10/13/2016  09:46 AM                 0 FLA458~1.TXT flag_xxx - Copy (15).txt
 10/13/2016  09:46 AM                 0 FLF5B2~1.TXT flag_xxx - Copy (16).txt
 10/13/2016  09:46 AM                 0 FL4240~1.TXT flag_xxx - Copy (17).txt
 10/13/2016  09:46 AM                 0 FLE1DE~1.TXT flag_xxx - Copy (18).txt
 10/13/2016  09:46 AM                 0 FL29D8~1.TXT flag_xxx - Copy (19).txt
 10/13/2016  09:46 AM                 0 FLAG_X~1.TXT flag_xxx - Copy (2).txt 

#19


flag_xxx - Copy (2).txt  这个转成了 FLAG_X~1.TXT
flag_xxx - Copy (15).txt 转成 了FLA458~1.TXT 

#20


用 dir /x 获取文件清单。
然后数据处理数据结果就是,长文件名转换成短文件名后,
仍然以 flag_开头的只有96个,其它的基本上是“面目全非”了。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

copy命令按短文件名进行匹配,96+220 = 316个。
luciferisnotsatan 说对了。
我在主贴中说的“有一个文件名格式符合要求的文件没有被复制”,应该是我删除文件时误删了。

TMD微软那帮孙子太欺骗人了…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

问题搞清楚了,结贴去。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#21


引用 19 楼 luciferisnotsatan 的回复:
flag_xxx - Copy (2).txt  这个转成了 FLAG_X~1.TXT
flag_xxx - Copy (15).txt 转成 了FLA458~1.TXT 

按我那批文件的短文件名清单来看,那个 ~后面的数字范围为1到4,
如果还有“名字相似”的,那个短文件名就明显变化了。

#22


引用 20 楼 Chen8013 的回复:
用 dir /x 获取文件清单。
然后数据处理数据结果就是,长文件名转换成短文件名后,
仍然以 flag_开头的只有96个,其它的基本上是“面目全非”了。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

copy命令按短文件名进行匹配,96+220 = 316个。
luciferisnotsatan 说对了。
我在主贴中说的“有一个文件名格式符合要求的文件没有被复制”,应该是我删除文件时误删了。

TMD微软那帮孙子太欺骗人了…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

问题搞清楚了,结贴去。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

robocopy实际用下来,感觉也挺坑的,感觉上file部分的对应还是短名,而/XF  这个exclude file用的却是长名。估计file部分为了兼容copy这个命令的行为,而/XF是新的flag,所以就不去兼容8.3格式了。反正windows的命令行功能一向是弱爆了的

我贴的例子只是其中一段,实际上我复制了几十次flag_xxx.txt

#23


findstr 竟然可以用正则,这样就扩展得无比厉害了,总算跟赵老四学到干货了

#24


引用 23 楼 sysdzw 的回复:
findstr 竟然可以用正则,这样就扩展得无比厉害了,总算跟赵老四学到干货了

都已经结贴了,你才来。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

没有“深入研究”过DOS命令,只会那些比较基础、浅显的用法。
现在也不想去深究它了。

以后我直接写一段代码进行文件复制操作,免得又被微软的那帮孙子坑了…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#25


引用 23 楼 sysdzw 的回复:
findstr 竟然可以用正则,这样就扩展得无比厉害了,总算跟赵老四学到干货了

在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………用脚后跟思考,也能猜出在CSDN技术论坛泡了十几年的赵老四手里的干货有多少!

#26


“一万小时定律”不是吃闲饭的! 在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#27


虽然15楼没有得分,但仍然遮不住其内容中的好几个亮点! 在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#28


引用 25 楼 zhao4zhong1 的回复:
Quote: 引用 23 楼 sysdzw 的回复:

findstr 竟然可以用正则,这样就扩展得无比厉害了,总算跟赵老四学到干货了

在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………用脚后跟思考,也能猜出在CSDN技术论坛泡了十几年的赵老四手里的干货有多少!
只是干货比例奇低!

#29


引用 28 楼 sysdzw 的回复:
Quote: 引用 25 楼 zhao4zhong1 的回复:

Quote: 引用 23 楼 sysdzw 的回复:

findstr 竟然可以用正则,这样就扩展得无比厉害了,总算跟赵老四学到干货了

在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………用脚后跟思考,也能猜出在CSDN技术论坛泡了十几年的赵老四手里的干货有多少!
只是干货比例奇低!

比例高的话还能被称之为“干货”吗?水发或油发之后变大不了多少?
金子不都是最后被淘出来的那么一丢丢吗?
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#30


引用 24 楼 Chen8013 的回复:
Quote: 引用 23 楼 sysdzw 的回复:

findstr 竟然可以用正则,这样就扩展得无比厉害了,总算跟赵老四学到干货了

都已经结贴了,你才来。
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

没有“深入研究”过DOS命令,只会那些比较基础、浅显的用法。
现在也不想去深究它了。

以后我直接写一段代码进行文件复制操作,免得又被微软的那帮孙子坑了…………
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

robocopy还是推荐用一用的。

#31


C:\> 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 的大写变量名
比较易读,而且避免与不分大小写的组合键混淆。

#32


引用 27 楼 zhao4zhong1 的回复:
虽然15楼没有得分,但仍然遮不住其内容中的好几个亮点! 在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

我KAO !
我不是按“某楼的回复”来给分的好不!
难道你觉得你在14楼的那个回复,有资格得分?
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

我主要看是谁的回复有实际价值,相应的分数给在那个人的头上罢了。
就算你15楼的回复“有亮点”,也偏题了。
我需要搞清楚的是我那次的copy命令为何跟我预期的结果不一样。

另外,象你31楼的那种回复,对我来说,纯粹就是属于灌水。
本来可以用一句话表达的,非要去 Ctrl+C 、Ctrl+V 来一大篇…………
床上等你 是不是按你回复内容的字数多少,给你结算工资啊???
在“命令提示符”下执行了一个copy命令复制一批文件,却出现了很扯蛋的结果…………

#33


C:\> 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 的文字用法
  \<xyz    字位置: 字的开始
  xyz\>    字位置: 字的结束

有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。

#34


处处留心皆学问
用空杯心态来学习

#35


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

下表将列出可用的句柄。

句柄      句柄的数字代号 描述
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 命令选择
的文件名(在命令提示符窗口中每次显示一屏)。有关筛选器命令的详细信息,请参阅
使用筛选器。

命令行解释器概述
命令行解释器是一个单独的软件程序,它可以在用户和操作系统之间提供直接的通讯。非图形命令行解释器用户界面提供运行基于字符的应用程序和实用程序的环境。通过使用类似于 MS-DOS 命令解释程序 Command.com 的单独字符,命令行解释器执行程序并在屏幕上显示其输出。Windows 服务器操作系统命令行解释器使用命令解释程序 Cmd.exe(该程序加载应用程序并指导应用程序之间的信息流动)将用户输入转换为操作系统可理解的形式。
可以使用命令行解释器创建和编辑可自动执行常规任务的批处理文件(也称作脚本)。例如,可以使用脚本自动管理用户帐户或夜间备份。还可以使用 Windows 脚本宿主 CScript 的命令行版本在命令行解释器中运行更高级的脚本。详细信息,请参阅运行 Windows 脚本宿主。通过使用批处理文件来执行操作,可比使用用户界面更有效率。批处理文件接受命令行上可用的所有命令。有关批处理文件和脚本的详细信息,请参阅使用批处理文件。
您可以自定义命令提示符窗口以易于查看并增强对程序运行方式的控制。有关自定义命令提示符窗口的详细信息,请参阅配置命令提示符。

使用命令语法
语法按命令及所带参数必须遵循的键入顺序出现。下面的 xcopy 命令示例显示了各种语法文本格式:

xcopy Source [Destination] [/w] [/p] [/c] [/v] [/q] [/f] [/l] [/g] [/d[:MM-DD-YYYY]] [/u] [/i] [/s [/e]] [/t] [/k] [/r] [/h] [{/a | /m}] [/n] [/o] [/x] [/exclude:File1[+[File2]][+[File3]] [{/y | /-y}] [/z]

下表说明如何解释不同的文本格式。

格式化图例
格式                                             含义
斜体                                             用户必须提供的信息
粗体                                             用户必须准确键入的要显示的元素
省略号(...)                                      在命令行中可多次重复的参数
中括号([])                                       可选项
大括号({});选项用竖线(|)分隔。例如:{even|odd}  用户必须从选项集合中选择一个
Courier字体                                      代码或程序输出

使用多个命令和条件处理符号
使用条件处理符号可以在单个命令行或脚本中运行多个命令。通过条件处理符号运行多个命令时,条件处理符号右边的命令根据条件处理符号左边命令的执行结果来发挥作用。例如,只有在前一个命令失败的情况下才可能需要运行一个新命令。或者,只有在前一个命令成功时才可能需要运行一个新命令。
可以使用下表列出的特殊字符来传递多个命令。

字符       语法                            定义
& [...]    Command1 & Command2             用来分隔一个命令行中的多个命令。Cmd.exe 运行第一个命令,然后运行第二个命令。
&& [...]   Command1 && Command2            只有在符号 && 前面的命令成功时,才运行该符号后面的命令。Cmd.exe 运行第一个命令,然后只有在第一个命令运行成功时才运行第二个命令。
|| [...]   Command1 || Command2            只有在符号 || 前面的命令失败时,才运行符号 || 后面的命令。Cmd.exe 运行第一个命令,然后只有在第一个命令未能运行成功(接收到大于零的错误代码)时才运行第二个命令。
( ) [...]  (Command1 & Command2)           用来分组或嵌套多个命令。
;或者,     Command1 Parameter1;Parameter2  用来分隔命令参数。

注意
“与”符号 (&)、管道符号 (|) 以及括号 () 是特殊字符,将它们作为参数传递时,必须在其前面加上转义字符 (^) 或引号。
如果某个命令成功完成操作,该命令就返回零 (0) 退出代码或不返回任何退出代码。有关退出代码的详细信息,请参阅 Microsoft Windows 部署和资源工具包。

嵌套命令行解释器
通过在命令提示符下打开新的 Cmd.exe 实例,可以在 Cmd.exe 内嵌套命令行解释器。默认情况下,Cmd.exe 的每个实例继承其父 Cmd.exe 应用程序的环境。通过嵌套 Cmd.exe 的实例,可以更改局部环境,而不会影响 Cmd.exe 的父应用程序。这使您能够保留 Cmd.exe 的原始环境,并在终止嵌套的命令行解释器之后返回到原始环境。但是在嵌套的命令行解释器中所做的更改将不会被保存。
要嵌套命令行解释器,请在命令提示符下键入:

cmd

出现类似于下面内容的消息:

Microsoft (R) Windows Server 2003 Standard Edition (TM)
(C) 版权所有 1985-2002 Microsoft Corp.
要关闭嵌套的命令行解释器,请键入 exit。

使用 setlocal 和 endlocal 命令,可以在 Cmd.exe 的实例中(或在脚本中)进一步将更改局部化。Setlocal 创建局部作用范围,而 endlocal 终止局部作用范围。在 setlocal 和 endlocal 作用范围内所做的更改将会被放弃,从而保持原始环境不变。这两个命令的嵌套最高可达到 32 级。有关 setlocal 和 endlocal 命令的详细信息,请参阅 Setlocal 和 Endlocal。

将环境变量与 Cmd.exe 一起使用
Cmd.exe 命令行解释器环境由确定命令行解释器和操作系统行为的变量进行定义。可以使用两种类型的环境变量(系统和局部)来定义命令行解释器环境或整个操作系统环境的行为。系统环境变量定义全局操作系统环境的行为。局部环境变量定义 Cmd.exe 当前实例环境的行为。
系统环境变量预置于操作系统之中,并可用于所有 Windows 服务器操作系统进程。只有具有管理凭据的用户才可以更改系统变量。这些变量最常用于登录脚本。
局部环境变量只有在创建变量时针对的目标用户登录到计算机时才有效。HKEY_CURRENT_USER 配置单元中设置的局部变量只对当前用户有效,但它们可定义全局操作系统环境的行为。

下表按优先顺序的降序描述变量的各种类型:
1.内置系统变量
2.在 HKEY_LOCAL_MACHINE 配置单元中找到的系统变量
3.在 HKEY_CURRENT_USER 配置单元中找到的局部变量
4.在 Autoexec.bat 文件中设置的所有环境变量和路径
5.在登录脚本(如果有的话)中设置的所有环境变量
6.在脚本或批处理文件中交互使用的变量

在命令行解释器中,Cmd.exe 的每个实例都继承其父应用程序的环境。因此,可以在不影响父应用程序环境的情况下更改新的 Cmd.exe 环境中的变量。
下表列出 Windows server operating system 的系统和本地环境变量。

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

设置环境变量
使用 set 命令创建、更改、删除或显示环境变量。set 命令只更改当前解释器环境中的变量。

要查看变量,请在命令提示符下键入:

set VariableName

要添加变量,请在命令提示符下键入:

set variablename=Value

要删除变量,请在命令提示符下键入:

set VariableName=

可以将大多数字符用作变量值,其中包括空格。如果使用特殊字符 <、>、|、& 或 ^,则必须在它们前面加上转义字符 (^) 或引号。如果使用引号,则必须将引号作为值的组成部分,因为等号后面的任何内容都会被视为值。请考虑下列示例:

要创建变量值 new&name,请键入:
set varname=new^&name

要创建变量值 "new&name",请键入:
set varname="new&name"

如果在命令提示符下键入 set varname=new&name,就会出现与下面内容类似的错误消息:
“'name' 不是内部或外部文件,也不是可运行的程序或批处理文件。”
变量名不区分大小写。但是,set 显示的变量与您键入的完全相同。可以在变量名中结合使用大写字母和小写字母,这样可以使代码更具有可读性(例如,UserName)。

注意

单个环境变量的最大大小为 8192 字节。
所有环境变量的大小总和(包括变量名和等号)最大为 65,536 KB。
替换环境变量值
要在命令行或脚本中启用变量值替换,请将变量名包括在百分号之中(即,%VariableName%)。使用百分号可以确保 Cmd.exe 引用变量值,而不是进行文字比较。为变量名定义变量值之后,请将变量名包括在百分号之中。Cmd.exe 搜索该变量名的所有实例,并用定义的变量值进行替换。例如,如果创建包含不同值(例如,用户名)的脚本,并且想要用这些值为每个用户定义 USERNAME 环境变量,可以使用包括在百分号之中的 USERNAME 来编写代码。运行此脚本时,Cmd.exe 将用变量值替换 %USERNAME%,这样就消除了为每个用户手动执行此任务的必要。变量替换是不可递归的。Cmd.exe 检查变量一次。有关变量替换的详细信息,请参阅 For 和 Call。