标题: [求助][讨论]有没有高手可以在纯dos下做到这个功能?
[打印本页]
作者: peiliqin
时间: 2008-7-27 02:31
标题: [求助][讨论]有没有高手可以在纯dos下做到这个功能?
有没有高手可以在纯dos下做到这个功能?
SMARTDRV.EXE
if exist a:\jieguo.txt del a:\jieguo.txt
md5 -c n:\tools\cfcsys.txt >a:\jieguo.txt
for /f "tokens=2" %%W in (d:\fix\cfcsys.txt) do if /i "%%W" NEQ "OK" goto end
pause
exit
:end
command.com /c n:\gamemenu\system\fix.bat >nul
pause
n:\tools\cfcsys.txt 文件实际存在。
不管用什么方法,什么软件,谁能实现这个要求?向高手求救了。!!!!!!
补充:cfcsys.txt的内容(只是范例)
\89fe32de8587b0dfd76efce00396eb56 *c:\\windows\\NOTEPAD.EXE
\82b8373ed12a602820108f6154bf0c4c *c:\\windows\\explorer.exe
\b313c22a27d1d8677cdec778346d817e *c:\\windows\\regedit.exe
\65a70ec4649499399b50ac75d911a501 *c:\\windows\\system32\\Rundll32.exe
\9cabf264ce1177cafbbba4b910a44c79 *c:\\windows\\system32\\Services.exe
\06955b9a1ce9f54be0193030ef0a6e0e *c:\\windows\\system32\\Winlogon.exe
\722a247acb86960a708528120759266d *c:\\windows\\system32\\cmd.exe
\3502114e4cb83e491a80fc361c1dc7b7 *c:\\windows\\system32\\csrss.exe
jieguo.txt的内容
c:\windows\NOTEPAD.EXE: OK
c:\windows\explorer.exe: OK
c:\windows\regedit.exe: OK
c:\windows\system32\Rundll32.exe: OK
c:\windows\system32\Services.exe: OK
c:\windows\system32\Winlogon.exe: OK
c:\windows\system32\cmd.exe: OK
c:\windows\system32\csrss.exe: OK
[
Last edited by peiliqin on 2008-7-29 at 12:12 AM ]
作者: peiliqin
时间: 2008-7-27 21:24
用其他的方法,变通一下,或者有没有其他的dos软件可以做到?
作者: peiliqin
时间: 2008-7-28 00:33
用其他的方法,变通一下,或者有没有其他的dos软件可以做到? 怎么没有人回答啊?
作者: peiliqin
时间: 2008-7-28 00:38
听说,dos下有个awk可以做到,可是看不懂,搞的一头雾水。请教awk高手帮帮忙了啊。
作者: DOSforever
时间: 2008-7-28 00:41
我不知道 d:\fix\cfcsys.txt 文件具体的内容是什么,按照你原来的意思,只要有一行中的第二个字不是 "OK" 的话就 goto end ,也就是每一行都要有 "OK" 字样,简单点的话用 find /v 配合 errorleverl 来判断。还有,为什么要用 command/c ?
作者: quya
时间: 2008-7-28 19:53
看他的程序,可以猜到 CFCSYS.txt 的内容是 MD5 码 校验的结果, 只要有一个文件不通过, 就运行 FIX.BAT, FIX.BAT想必就是对没通过校验的文件进行修复之类的工作。
怎么做,我不知道,等其他人吧。
DOS因为有了FOR才变得丰富多彩,纯DOS下就那么几个命令,无法取巧,除非用第三方程序。
作者: DOSforever
时间: 2008-7-28 21:17
看看好像很简单,没什么复杂的。问题是他的 a:\jieguo.txt 好像和 d:\fix\cfcsys.txt 没什么关系,他为什么不去验证 a:\jieguo.txt 中的 OK ,而去找 d:\fix\cfcsys.txt 中的 OK ?
作者: peiliqin
时间: 2008-7-29 00:15
Quote: |
Originally posted by quya at 2008-7-28 07:53 PM:
看他的程序,可以猜到 CFCSYS.txt 的内容是 MD5 码 校验的结果, 只要有一个文件不通过, 就运行 FIX.BAT, FIX.BAT想必就是对没通过校验的文件进行修复之 ... |
|
cfcsys.txt是标准文件,jieguo.txt是个根据cfcsys.txt生成的临时文件。
作者: lianjiang2004
时间: 2008-7-29 07:45
可用截取每行最后两位字符,若不等于OK,就修复的方法。
strings就可以。
作者: peiliqin
时间: 2008-7-29 07:59
Quote: |
Originally posted by DOSforever at 2008-7-28 12:41 AM:
我不知道 d:\fix\cfcsys.txt 文件具体的内容是什么,按照你原来的意思,只要有一行中的第二个字不是 "OK" 的话就 goto end ,也就是每一行都要有 & ... |
|
试了一下,当文件内容有改变的时候,总是不能确定errorlevel的值。无法进行跳转。
作者: peiliqin
时间: 2008-7-29 08:01
Quote: |
Originally posted by lianjiang2004 at 2008-7-29 07:45 AM:
可用截取每行最后两位字符,若不等于OK,就修复的方法。
strings就可以。 |
|
我也看这个参数了,就是不知道怎么取 strings的值。能不能给个确切的例子?
作者: DOSforever
时间: 2008-7-29 09:56
Quote: |
Originally posted by peiliqin at 2008-7-29 07:59:
试了一下,当文件内容有改变的时候,总是不能确定errorlevel的值。无法进行跳转。 |
|
我的理解是你只要有一个不是 OK,就 goto 。find/v 如果找到了一个不是 OK 的,就返回退出码0,如果没找到就返回1,说明都是 OK 。为什么“总是不能确定errorlevel的值”?
作者: qzwqzw
时间: 2008-7-29 20:18
使用 command /c 是想屏掉 fix.bat 的输出
但是仍然不明白 d:\fix\cfcsys.txt 与 n:\tools\cfcsys.txt 是什么关系
按照12楼的思路给个最简化的原型代码
可以参考一下
find /v /i "OK" <d:\fix\cfcsys.txt>nul
if errorlevel 1 exit
command.com /c n:\gamemenu\system\fix.bat >nul
作者: peiliqin
时间: 2008-7-29 21:34
我的理解是你只要有一个不是 OK,就 goto 。find/v 如果找到了一个不是 OK 的,就返回退出码0,如果没找到就返回1,说明都是 OK 。为什么“总是不能确定errorlevel的值”?
我测试了,1跟0的效果一样。2的时候就完全是另外一个效果了。我可以在windows下的cmd查看上一个命令的返回码,但是在纯dos下,不知道怎么看。
作者: DOSforever
时间: 2008-7-29 21:39
你把你试的语句贴出来
作者: peiliqin
时间: 2008-7-29 21:56
我是这样测试的,读的文件是jieguo.txt
find /v "OK" A:\jieguo.txt
if errorlevel 1 goto end
echo 222
:end
echo 333
不管取值0或者是1,结果都是显示 222 333,取值2以上,都是显示333
作者: DOSforever
时间: 2008-7-29 22:06
如果是这样的话,说明退出码>=2,find 没能完成搜索,在搜索时发生了错误。你的 A:\jieguo.txt 有什么问题?不一定要用 A: 来测试。
作者: peiliqin
时间: 2008-7-29 22:18
可是,find已经正常的完成了,结果是对的。怎么查看上一个命令的返回值?
作者: DOSforever
时间: 2008-7-29 22:32
command 下没办法直接看退出码,只能根据 errorlever 来判断,除非用 4DOS 。
结果是对的?对什么对,根据你的语句和结果就是不对的。“不管取值0或者是1,结果都是显示 222 333,取值2以上,都是显示333”,这就说明了说明退出码>=2 。find 结束了搜索不一定说明是正常完成了。其实你不一定要用原文件来测试,就在硬盘上建一个文件,内容只有一个 OK ,然后删除这个 OK 或者改成其它内容不就得了?
作者: peiliqin
时间: 2008-7-29 22:37
可是 只要有一个不同的地方,哪怕是在文件的最后一行,也可以在屏幕回显出来的。
论坛里帖出来的那个jieguo.txt只是其中一部分,其实这个文件有2000行左右,跟这个有关系吗?
作者: DOSforever
时间: 2008-7-29 23:13
我不知道 find 搜索文件的大小和行数的上限,我想上千行应该不是什么问题吧,写一个程序几万行都不稀奇。我特地建了个有2048行,每行内容都是ok的文件,第2049行不是ok,试下来没什么问题,返回的结果和退出码完全在意料之中。
你为什么不在硬盘上试一下
作者: peiliqin
时间: 2008-7-29 23:38
那我再试一下 看看是不是我这里出了什么问题
作者: qzwqzw
时间: 2008-7-30 00:03
MS-DOS 7.1可以用command /z 查看 errorlevel
也可以自己写一个简单的批处理检测errorlevel
作者: DOSforever
时间: 2008-7-30 02:07
我后来又试验了下,看来 find 的退出码不是我们想像的那样,具体分析等会儿在说。
作者: peiliqin
时间: 2008-7-30 06:12
等你们的消息了,我一直在等在好消息呢。
作者: lianjiang2004
时间: 2008-7-30 08:24
STRINGS [目标变量=]LEFT 源字符串 要取的字符数量 〈从左边取源字符串的指定字符数量〉
作者: DOSforever
时间: 2008-7-30 13:53
先说一下 FIND 的退出码说明
Quote: |
FIND exit codes
The following list shows each exit code and a brief description of its meaning:
0
The search was completed successfully and at least one match was found.
1
The search was completed successfully, but no matches were found.
2
The search was not completed successfully. In this case, an error
occurred during the search, and FIND cannot report whether any matches
were found. |
|
建立一个只有一行 ok 内容的文件 txt ,用 FIND 不同的参数来执行查看结果和退出码:
D1.
Quote: |
find "ok" txt
---------- TXT
ok
exitcode = 0 |
|
//找到了要找的字符,返回退出码0,正常
D2.
Quote: |
find/v "ok" txt
---------- TXT
exitcode = 0 |
|
//按理,这里应该是没有找到要找的字符,为什么返回的退出码是0 ?难道一个不存在的行也算是找到?但是,同样也是“找到”,下面第四个例子返回的却是1
D3.
Quote: |
find "w" txt
---------- TXT
exitcode = 1 |
|
//没有找到要找的字符,返回的退出码是1,正常
D4.
Quote: |
find/v "w" txt
---------- TXT
ok
exitcode = 1 |
|
//找到了不包含 w 字符的行,也就是找到要找的字符,按理,这里的退出码应该是0,它为什么返回的是1?
现在,在把 txt 文件内容修改一下,增加一行 not 内容,再按照上述参数执行一下,看看结果:
D5.
Quote: |
find "ok" txt
---------- TXT
ok
exitcode = 0 |
|
//
D6.
Quote: |
find/v "ok" txt
---------- TXT
not
exitcode = 0 |
|
//
D7.
Quote: |
find "w" txt
---------- TXT
exitcode = 1 |
|
//
D8.
Quote: |
find/v "w" txt
---------- TXT
ok
not
exitcode = 1 |
|
//
具体我就不解释了,和前面一样,退出码的顺序同样也为 0 0 1 1 。我在 MS-DOS 6.22 和 MS-7.10 下的 FIND 得出相同的结果。
后来我又测试了下 WindowsXP 下的 FIND ,被测文件内容和参数顺序同上。
只有内容为 ok 的 txt 文件:
X1.
Quote: |
find "ok" txt
---------- TXT
ok
exitcode = 0 |
|
//找到了要找的字符,退出码为0,正常
X2.
Quote: |
find/v "ok" txt
---------- TXT
exitcode = 1 |
|
//没有找到要找的字符,退出码为1,正常
X3.
Quote: |
find "w" txt
---------- TXT
exitcode = 1 |
|
//没有找到要找的字符,退出码为1,正常
X4.
Quote: |
find/v "w" txt
---------- TXT
ok
exitcode = 0 |
|
//找到了不包含 w 的行,也就是查找到了要找的内容,退出码为0,正常
现在, txt 文件内容增加 not 一行:
X5.
Quote: |
find "ok" txt
---------- TXT
ok
exitcode = 0 |
|
//找到了要找的字符,退出码为0,正常
X6.
Quote: |
find/v "ok" txt
---------- TXT
not
exitcode = 0 |
|
//找到了不包含 ok 的行,也是找到了要查找的内容,退出码为0,正常
X7.
Quote: |
find "w" txt
---------- TXT
exitcode = 1 |
|
//没有找到要找的字符,退出码为1,正常
X8.
Quote: |
find/v "w" txt
---------- TXT
ok
not
exitcode = 0 |
|
//找到了不包含 w 的行,也是找到了要查找的内容,退出码为0,正常
由此看来 DOS 下,确切的说是 MS-DOS 下(其它的 DOS 我还没试)的 FIND 命令的退出码有缺陷,缺陷在于加了 /v 参数后的退出码没有按照本意来返回,也就是我前面 D2 和 D4 的例子,在 Windows XP 下(我的是SP2版的)的 FIND 修正了这个 bug 。其它版本的 Windows 未作测试。
最后注明:为了方便查看退出码和结果重定向到文件,我在 DOS 下的测试环境是 4DOS ,在 Windows 下的命令行环境是 4NT ,我想这应该不会影响什么测试结果。
作者: DOSforever
时间: 2008-7-30 13:56
但是,从你的测试结果来看,这个缺陷应该和你的返回退出码是>=2无关。
结合你的具体应用,假如你的校验结果文件全是OK,和有一个不OK的,用 find /v "OK" 命令,返回的退出码都是0,无法判断。就像我前面的 D2 和 D6 的例子。
我不知道你用的是哪个 MD5 ,从你的参数格式来看,使用这样格式的应该是 md5sum.exe ,和 md5.exe 是两个不同的程序,这两个程序也提供了退出码,一般,生成过程和校验结果无误的话,返回的都是0,有错误总是>=1。
作者: DOSforever
时间: 2008-7-30 15:32
再补充说明一下 D6 这个例子,看上去好像是对的,find 确实找到了不包含 ok 字符的行 not ,返回的是 0,但我认为其实这个和 D1 和 D5 返回的是 0 的原因一样,find 认为它找到了 ok ,而不是因为找到了不包含 ok 的行。
作者: peiliqin
时间: 2008-7-31 05:28
太谢谢你了,我得好好看看。谢谢你这么耐心的测试,真的感激得不知道说什么好了。
为了您的耐心,我也得好好看看,多试试才对。
作者: peiliqin
时间: 2008-8-1 21:34
我不知道你用的是哪个 MD5 ,从你的参数格式来看,使用这样格式的应该是 md5sum.exe ,和 md5.exe 是两个不同的程序,这两个程序也提供了退出码,一般,生成过程和校验结果无误的话,返回的都是0,有错误总是>=1。
太谢谢你了。这个程序确实有退出码,这个提示太重要了。再次感谢。
[
Last edited by peiliqin on 2008-8-1 at 09:37 PM ]
作者: peiliqin
时间: 2008-8-3 04:37
再次感谢you
作者: xwhaha
时间: 2008-8-6 22:13
呵呵,学习学习……
作者: flyinspace
时间: 2008-8-7 08:22
呵呵,楼主好可爱。。
你这样太麻烦了呢。不如写一个小c程序还要好一些。。
才几行代码而已。。。