Board logo

标题: [已结]请教关于random变量的用法 [打印本页]

作者: g4rr     时间: 2007-1-24 16:54    标题: [已结]请教关于random变量的用法

今天在这里看了太多精品,兴奋得睡不着觉.突然想到一个问题.是关于RANDOM变量的用法的.上网百了一下找不到,G了一下也没找到.想想应该不是很幼稚的问题,所以才敢再请教各位前辈们.先谢谢啦.....

首先,说一下自己对"random"的理解.他是WINDOWS中的一个变量,在DOS下可用
%random%的形式像调用%USERNAME%一样调用它,可列出界于0 和 32767之间的随机十进制数,是吗?

问题1: 一文件夹里面有1~20为文件名的TXT文件(1.TXT到20.TXT),我想在这20个文件中随机调用一个该怎么写批处理?

问题2: 如果这个文件夹中的20个文件的文件名是中文的(同样是TXT),又该如何随机调用一个TXT?

首先,谢谢大家的热心帮忙.
这两天发现一个新问题:
在某一文件夹中随机选择一个文件的时候,如果此批处理也在其中,也有可能被选中,如何把批处理自身排除在外?
(假设文件夹中有很多类型的文件,包括其他批处理文件; 同时,规定此批处理一定要在其中)

再有:如果有其他几个文件也想排除在随机之外,怎么做?(文件名可用*.*代替)
怎么实现呢?谢谢!

[ Last edited by HAT on 2008-10-27 at 11:29 ]
作者: qjbm     时间: 2007-1-24 17:43
问题1:
@ECHO  OFF
SETLOCAL ENABLEDELAYEDEXPANSION

set /a na=%random%%%20+1 & start !na!.txt
问题2:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

set /a na=%random%%%20+1,n=0
for /f "tokens=*" %%i in ('dir /b') do (set /a n+=1 & if !na!==!n! start %%i)

作者: PPdos     时间: 2007-1-24 18:15
问题1:
for /f %%i in ('set /a %random%%%20+1') do start %%i.txt
问题2:
@echo off
setlocal enabledelayedexpansion
for /f %%i in ('dir/b') do (
                        set /a Num+=1
                        set !Num!=%%i
)
for /f %%i in ('set /a %random%%%20+1') do start !%%i!
pause>nul
[ Last edited by PPdos on 2007-1-24 at 06:08 AM ]
作者: qjbm     时间: 2007-1-24 18:20
PPdos

set /a %random%%%20

是正规语法吗??能解释一下吗?(已结)  set expression

------------------
%random%%%20  ==0 时?????
------------------

[ Last edited by qjbm on 2007-1-24 at 05:26 AM ]
作者: PPdos     时间: 2007-1-24 18:33
楼上已发 恕小弟不知! 1 该加
作者: ccwan     时间: 2007-1-24 21:57
我来凑个热闹,楼主第二个问题可以不用延迟变量解决的。
set/a a=%random%%%20+1
for /f "tokens=1,2 delims=:" %%i in ('dir/b ^|findstr /n .*') do (if "%%i"=="%a%" start %%~fsj)
变动一点,支持带空格的文件名

[ Last edited by ccwan on 2007-1-24 at 10:12 PM ]
作者: g4rr     时间: 2007-1-25 04:34
哈..大家都这么早起床的啊?

谢谢!可以作一点点说明吗?或者哪里有这些变量用法的资料给个链接好吗?
作者: g4rr     时间: 2007-1-25 05:12
找了一些相关文章了.因为刚来,环境还不熟悉呢...

再一次谢谢各位..
作者: lzmyst     时间: 2007-1-25 05:41
原来只知道这只是一个随机,没想过应用,现在看了这贴,原来可以这样。
作者: qjbm     时间: 2007-1-25 07:24
6 F ccwan

在问题2 中,描述文件名为中文,则有可能不带标号.

请问在贵代码中如何

"%%i"=="%a%" ???
作者: ccwan     时间: 2007-1-25 21:15
re qjbm

看来兄对findstr命令不熟悉,dir/b ^|findstr /n .*' 命令将dir出来的文件传递给findstr命令,/n参数用来给每一行添加行号,类似这样



也就是说,并非利用文件名内的数值,而是另行添加的行号数字。
你可以在命令行下输入 findstr/? 来查看findstr命令的用法。
作者: qjbm     时间: 2007-1-26 13:16
ccwan

三人行,必有吾师
作者: g4rr     时间: 2007-1-28 07:03
这两天发现一个新问题:
在某一文件夹中随机选择一个文件的时候,如果此批处理也在其中,也有可能被选中,如何把批处理自身排除在外?
(假设文件夹中有很多类型的文件,包括其他批处理文件; 同时,规定此批处理一定要在其中)
怎么实现呢?谢谢!

为了方便,已修改至原贴.请看原帖,谢谢

[ Last edited by g4rr on 2007-1-27 at 08:36 PM ]
作者: redtek     时间: 2007-1-28 08:33
列文件名,不显示 “自己”(但假定批处理的扩展名是 .Bat 而不是 .CMD)。
@echo off



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

pause
根据ccwan兄的发现与namejm兄的原理剖析和方法,上面代码在处理查找含有空格的文件名与含有空格文件名部分同名的文件时会出错,修改如下:
@echo off



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

pause
增加了 /c:参数,将含有空格的字符串让 Findstr 理解为它们是一个不可分割的整体~:)


详见原理见第16楼、17楼~:)

[ Last edited by redtek on 2007-1-28 at 10:19 AM ]
作者: ccwan     时间: 2007-1-28 21:37
redtek兄的代码很简洁、精彩。欣赏~~

经过测试,dir/b|findstr  /i  /v "%~0"|findstr /n .*也能成功,挺有意思^_^
作者: ccwan     时间: 2007-1-28 21:45
呵呵,最新发现:我的桌面上有 ”新建 批处理.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
运行前者结果:


运行后者结果:


竟然这样:前者可以识别后者,后者不能识别前者。有意思吧
作者: namejm     时间: 2007-1-28 23:08
  其实,这个是 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 ]
作者: redtek     时间: 2007-1-28 23:11
哈哈……这个好玩~:)

经打开 @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 要滤掉目标,而正在这两个批处理的文件名都含有 “新建” 这个检索的成功条件,结果就被滤掉了。

将文件名改名,去掉中间空格以后,搜索正确,就推断就上面因素~:)
作者: ccwan     时间: 2007-1-28 23:23
谢谢两位的精彩解释。
看来若要命令成功执行,要保证该批处理名称中尽量不要包含空格才行。

[ Last edited by ccwan on 2007-1-28 at 11:24 PM ]
作者: namejm     时间: 2007-1-28 23:29
  名称中带空格也是可以的,解决办法:
  一、如我在17楼所说的,要给findstr加上 /c: 开关;
  二、把 findstr 换成 find。
作者: g4rr     时间: 2007-1-29 06:37


  Quote:
Originally posted by ccwan at 2007-1-24 08:57 AM:

[code]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 ]
作者: g4rr     时间: 2007-1-29 06:50
namejm的解说真好.明白了!谢谢


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

[ Last edited by g4rr on 2007-1-28 at 05:54 PM ]
作者: hxmupdata     时间: 2007-3-14 22:50


  Quote:
Originally posted by g4rr at 2007-1-28 17:50:
namejm的解说真好.明白了!谢谢


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

同上.................................
作者: jmz573515     时间: 2007-3-15 11:37
留个记号,以后研究...
作者: wudixin96     时间: 2007-4-4 01:27
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 ]
作者: yulei     时间: 2009-2-17 20:05
哈哈,不错!个个高手