中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 碰到个for和管道命令组合的诡异问题(原因找到,机理未名)
« [1] [2] »
作者:
标题: 碰到个for和管道命令组合的诡异问题(原因找到,机理未名) 上一主题 | 下一主题
picat
初级用户





积分 150
发帖 68
注册 2007-4-26
状态 离线
『楼 主』:  碰到个for和管道命令组合的诡异问题(原因找到,机理未名)

建了一个脚本,名为JobTime.vbs,代码如下:
Option Explicit
Dim n
Dim intCount

intCount = 2

ReDim strTime(intCount)
ReDim strWeekDay(intCount)
ReDim strDaySerial(intCount)



strTime(0) = FormatDateTime(TimeValue(TimeSerial(Hour(Now),30,0)),vbShortTime)
strWeekDay(0) = WeekdayName(Weekday(Now))
strDaySerial(0) = Now

For n = 0 To intCount-1
        strTime(n+1)=Timevalue(strTime(n))+ TimeSerial(0,30,0)
        strTime(n+1)= FormatDateTime(strTime(n+1),vbShortTime)
        strDaySerial(n+1) = strDaySerial(n) + TimeSerial(0,30,0)
        strWeekDay(n+1) = WeekdayName(Weekday(strDaySerial(n+1)))
        WScript.Echo strWeekday(n) & "," & strTime(n)
next
作用是生成当前整点时间往后的2个时间点,步长为30分钟。
然后用P处理生成2个时间点的任务计划,并且检查是否成功,代码如下:
@echo off

c:

cd\


for /f "tokens=1,2 delims=," %%i in ('cscript //nologo JobTime.vbs') do (AT %%j /every:%%i "c:\job.bat")

@rem 检查成功与否

for /f "tokens=1,2 delims=," %%i in ('cscript //nologo JobTime.vbs') do (
AT ^|find /I "C:\job.bat" ^|find "%%i" ^|find "%%j"
)

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

AT 命令安排在特定日期和时间运行命令和程序。
要使用 AT 命令,计划服务必须已在运行中。

AT [\\computername] [ [id] [/DELETE] | /DELETE [/YES]]
AT [\\computername] time [/INTERACTIVE]
    [ /EVERY:date[,...] | /NEXT:date[,...]] "command"
以下省略......
但是我把echo off 改成 echo on,发现它生成的命令都是正确的,比如:
C:\>(AT |find /I "C:\job.bat" |find "星期五" |find "18:00" )
无效的命令。

AT 命令安排在特定日期和时间运行命令和程序。
要使用 AT 命令,计划服务必须已在运行中。
以下省略......
我把它们复制(AT |find /I "C:\job.bat" |find "星期五" |find "18:00" )下来单独运行也没有问题,
如:
C:\>(AT |find /I "C:\job.bat" |find "星期五" |find "18:00" )
       18   每月执行日期: 星期五    下午 18:00    c:\job.bat
能够正确的找到,百思不得其解。

把AT换成dir命令(比如dir ^|find "C:\test.bat"),倒是可以运行,但是得到的结果格式和预期的也不一样。预期的结果应该是符合find条件的一行,但实际运行下来的结果是这样的:
C:\>for /F "tokens=1,2 delims=," %i in ('cscript //nologo JobTime.vbs') do (dir
|find "C:\test.bat" )

C:\>(dir |find "C:\test.bat" )
驱动器 C 中的卷是 SYSTEM
卷的序列号是 8072-864F

C:\ 的目录


C:\ 的目录

2007-08-24  17:27                  296 test.bat
               1 个文件            296 字节
               0 个目录 10,650,035,200 可用字节
这个是不是又跟dos的某个机制有关的?希望大家给点意见,谢谢!

[ Last edited by picat on 2007-8-24 at 10:14 PM ]

2007-8-24 17:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
picat
初级用户





积分 150
发帖 68
注册 2007-4-26
状态 离线
『第 2 楼』:  

补充一下,我的环境是windows XP SP2 Proffessional中文版,cmd模式

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


