中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-14 21:00
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]请教关于random变量的用法
16 发表于 2007-01-28 21:45 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
UID 63486
来自 河北廊坊
状态 离线
呵呵,最新发现:我的桌面上有 ”新建 批处理.bat“ 和 “新建 批处理(2).bat”这两个文件,前者代码
@echo off



dir/b|findstr /i /v "%~0"|findstr /n .*

pause


后者代码
@echo off



dir/b|findstr /i /v "%~n0.bat"|findstr /n .*

pause


运行前者结果:


运行后者结果:


竟然这样:前者可以识别后者,后者不能识别前者。有意思吧
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
redtek +5 2007-01-28 23:12
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
17 发表于 2007-01-28 23:08 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  其实,这个是 findstr "字符串1+空格+字符串2+空格+字符串3+空格……" 语句的一个重要特点,那就是:只要找到引号内以空格分隔的任意一个字符串,findstr就认为找到了匹配的字符串,比如如下代码:

@echo off
findstr "abc 123 xyz" test.txt
pause

  test.txt的内容分别用abc、123、xyz或它们的组合abc123、123xyz等来测试,你会发现以上代码的执行结果始终显示test.txt的内容。

  如果要查找字符串 "abc 123 xyz"(不包括前后引号) ,那么,就得加上 /c: 开关,变成 findstr /c:"abc 123 xyz" test.txt 了。

[ Last edited by namejm on 2007-1-28 at 10:27 AM ]
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
redtek +5 2007-01-28 23:12
ccwan +5 2007-01-28 23:15
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
18 发表于 2007-01-28 23:11 ·  中国 北京 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
UID 63324
性别 男
状态 离线
哈哈……这个好玩~:)

经打开 @echo on 之后发现与 Findstr 有关:

运行下面的代码(文件名为: “新建 批处理(2).bat” ):


@echo on
::off



dir/b|findstr /i /v "%~n0.bat"|findstr /n .*

pause




开启 @echo on ,运行代码过程:


dir/b | findstr /i /v "新建 批处理(2).bat" | findstr /n .*
 ……
 ……



发现上面被 Findstr 搜索的文件名 “新建 批处理(2).bat” 是一个中间含有空格的文件名,而这个含有空格的文件名也是要被 Findstr 搜索的字符串。

但是, Findstr 的特性是 “字符串A 字符串B” 虽然它们在同一个引号范围之内,但是 Findstr 的特性是会将它们理解为要同时搜索满足上面两个条件,即:只要含有“字符串A”或是含有“字符串B”,那么都符合 Findstr 要搜索的目标。

而将上面引号中的要搜索的文件名正好有空格,所以 Findstr 理解为:查找 “新建” 或是含有 “批处理(2).bat” 的字符串就满足条件,再加上 /V 要滤掉目标,而正在这两个批处理的文件名都含有 “新建” 这个检索的成功条件,结果就被滤掉了。

将文件名改名,去掉中间空格以后,搜索正确,就推断就上面因素~:)
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
ccwan +5 2007-01-28 23:15
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
19 发表于 2007-01-28 23:23 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
UID 63486
来自 河北廊坊
状态 离线
谢谢两位的精彩解释。
看来若要命令成功执行,要保证该批处理名称中尽量不要包含空格才行。

[ Last edited by ccwan on 2007-1-28 at 11:24 PM ]
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
20 发表于 2007-01-28 23:29 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  名称中带空格也是可以的,解决办法:
  一、如我在17楼所说的,要给findstr加上 /c: 开关;
  二、把 findstr 换成 find。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
21 发表于 2007-01-29 06:37 ·  中国 广东 广州 电信
初级用户
积分 68
发帖 32
注册 2007-01-24 04:00
UID 77490
性别 男
来自 广东潮州
状态 离线
Originally posted by ccwan at 2007-1-24 08:57 AM:

set/a a=%random%%%20+1
for /f "tokens=1,2 delims=:" %%i in ('dir/b ^|findstr /n .*') do (if " ...


为什么会有一个^呢?
在批处理中就得用^,在命令符下就不用.能给个链接吗?ccwan兄
我找不到相关的说明

[ Last edited by g4rr on 2007-1-28 at 05:40 PM ]
22 发表于 2007-01-29 06:50 ·  中国 广东 广州 电信
初级用户
积分 68
发帖 32
注册 2007-01-24 04:00
UID 77490
性别 男
来自 广东潮州
状态 离线
namejm的解说真好.明白了!谢谢


感觉得出大家对批处量的着迷程度了...为了一点小问题都可以这样讨论着.越来越喜欢这种气氛了.
可惜,目前来说我只能作为一个旁边者去感觉你们的激情并兴奋着.而还不能参与到讨论当中.
我会努力成为你们一员的..
谢谢你们.ccwan,namejm,redtek

[ Last edited by g4rr on 2007-1-28 at 05:54 PM ]
23 发表于 2007-03-14 22:50 ·  中国 江苏 南京 电信
初级用户
积分 76
发帖 39
注册 2007-03-09 06:54
UID 81169
性别 男
状态 离线
Originally posted by g4rr at 2007-1-28 17:50:
namejm的解说真好.明白了!谢谢


感觉得出大家对批处量的着迷程度了...为了一点小问题都可以这样讨论着.越来越喜欢这种气氛了.
可惜,目前来说我只 ...

同上.................................
狐狸喜欢狡猾。。
24 发表于 2007-03-15 11:37 ·  中国 辽宁 本溪 联通
银牌会员
★★★
积分 1,212
发帖 464
注册 2006-12-13 21:11
UID 73417
性别 男
状态 离线
留个记号,以后研究...
25 发表于 2007-04-04 01:27 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,928
发帖 931
注册 2007-01-06 11:46
UID 75624
性别 男
状态 离线
set/a a=%random%%%20+1
for /f "tokens=1,2 delims=:" %%i in ('dir/b ^|findstr /n .*') do (if "%%i"=="%a%" start %%~fsj)

不需要变量延迟吗???


已经明白了。谢谢lxmxn

[ Last edited by wudixin96 on 2007-4-4 at 01:49 AM ]
26 发表于 2009-02-17 20:05 ·  中国 广东 东莞 电信
新手上路
积分 1
发帖 1
注册 2009-02-16 18:06
UID 139007
性别 男
来自 携享家园
状态 离线
哈哈,不错!个个高手
论坛跳转: