中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-25 18:50
共 47,813 主题排行 / 349,918 发帖 / 今日 0 篇 / 48,275 会员排行
DOS批处理 & 脚本技术(批处理室) » 碰到个for和管道命令组合的诡异问题(原因找到,机理未名)
可打印版本  2,131 / 16
第1楼 picat 发表于 2007-08-24 17:31
初级用户 发帖 68 积分 150
碰到个for和管道命令组合的诡异问题(原因找到,机理未名)
建了一个脚本,名为JobTime.vbs,代码如下:

作用是生成当前整点时间往后的2个时间点,步长为30分钟。
然后用P处理生成2个时间点的任务计划,并且检查是否成功,代码如下:

前面没有任何问题,问题就在检查成功与否的这一个for循环中,运行到这一步就提示:


但是我把echo off 改成 echo on,发现它生成的命令都是正确的,比如:


我把它们复制(AT |find /I "C:\job.bat" |find "星期五" |find "18:00" )下来单独运行也没有问题,
如:

能够正确的找到,百思不得其解。

把AT换成dir命令(比如dir ^|find "C:\test.bat"),倒是可以运行,但是得到的结果格式和预期的也不一样。预期的结果应该是符合find条件的一行,但实际运行下来的结果是这样的:

这个是不是又跟dos的某个机制有关的?希望大家给点意见,谢谢!

[ Last edited by picat on 2007-8-24 at 10:14 PM ]
第2楼 picat 发表于 2007-08-24 18:03
初级用户 发帖 68 积分 150
补充一下,我的环境是windows XP SP2 Proffessional中文版,cmd模式

然后我换了个方法,把检查的语句顺序换了一下:

诡异的事情又来了,得到的结果居然是这样的:

命令都对,也都执行了,但是出来的结果却是把生成的2个时间的任务都找出来了,似乎|find没有起到作用......

[ Last edited by picat on 2007-8-24 at 06:05 PM ]
第3楼 slore 发表于 2007-08-24 18:30
铂金会员 发帖 2,478 积分 5,212
@echo off
c:
cd\
for /f "tokens=1,2 delims=," %%i in ('cscript //nologo JobTime.vbs') do (
AT %%j /every:%%i "c:\job.bat"
AT |find /I "C:\job.bat" |find "%%i" |find "%%j"
)
pause

你看看?

你的VBS有问题哦~如果现在是23点,你设置数量是2个点得到的第2个 0:00你看是星期几?
第4楼 picat 发表于 2007-08-24 21:23
初级用户 发帖 68 积分 150
slore你说的对,我改了一下:


不过这个貌似下标越界的代码居然可以正常运行...,今天尽碰到怪事了。
第5楼 picat 发表于 2007-08-24 21:28
初级用户 发帖 68 积分 150
还有你上面的P代码我也测试过了,还是同样的问题:
无效的命令。

AT 命令安排在特定日期和时间运行命令和程序。
要使用 AT 命令,计划服务必须已在运行中。
以下省略......
第6楼 slore 发表于 2007-08-24 21:29
铂金会员 发帖 2,478 积分 5,212
哪里下标越界了?
第7楼 picat 发表于 2007-08-24 21:34
初级用户 发帖 68 积分 150
Originally posted by slore at 2007-8-24 21:29:
哪里下标越界了?


在这儿:
For n = 1 To intCount --假设intcount=16

我前面
ReDim strTime(intCount)
ReDim strWeekDay(intCount)
ReDim strDaySerial(intCount)

那么下标应该是从0-15吧,可我WScript.Echo strWeekday(n) & "," & strTime(n)这个n从1-16

[ Last edited by picat on 2007-8-24 at 09:55 PM ]
第8楼 slore 发表于 2007-08-24 21:36
铂金会员 发帖 2,478 积分 5,212
intcount=16

数组里写16不是个数,是上界……没有使用To,下界用默认的0开始……
所以是0到16

1-16属于0-16的范围……
第9楼 slore 发表于 2007-08-24 21:38
铂金会员 发帖 2,478 积分 5,212
=。=说到VB去了……VBS里没有To……只能从0开始……
第10楼 picat 发表于 2007-08-24 21:41
初级用户 发帖 68 积分 150
Originally posted by slore at 2007-8-24 21:36:
intcount=16

数组里写16不是个数,是上界……没有使用To,下界用默认的0开始……
所以是0到16

1-16属于0-16的范围……


晕了,一直以为dim里的数字是个数...,好像是跟以前学的哪个语言搞混了...
第11楼 picat 发表于 2007-08-24 21:44
初级用户 发帖 68 积分 150
slore,你觉得上面的P代码,可能的问题在哪里啊?感觉上跟|find有关,但又只在说不出问题在哪里.......
第12楼 slore 发表于 2007-08-24 21:54
铂金会员 发帖 2,478 积分 5,212
P我已经给你改过了啊……你运行我写的代码看看啊
第13楼 picat 发表于 2007-08-24 21:59
初级用户 发帖 68 积分 150
不好意思,刚才运行确实可以了,之前一次不知道哪里搞错了。但我觉得你的P代码跟我的没有实质性的区别啊,能告诉我什么原因吗?
第14楼 picat 发表于 2007-08-24 22:06
初级用户 发帖 68 积分 150
发现了,问题在转义字符^上,我把原先的P代码改成:


去掉里面的^就可以正常运行了......
但是P代码里用到管道|不是需要^来转义的?.......晕死。这应该又是DOS的某个特殊点......,而且有^和没有^生成的命令都是一样的(至少看起来一样),但一个正常运行一个就不行.......

[ Last edited by picat on 2007-8-24 at 10:08 PM ]
第15楼 slore 发表于 2007-08-24 22:25
铂金会员 发帖 2,478 积分 5,212
你是要当字符串麽?转义?
你是要执行呀……转义干什么
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023