找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: qzwqzw

[其他] [50条]不能说的秘密-CMD命令奇诡语法特性汇集

[复制链接]
发表于 2010-4-20 20:19:51 | 显示全部楼层
我记得 dir *b*.txt

用*x*来匹配含X的文件名好像有BUG 有时会列出一些不含X的文件名  
  具体例子不记得了
发表于 2010-4-20 20:30:42 | 显示全部楼层
原帖由 随风 于 2010-4-20 20:13 发表
又发现一个奇诡的问题
以下代码,不管是否存在a.txt都无法正确运行,把rem 换成其它的命令则可以,或去掉最外面的一对括弧也可以。@echo off
(for /f %%f in (a.txt) do echo.123&rem abc)
pause

因为)成了rem的一部分,所以for前的(就孤立了
例如:
  1. for /f %%f in (a.txt) do echo.123&rem abc&echo.这个不显示
复制代码

[ 本帖最后由 hanyeguxing 于 2010-4-20 20:33 编辑 ]

评分

参与人数 1PB +5 收起 理由
随风 + 5 我怎么这都没想到呢。

查看全部评分

发表于 2010-4-20 20:35:42 | 显示全部楼层

回复 32楼 的帖子

          是哦
发表于 2010-4-20 21:30:19 | 显示全部楼层
  1. if exist C:\a.txt
复制代码
不能直接判断C:\a.txt是文件还是文件夹,这个算吗?
发表于 2010-4-20 21:36:58 | 显示全部楼层
  1. ipconfig >a.txt
复制代码
XP系统里面行尾会多出一个CR,Vista、Win7系统里面没有这个问题,这个算不?
 楼主| 发表于 2010-4-20 21:43:21 | 显示全部楼层
34楼这个按说不算
if  exist没有义务为你判断是文件还是目录
不过可以用以下两个办法判断目录
if exist %1\. echo %1是目录
if exist %1\nul echo %1是目录
这两个可以算

35楼内容之前就已经添加了
搜索一下主题的ipconfig
发表于 2010-4-20 21:51:32 | 显示全部楼层
  1. set /p test=<test.txt
复制代码
要不要注明一下这个方法最多只能读取1024字节?

评分

参与人数 1PB +30 收起 理由
qzwqzw + 30 是需要加入

查看全部评分

发表于 2010-4-20 21:59:15 | 显示全部楼层
双引号, 空格对 set 输出和变量识别的影响
详见 http://bbs.bathome.net/thread-7696-1-1.html
一. 半角双引号, 半角空格, 全角空格都可能导致变量名不能被 set 正常识别(其中部分原因和下面第二条有关)
二. 以下情形可以显示每个驱动器下的最后工作目录(排在空 set 命令显示的环境变量信息之前):
  1. set 后面是一个或若干个全角空格(可以紧跟)
  2. set 后面是一个双引号(不能紧跟) 或 一对半角双引号 " (一对双引号中间可以含有若干个半角或全角空格)

评分

参与人数 1PB +30 技术 +1 收起 理由
qzwqzw + 30 + 1 非常不错的总结,考虑更新首帖的相关内容

查看全部评分

发表于 2010-4-20 22:01:55 | 显示全部楼层
是不是需要把findstr的最后行问题在补充的详细一些?
http://www.bathome.net/viewthrea ... amp;page=2#pid32098

要不要介绍一个这个多余的空格?
http://www.bathome.net/viewthrea ... amp;page=4#pid28166
http://www.bathome.net/viewthrea ... amp;page=2#pid35901

评分

参与人数 1PB +30 技术 +1 收起 理由
qzwqzw + 30 + 1 好的提议,正在考虑加入

查看全部评分

发表于 2010-4-20 23:15:16 | 显示全部楼层

也来添加个

代码:

  1. @ECHO OFF
  2. FOR /F "DELIMS=" %%A IN ('MORE +7^<%~FS0') DO ECHO %%A
  3. PAUSE>NUL
  4. COPY %0 TEST.TXT>NUL
  5. MORE +7<"TEST.TXT"
  6. PAUSE>NUL
  7. EXIT
  8. ;忽略1

  9. ;忽略2

  10. 忽略 ";" 开头的行和空行

复制代码


尚不清楚是FOR命令还是MORE,还是管道符的作用....

评分

参与人数 1PB +10 收起 理由
qzwqzw + 10 可以确认是FOR的默认eol所致,参照主题帖

查看全部评分

发表于 2010-4-20 23:22:47 | 显示全部楼层
新发现半角逗号 "," 也对 set 命令有影响, 用逗号作参数也可 set, 来输出各驱动器的最后工作目录, 对 set 命令变量识别的影响也和 38楼所述相同或相似

set, 可以显示工作目录, 让人想起了 dos 下, 逗号可以加强 dir 命令

[ 本帖最后由 neorobin 于 2010-4-20 23:26 编辑 ]
发表于 2010-4-20 23:25:49 | 显示全部楼层
原帖由 lxzzr 于 2010-4-20 23:15 发表
代码:

@ECHO OFF
FOR /F "DELIMS=" %%A IN ('MORE +7^<%~FS0') DO ECHO %%A
PAUSE>NUL
COPY %0 TEST.TXT>NUL
MORE +7<"TEST.TXT"
PAUSE>NUL
EXIT
;忽略1

;忽略2

忽略 ";" 开头的行和空行



尚不清楚是FOR命令还是MORE,还是管道符的作用.. ...

for的作用,例如,你在for里强制eol= 为空格,就可以看到;的内容了。
(俺错了,偷偷改过,嘿嘿)

[ 本帖最后由 hanyeguxing 于 2010-4-20 23:36 编辑 ]

评分

参与人数 1PB +10 收起 理由
qzwqzw + 10 无法强制设置eol为空,参考首帖

查看全部评分

 楼主| 发表于 2010-4-21 10:34:35 | 显示全部楼层

回复 39楼 的帖子

多余空格的问题已基本确认
应该是CMD预处理括号对()和管道符时插入的
请看以下示例
D:\>(echo.abc) > 1.txt

D:\>echo.abc|more>2.txt

D:\>(echo.abc)|more>3.txt

只有3.txt有空格
而1.txt,2.txt都没有
这说明CMD的预处理在做语句的词法切分时
为了方便以后的预处理识别)和|这些转义字符
而特意在这些字符前后插入一个空格
同时也会把多余的空格去除

这种增减空格的现象
在不含echo off的批处理中可以看到很多

比如以下的用法
  1. (echo test)
  2. (echo.test)
  3. echo test|more
  4. echo.test|more
  5. (echo test)> a.txt
  6. (echo.test) > a.txt
  7. echo.test|more>b.txt
  8. (echo.test)|more>c.txt
复制代码
D:\>(echo test )
test

D:\>(echo.test)
test

D:\>echo test&#160;&#160;| more
test


D:\>echo.test | more
test


D:\>(echo test ) 1>a.txt

D:\>(echo.test) 1>a.txt

D:\>echo.test | more1>b.txt

D:\>(echo.test)&#160;&#160;| more1>c.txt

[ 本帖最后由 qzwqzw 于 2010-4-21 10:39 编辑 ]
发表于 2010-4-27 17:54:32 | 显示全部楼层
顶楼内容里面的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
我们
他们
 楼主| 发表于 2010-4-28 14:39:51 | 显示全部楼层
findstr 匹配多个中文串的问题比较棘手
目前找不到问题的实质原因
所以我在顶楼也只是含糊其辞
如果有更多的测试和证据
足以让人判断其问题的源头
那么我可以考虑更新一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:50 , Processed in 0.025266 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表