[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
攒的真多啊
手忙脚乱了半天
才整理的差不多

第5条应该是笔误吧
set /p str=test.txt<nul
好像该是
set /p str=<test.txt

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

第8条没看出跟第7条有什么不同

第9条的内容稍微改了一下加进去了
type支持unicode不算奇诡
cmd/u和type不兼容才算是奇诡
天的白色影子

TOP

  我也来补充几条:
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: 先把分加上,明天再细看技术 + 1 PB + 30
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

因为帖子字数所限
现在主题帖暂时无法更新
楼上的两位兄弟别着急
我正在想办法
天的白色影子

TOP

原帖由 qzwqzw 于 2010-4-17 17:54 发表
变量延迟的特例我需要考虑一下
因为从我的理解
这些语法特性都可以理解
算不上“奇诡”
if defined 和 set /a因为都是在内部处理变量
而不是在预处理过程中处理
也就是说不需要使用变量扩展标记
所以天然具有变量延迟的特性

至于逗号表达式
这是set /a才能处理的特性
cmd的预处理过程
是把两个表达式理解为一句
而不是一个语句块
所以自然不可能延迟扩展变量
...
这个我同意,当初自学的时候,我绕了好大一个圈子才明白过来
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

数值比较溢出错误的问题

Winxp CMD 处理的数值范围 是 [-2^31, 2^31-1], 即使两个数值都在此范围内, 但它们进行 if 比较( 除仅仅只是相等或不相等 的比较) 时, 也可能发生溢出错误, 发生情形为两个数的差值的绝对值 大于或等于 2^31 时, 示例
  1. if 3 gtr -2147483645 (echo 3>-2147483645) else (echo 3<=-2147483645)
复制代码
显示结果为:
3<=-2147483645

更多请见: http://bbs.bathome.net/thread-7659-1-1.html
1

评分人数

    • qzwqzw: 谢谢你的提供,准备将if和for的限定分别加入 ...技术 + 1 PB + 30

TOP

回复 6楼 的帖子

变量延迟的特例我需要考虑一下
因为从我的理解
这些语法特性都可以理解
算不上“奇诡”
if defined 和 set /a因为都是在内部处理变量
而不是在预处理过程中处理
也就是说不需要使用变量扩展标记
所以天然具有变量延迟的特性

至于逗号表达式
这是set /a才能处理的特性
cmd的预处理过程
是把两个表达式理解为一句
而不是一个语句块
所以自然不可能延迟扩展变量

TOP

1,关于变量延迟的特例:
  1. @echo off
  2. set n=1&if defined n echo.定义了变量n,即变量n存在
  3. set/a n+=1,n=n+7
  4. echo.%n%
  5. pause
复制代码
对于 if defined 和 set/a ,不使用%或!括变量,无论是否开了变量延迟,变量本身都会被延迟扩展。如果换成其它写法,就需要开启变量延迟,如:
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=1&if not "!n!"=="" echo.定义了变量n,即变量n存在
  3. set/a n=%n%+1&set/a n=!n!+7
  4. echo.%n%
  5. pause
复制代码
2,关于表达式分隔符,:

以上面的批处理为例,是不可以写成:
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=1&if not "!n!"=="" echo.定义了变量n,即变量n存在
  3. set/a n=%n%+1,n=!n!+7
  4. echo.%n%
  5. pause
复制代码
即用,连起来的表达式,无论是否开了变量延迟,只要这个变量被用!括起来,!n!都不会动态扩展分隔符,前n的变化。
即 set/a n=%n%+1&set/a n=!n!+7 和 set/a n=%n%+1,n=!n!+7 并不等效;
set/a n=n+1,n=n+7set/a n=%n%+1,n=!n!+7 也不等效。
所以:在一个用分隔符 , 连起来的表达式中,!括变量并不能动态扩展该变量在,前的变化,去掉这个!才可以动态扩展该变量在,前的变化。

[ 本帖最后由 hanyeguxing 于 2010-4-17 15:39 编辑 ]
1

评分人数

    • qzwqzw: 谢谢提供,准备加入逗号表达式的部分技术 + 1 PB + 30
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

我也贡献个
  1. M:\世界之窗>echo.g>ttbb.ttbb
  2. M:\世界之窗>echo.g>ttbb.ttb
  3. M:\世界之窗>echo.g>ttbb.ttbbb
  4. M:\世界之窗>dir /b *.ttb
  5. ttbb.ttb
  6. ttbb.ttbb
  7. ttbb.ttbbb
复制代码
由此可见 cmd 识别扩展名只看前三位。扩展名小于等于3位是完全匹配,大于3位只匹配前三位
1

评分人数

    • qzwqzw: 谢谢参与,鼓励一下技术 + 1 PB + 30

TOP

“〇”算不上特殊字符,但在936代码页(默认),xp sp3系统下,if 会认定该字符为空。
http://bbs.bathome.net/viewthrea ... ight=%2Bhanyeguxing
  1. @echo off
  2. if "〇"=="" (echo 〇为空)else echo 〇不为空
  3. if "12〇34"=="1234" (echo 相同)else echo 不同
  4. if 12〇34==1234 (echo 相同)else echo 不同
  5. pause
复制代码
1

评分人数

    • qzwqzw: 谢谢参与,已加入技术 + 1 PB + 30
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

在不考虑 4 楼所述 短横线 单引号 在 if 字符串比较中的问题时, if 字符串比较时, ASCII 字符的大小也不是按 ASCII 字符代码值来排序的, 我也从未找到过相关的官方文档说明, 我对其次序作了一个初步的分析: http://bbs.bathome.net/thread-6851-1-1.html
1

评分人数

    • qzwqzw: 感谢参与,已加入技术 + 1 PB + 30

TOP

补充一个字符串比较中的问题, 关键是比较时对 短横线 - 和 单引号 ' 的处理问题
  1. if "e" leq "-" (echo 小于) else echo 大于
复制代码
显示的是 大于, 表明 字母 e 是大于短横线 - 的
那么, 字符串 "ef" 也应该是大于 "-f" 的, 可是其实不然
  1. if "ef" leq "-f" (echo 小于) else echo 大于
复制代码
显示的却是 小于
上面所述中, 将短横线换作单引号也得到同样结果, 究竟含有 短横线 或 单引号 的字符串在比较时是如何处理的?
我对此问题的分析和猜测请见: http://bbs.bathome.net/thread-6853-1-1.html
1

评分人数

    • qzwqzw: 感谢提线索,已加入技术 + 1 PB + 10

TOP

返回列表