for /f "tokens=3,5,6 delims= " %%i in ('AT ^|find /I "c:\job.bat"') do (cscript //nologo JobTime.vbs ^|find "%%j" ^|find "%%i")


pause
诡异的事情又来了,得到的结果居然是这样的:
C:\>for /F "tokens=3,5,6 delims= " %i in ('AT |find /I "c:\job.bat"') do (cscrip
t //nologo JobTime.vbs |find "%j" |find "%i" )

C:\>(cscript //nologo JobTime.vbs |find "17:30" |find "星期五" )
星期五,17:30
星期五,18:00

C:\>(cscript //nologo JobTime.vbs |find "18:00" |find "星期五" )
星期五,17:30
星期五,18:00

C:\>pause
请按任意键继续 . . .
命令都对,也都执行了,但是出来的结果却是把生成的2个时间的任务都找出来了,似乎|find没有起到作用......

[ Last edited by picat on 2007-8-24 at 06:05 PM ]

2007-8-24 18:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 3 楼』:  

@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你看是星期几?

2007-8-24 18:30
查看资料  发短消息 网志   编辑帖子  回复  引用回复
picat
初级用户





积分 150
发帖 68
注册 2007-4-26
状态 离线
『第 4 楼』:  

slore你说的对,我改了一下:
Option Explicit
Dim n
Dim intCount

intCount = 2

ReDim strTime(intCount)
ReDim strWeekDay(intCount)
ReDim strDaySerial(intCount)

strTime(0) = FormatDateTime(TimeValue(TimeSerial(Hour(Now),0,0)),vbShortTime)
strWeekDay(0) = WeekdayName(Weekday(Now))
strDaySerial(0) = Now

For n = 1 To intCount
        strTime(n)=Timevalue(strTime(n-1))+ TimeSerial(0,30,0)
        strTime(n)= FormatDateTime(strTime(n),vbShortTime)
        strDaySerial(n) = strDaySerial(n-1) + TimeSerial(0,30,0)
        strWeekDay(n) = WeekdayName(Weekday(strDaySerial(n)))
        WScript.Echo strWeekday(n) & "," & strTime(n)
next
不过这个貌似下标越界的代码居然可以正常运行...,今天尽碰到怪事了。

2007-8-24 21:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
picat
初级用户





积分 150
发帖 68
注册 2007-4-26
状态 离线
『第 5 楼』:  

还有你上面的P代码我也测试过了,还是同样的问题:
无效的命令。

AT 命令安排在特定日期和时间运行命令和程序。
要使用 AT 命令,计划服务必须已在运行中。
以下省略......

2007-8-24 21:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 6 楼』:  

哪里下标越界了?

2007-8-24 21:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
picat
初级用户





积分 150
发帖 68
注册 2007-4-26
状态 离线
『第 7 楼』:  



  Quote:
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 ]

2007-8-24 21:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 8 楼』:  

intcount=16

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

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

2007-8-24 21:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 9 楼』:  

=。=说到VB去了……VBS里没有To……只能从0开始……

2007-8-24 21:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
picat
初级用户





积分 150
发帖 68
注册 2007-4-26
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by slore at 2007-8-24 21:36:
intcount=16

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

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

晕了,一直以为dim里的数字是个数...,好像是跟以前学的哪个语言搞混了...

2007-8-24 21:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复
picat
初级用户





积分 150
发帖 68
注册 2007-4-26
状态 离线
『第 11 楼』:  

slore,你觉得上面的P代码,可能的问题在哪里啊?感觉上跟|find有关,但又只在说不出问题在哪里.......

2007-8-24 21:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 12 楼』:  

P我已经给你改过了啊……你运行我写的代码看看啊

2007-8-24 21:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
picat
初级用户





积分 150
发帖 68
注册 2007-4-26
状态 离线
『第 13 楼』:  

不好意思,刚才运行确实可以了,之前一次不知道哪里搞错了。但我觉得你的P代码跟我的没有实质性的区别啊,能告诉我什么原因吗?

2007-8-24 21:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
picat
初级用户





积分 150
发帖 68
注册 2007-4-26
状态 离线
『第 14 楼』:  

发现了,问题在转义字符^上,我把原先的P代码改成:
@echo off

c:

cd\


for /f "tokens=1,2 delims=," %%i in ('cscript //nologo JobTime.vbs') do (AT %%j /every:%%i "c:\job.bat")

@rem 检查成功与否

for /f "tokens=1,2 delims=," %%i in ('cscript //nologo JobTime.vbs') do (
AT |find /I "C:\job.bat" |find "%%i" |find "%%j"
)

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

[ Last edited by picat on 2007-8-24 at 10:08 PM ]

2007-8-24 22:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 15 楼』:  

你是要当字符串麽?转义?
你是要执行呀……转义干什么

   此帖被 +2 点积分    点击查看详情   
评分人:【 picat 分数: +2  时间:2007-8-24 22:34


2007-8-24 22:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: