[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
  我也来补充几条:
1、
  1. for %i in (*.txt) do echo %i
复制代码
  以上语句不能检测到带隐藏属性的txt文件;
2、
  1. ren 10.pdf *2.c
复制代码
  10.pdf 被改成了什么?10.pdf2.c!具体分析请看这篇文章:http://www.cn-dos.net/forum/viewthread.php?tid=29538
3、
  cmd窗口中运行 for /?,找到一段话:
eol=c           - 指一个行注释字符的结尾(就一个)

  什么意思?是说如果要找到以c字符结尾的某行文字,只需要添加 eol=c 的限制就可以了么?试试运行如下代码:
  1. @echo off
  2. for /f "eol=c" %%i in (test.txt) do echo %%i
  3. pause
复制代码
测试文本test.txt的内容为:
;abc
cab
;cab
acb

  结果如何?居然是不显示第二行内容!
  第二行内容有什么规律?它是以字符 c 打头的。My God,天杀的瘟到死,居然把"忽略以字符c打头的行"给翻译成"忽略以字符c结尾的行"!
4、
  还是上面那个test.txt,代码还是上面那一个,不过去掉了引号内的限制,改成:
  1. @echo off
  2. for /f %%i in (test.txt) do echo %%i
  3. pause
复制代码
  结果,所有以分号打头的行都没显示出来。原来for语句暗含忽略以分号打头的行的功能,因为以分号打头的行在很多语言中都是作为注释语句。
5、
  1. @echo off
  2. for /f %%i in (test.txt) do (
  3.     set str=%%i
  4.     setlocal enabledelayedexpansion
  5.     echo !str!
  6. )
  7. pause
复制代码
  当test.txt内的行数超过32行时,第32行之后,每显示一行的内容,将报错一次:“已经达到最大的 setlocal 递归层。”,当在 echo 的下一句添加 endlocal 语句时,将不会报错。
5、
  1. set /p str=<test.txt
  2. echo %str%
复制代码
  获取 test.txt 第一行的内容,并赋予变量 str

6、
  1. findstr /v "$" test.txt
复制代码
  当 test.txt 最后一行不是空行的时候,将获取最后一行的内容,因为最后一行的字符在结尾处只含回车符号而不含换行符号(貌似是这样解释的吧?),而 $ 在findstr中的准确含义是"匹配回车+换行符号"。

7、
  1. set str=abc
  2. set /a num=%str%&&(echo %str% 是数字) || echo (%str%不是数字)
复制代码
  在SP2环境下,它是可以判断某一字符串是不是纯数字的(要求数字的范围在0~2^32-1这个范围内),但是,到了SP3下之后,这条语句已经不再适用,因为如果某一字符串不是数值,将 set /a num=%str% 之后,num的值将会被赋为0值。

8、
  1. set /a num1=123,num2=345
  2. echo %num1%
  3. echo %num2%
复制代码
  同时给两个变量赋予数值类型的值。如果其中某个变量的值不是数值,在SP2下将出错,在SP3下该变量的值为0。

9、
  1. @echo off
  2. for /f "delims=" %%i in ('type test.txt') do echo "%%i"
  3. pause
复制代码
  对一个追求代码极限简洁的狂热分子来说,type命令可能显得画蛇添足,但是,当你处理的test.txt是Unicode编码的时候,你将体会到什么叫不可或缺。当然,type也可以换成more,不过more在显示长文本的时候会分屏显示。

10、
  1. findstr "我 你" test.txt
复制代码
test.txt中有一行内容:
我 你 他

  上面的代码竟然不能查到这行内容!加上 /i 或 /r 参数,奇迹就会出现。难道这是 findstr 在查找以空格分隔的多个纯中文字符串的时候存在的bug?
1

评分人数

    • qzwqzw: 先把分加上,明天再细看PB + 30 技术 + 1
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

原帖由 qzwqzw 于 2010-4-19 14:49 发表
攒的真多啊
手忙脚乱了半天
才整理的差不多

以前碰到过很多诡异的情况,由于不善归纳整理,目前只是自己心知肚明,像楼主这样整理出来与人分享,是件功德无量的事情,值得大家学习。
第5条应该是笔误吧
set /p str=test.txt<nul
好像该是
set /p str=<test.txt

嘿嘿,一激动就写错了,已更改。
第6条表述有些小问题
那种情况下
最后一行既没有回车符0x0d,\r,也没有换行符0x0a,\n
而"获取最后一行的内容"应该是”不获取最后一行的内容“
改了

嗯,最后一行应该是同时没有回车符和换行符。不过我那条代码的执行结果和我的文字描述是吻合的,因为我使用了 /v 来排除回车换行符。
第8条没看出跟第7条有什么不同

第7条的重点是描述 set /a 在不同版本的系统上有不同的表现;而第8条描述是是多个数值赋值语句可以写成一行。
第9条的内容稍微改了一下加进去了
type支持unicode不算奇诡
cmd/u和type不兼容才算是奇诡

呵呵,我的本意是 for 语句不能直接读取Unicode编码的文本,需要借助type或more。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

原帖由 qzwqzw 于 2010-4-19 14:50 发表
另外现在帖子是按核心命令行的字母顺序排序
现在的条数越来越多
索引方式就有点乱了
更新起来也比较麻烦
大家有什么其它的好办法没有
最好是多种索引方式并行

  你在顶楼归纳的那4种情况其实就是一个大的分类啊,在这些分类下面,再按照字母顺序排下来就是了。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

原帖由 Batcher 于 2010-4-27 17:54 发表
顶楼内容里面的findstr /l不一定能够解决汉字“或”的问题,测试环境:XP SP3 Pro CS,测试结果:

C:\Test>type a.txt
我们
他们
123

C:\Test>findstr /l "我们 他们" a.txt

C:\Test>findstr /r "我们 他们" a.txt
我们
他们

C:\Test>findstr "我们.* 他们" a.txt
我们
他们

请注意,你这里使用的是 /l 而不是 /i,前者是按字符搜索的意思,后者是不区分大小写的意思。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

返回列表