Board logo

标题: [急][求助]请各位路过的大哥给小弟一个指导! [打印本页]

作者: pizigao     时间: 2004-1-13 00:00    标题: [急][求助]请各位路过的大哥给小弟一个指导!
引言:我所在的单位是负责开发报税软件的,在升级过程(主要是下载补丁的形式,是用WINRAR做的自解压格式)中经常出现客户自己操作而造成升级不成功的情况!!(所有的ABC目录都是假设,实际上RIGHTIUM目录)
例如:我们的软件默认是安装在C:\ABC的目录下的,但是所有的文件都是放在C:\ABC\123456(每家企业都有自己的六位数企业编码),而自解压文件的默认安装目录是C:\ABC,因为考虑到每家的企业编码不一样,所以需要用户自己在C:\ABC的后面手工添加\123456(每家企业自己的企业编码),但是有相当多的用户直接点击安装而没有加\123456(每家企业自己的企业编码),最后造成升级失败!!!
如何写这样的批处理!!!!(在WIN98和WIN2000都要可以使用)
1、先自动查找硬盘每个分区上的ABC目录(考虑到有的用户会更改默认安装目录);
2、然后查找这个目录下的所有以六位数字(企业编码)命名的目录(因为有的会计是兼职的,可能会安装几个企业);
3、然后把找到的六位数字(企业编码)命名的目录用列表的形式列出来,让用户自己选择要打补丁的企业编码!!!
附注:1、可以把补丁文件做成自解压格式,然后配合批处理使用!!!

2、或者哪位老师可以教一下,用目前比较流行的安装程序,让它直接搜索注册表,然后把搜索到的六位数字(企业编码)命名的目录用列表的形式列出来,让用户自己选择要打补丁的企业编码!!!
====================================================
我目前配合WBAT做了一个批处理(还未完成),但是有几点疑问:
1、如何把ABC目录下的JBSB和BAK目录不在列表中显示(让批处理自动判断)
2、如何实现点击所需要的企业编码后自动解压缩到所选的编码目录!
3、dready这个文件是否可以不用,直接用DIR!
附注:以上的操作均是在WIN98、WIN2000下使用,不是在DOS下,欢迎大家提建议!
以下是我未完成的批处理文件,请各位大哥指导一下!再次感谢!








作者: pizigao     时间: 2004-1-13 00:00
@echo off
cls
REM 检测硬盘企业编码的文件夹所在的位置和文件夹!
:_hd
rem updata
echo.
echo.
echo :m_dir " 选择需要升级企业编码的文件夹 " >%temp%\tmp.txt

dready c: /w
if errorlevel 1 goto :_D
echo 正在检测C盘\RIGHTIUM目录下的企业编码......
dir c:\RIGHTIUM\?????? /b >>%temp%\tmp.txt
echo C盘完成检测!
:_D
dready d: /w
if errorlevel 1 goto :_E
echo 正在检测D盘\RIGHTIUM目录下的企业编码......
dir d:\RIGHTIUM\?????? /b>>%temp%\tmp.txt
echo D盘完成检测!
:_E
dready e: /w
if errorlevel 1 goto :_F
echo 正在检测E盘\RIGHTIUM目录下的企业编码......
dir e:\RIGHTIUM\?????? /b>>%temp%\tmp.txt
echo E盘完成检测!
:_F
dready f: /w
if errorlevel 1 goto :_G
echo 正在检测F盘\RIGHTIUM目录下的企业编码......
dir f:\RIGHTIUM\?????? /b>>%temp%\tmp.txt
echo F盘完成检测!
:_G
dready g: /w
if errorlevel 1 goto :_H
echo 正在检测G盘\RIGHTIUM目录下的企业编码......
dir g:\RIGHTIUM\?????? /b >>%temp%\tmp.txt
echo G盘完成检测!
:_H
dready h: /w
if errorlevel 1 goto :_I
echo 正在检测H盘\RIGHTIUM目录下的企业编码......
dir h:\RIGHTIUM\?????? /b >>%temp%\tmp.txt
echo H盘完成检测!
:_I
dready I: /w
if errorlevel 1 goto :_Z
echo 正在检测I盘\RIGHTIUM目录下的企业编码......
dir i:\RIGHTIUM\?????? /b >>%temp%\tmp.txt
echo I盘完成检测!
:_Z
cls
echo 完成检测!
beep >nul
cls
call w.bat list @%temp%\tmp.txt:m_dir
if errorlevel 100 goto _top
if "%wbat%"=="" goto _ERROR
set gfile=%wbat%

goto _txt

:_txt
rem updata
call w.bat box @123.BAT:sc_4
if errorlevel 100 goto _txt
if "%?%" == "1" goto _rey

set tOK=
rem updata
call w.bat box @123.BAT:sc_5
if errorlevel 100 goto _end
if "%tOK%"=="ok" goto _ok
if "%tOK%"=="OK" goto _ok
goto sc5

:sc5
goto _end

:_ok
set tOK=
cls
quit >nul
echo Loading...
extract /y /l up021.cab \%gfile% /e

作者: pizigao     时间: 2004-1-13 00:00
以上的批处理还有很多地方不完善,还请大家一一指正!

作者: tdj     时间: 2004-1-13 00:00
To:pizigao
呵呵。


作者: pizigao     时间: 2004-1-13 00:00


作者: pizigao     时间: 2004-1-13 00:00
这是在WINDOWS下运行的界面!




作者: pizigao     时间: 2004-1-13 00:00
有没有一个汉字系统在WINDOWS下能用啊!?
不象下面的情况:

作者: pizigao     时间: 2004-1-14 00:00
在线等啊!帮帮我!

作者: Wengier     时间: 2004-1-14 00:00
既然“以上的操作均是在WIN98、WIN2000下使用,不是在DOS下”,那建议发到论坛的“WIN及其它操作系统专栏”版块中吧。

作者: willsort     时间: 2004-1-14 00:00
Re pizigao:

问题一:可以用FIND加参数/V,例如:

FIND /V "JBSB" %temp%\tmp1.txt
FIND /V "BAK" %temp%\tmp.txt

问题二:WBAT我是不是很熟,不过他应该支持鼠标点击事件,仔细察看它附带的帮助文档,利用相应的环境变量应该可以解决问题。不过我个人觉得,既然已经决定采用DOS方式解决问题,何必一定要在乎界面呢?利用 CHOICE 让用户输入自己的选择岂不很简单,既没有兼容性的问题,也没有制表符乱码的问题,还少用一个外部程序。

问题三:DREADY 是检测软驱和光驱是否存在和准备的工具,你当然可以不用它,但是你需要预防,它访问到没有光盘的光驱可能存在的致命错误。

作者: pizigao     时间: 2004-1-14 00:00
willsort大哥!再次打扰!!
麻烦你在空闲之余,把你的思路写个批处理给我参考一下(1、利用 CHOICE 让用户输入自己的选择;2、不用DREADY程序;3、不用WBAT)!我很想学学!在下感激不尽!!


作者: willsort     时间: 2004-1-14 00:00
Re pizigao:

你要的程序是如果很急,我会尽快做出答复,只是目前身边没有很好的调试环境,可能至少三天才能收到我的答复,在此预作提醒,以免耽误你的时间。

其实我没有给别人写完整源代码的习惯,往往是一些代码上的原型或者文字上的建议,这样利于思想上的交流和灵感上的互动。所以,如果你真对此很有兴趣,希望你多找些资料,多打些基础知识,循序渐进才是正途。

如果,你仅仅为了解决某个现实问题,我自也乐意提供帮助。论坛上大家都是朋友,没有必要过多使用敬辞,我本人也许比你还小,被称“大哥”实在心有惴惴,以后直呼我名即可。

也许是我为人过于呆板了些,以致让大家有所隔膜,以后注意纠正吧:)




作者: pizigao     时间: 2004-1-15 00:00
willsort,说实话:关于批处理的学习我一直都在继续,由于这个升级程序要的是有点仓促!由于才疏学浅,一直都没有时间把我以前学的东西好好汇总一下,所以只有麻烦您指导一下(我对DOS一直都有着浓厚的兴趣,只不过在有些问题上没有得到高手的指导,能认识您我感到很高兴)!
能否提供一个您的信箱,以方便我们以后交流!
我的信箱是:PIZIGAO@HANGJIAHU.COM
网址 HTTP://PIZIGAO.5188.ORG

作者: pizigao     时间: 2004-1-15 00:00
有几点要求如下:
1、寻找C、D、E、F、G硬盘分区的RIGHTIUM的目录,找到RIGHT目录下的六位数企业编码命名的目录用列表的形式列出来(其中JBSB和BAK不在列表中显示出来)
2、让用户自己选择要打补丁的企业编码(也可以用 CHOICE 让用户输入自己的选择),选择之后,自动运行WINRAR自解压文件(WINDOWS下的),并解压到选择的目录里面!!!



作者: pizigao     时间: 2004-1-15 00:00
提供两家企业的初始化信息和钥匙文件!(附件)
打开附件
安装程序下载地址(31M):http://www.21ei.net/download/E3.20.018.exe
补丁下载地址(1.3M):http://www.21ei.net/download/up021.exe

作者: pizigao     时间: 2004-1-16 00:00

作者: pizigao     时间: 2004-1-25 00:00
ding

作者: willsort     时间: 2004-1-26 00:00
Re pizigao:

这是初步的代码, 你可以测试一下:

@echo off
if == goto %2

call %0 $ locate c d e f g h i j k
if == goto error1
goto collect

:locate
if == goto end
if exist %3:\Rightium\Nul set base=%3:
if exist %3:\Progra~1\Rightium\Nul set base=%3:\Progra~1
if not == goto end
shift
goto locate

:collect
dir %base%\Rightium\*.* /ad /b > user.txt
type user.txt | find "JBSB" /v /i| find "BAK" /v /i > user2.txt
type nul > null.txt
fc null.txt user2.txt /n | find ":" > userlist.txt
if errorlevel 1 goto error2

:choose
echo 下面是找到的企业用户的编号
echo --------------------------
type userlist.txt
echo.
echo --------------------------
echo 请选择企业编号,取消请按 Q:
choice /c:123456789q /n > nul
if errorlevel 10 goto end
for %%e in (1 2 3 4 5 6 7 8 9) do if errorlevel %%e set el=%%e

:generate
echo xset > userthis.bat
echo r cx > xset.asd
echo 5 >> xset.asd
echo w >> xset.asd
echo q >> xset.asd
debug userthis.bat nul

:convert
find "%el%: " > userthis.bat
echo set code=%%2> xset.bat
call userthis.bat

:check
if not exist %base%\Rightium\%code%\rightium.exe goto error3
if not exist %base%\Rightium\%code%\upgrade.ini goto extract
find "3.20.021" %base%\Rightium\%code%\upgrade.ini > nul
if not errorlevel 1 goto error4

:extract
echo.
echo 正在升级对应企业编号的软件......
if exist null.txt del null.txt
if exist user.txt del user.txt
if exist user2.txt del user2.txt
if exist userlist.txt del userlist.txt
if exist userthis.bat del userthis.bat
if exist xset.asd del xset.asd
if exist xset.bat del xset.bat
copy %temp%\rightium3\*.* %base%\Rightium\%code% > nul
if exist %base%\Rightium\%code%\up.bat del %base%\Rightium\%code%\up.bat
echo 升级完毕,按任意键结束。
pause>nul
goto end

:error
:error1
echo.
echo 错误:未找到软件安装路径!
echo 提示:请确定软件是否安装。
echo.
goto restore
:error2
echo.
echo 错误:未找到企业用户编号目录!
echo 提示:请检查软件是否正确。
echo.
goto restore
:error3
echo.
echo 错误:指定编号目录不存在有效文件!
echo 提示:请检查选择的编号是否正确。
echo.
goto restore
:error4
echo.
echo 错误:指定编号目录已经被升级!
echo 提示:请检查选择的编号是否正确。
echo.
goto restore

:restore
set base=
set code=
set el=
pause>nul

:end
cls




作者: willsort     时间: 2004-1-26 00:00
Re pizigao:

这是我用WINRAR3制作的自解压文件,你也测试一下吧。
打开附件

作者: cavvie     时间: 2004-1-28 00:00
不知这位大哥是不是搞技术开发的。这种问题居然还死抱着dos不放?你自己编写一个windows下的升级程序不久可以了,并且,这种情况下必然是应该搜索注册表(前提是的的程序在注册表中保存相关信息),不然的话,像我的机器上有100多万个文件和文件夹,你要搜到何年何月?
唉,大哥,赶紧学点东西充实一下自己的知识的:(

作者: pizigao     时间: 2004-1-28 00:00
1、谢谢 willsort大哥的帮忙,我正在测试,过几天告知测试结果,顺便问一下2000和XP可否正常运行!再次感谢 willsort大哥。
2、RE:cavvie
谢谢仁兄的指导,这点我也考虑过,不过目前我正在充实这方面的技术知识!谢谢!

作者: willsort     时间: 2004-1-28 00:00
Re pizigao:

原程序使用了nt系列未曾提供的工具程序choice.com,若从98下复制此程序,会引起16位程序的兼容性问题。我在XP下测试时,发现无法使用中文,98下无此问题。

另外,此程序只是一个原型,因此省略了许多复杂的细节。比如,目录的遍历,企业用户超过9个时的处理等。

总之,如果你仅仅应用于非专业的场合,它可以应付大多数问题。如果你想将之应用在商业软件中,则仍然有很多欠缺。

cavvie 看法也很有用,windows 的问题最好可以用 windows 自己的方法来解决。但若如果按照 cavvie 所说的注册表来解决,也有很多问题:第一,有些商业软件,特别是财务类软件,至今仍然只有命令行版,根本不访问注册表;第二,在跨系统方面,注册表技术仍然有很多复杂的细节。

所以,给你一个建议。看了你的升级包,觉得做到如此地步也未尝不可,既然已经决定要选择,何不就用WINRAR的“浏览文件”来让用户选择自己的升级路径,最多加上详细的文字说明即可,反而比用DOS的批处理要简单得多。




作者: pizigao     时间: 2004-1-31 00:00
谢谢willsort!我昨天在XP的系统中试了一下,确实不能使用CHIOCE命令,但是可以支持中文。
修改建议(总的思路不变,再次麻烦WILLSORT大哥):
1、取消用户选择菜单,改为直接查找符合条件(即目录里面包含RIGHTIUM.EXE程序文件)的企业编码目录,然后把符合条件的企业编码目录用列表的方式显示出来,告诉用户敲击任意键直接升级所有符合条件的企业编码目录(这样做的话:1、可以免去用户在升级多家企业时重复操作升级程序;2、不使用CHIOCE命令,使兼容性增强;3、突破只能升级9家企业的局限)
2、解压包不变。
我想知道下面的DEBUG命令是执行什么操作的?
=======================
echo xset > userthis.bat
echo r cx > xset.asd
echo 5 >> xset.asd
echo w >> xset.asd
echo q >> xset.asd
debug userthis.bat nul
=======================


作者: willsort     时间: 2004-2-2 00:00
Re pizigao:

总体思路已经有了,只是实在找不到机器来具体实现了,网吧调试起来太慢。

首先,用dir /s /ad 找到 rightium 的路径,然后提取其下所有数字目录。列出目录表单后,询问是否更新,然后用fc codelist null.txt /lb1 循环提取第一行文字到 xset.bat 中,检测有效后进行更新操作。可以参考上例给的原型程序和fc的帮助文档来完成,如果遇到什么问题,可以继续联系。

作者: willsort     时间: 2004-2-2 00:00
Re pizigao:

我的xp的中文问题出现在使用 debug 或者 choice 之类的16位程序之后,似乎是某些设置的问题,不用debug似乎也行,只是还没有找到具体的方法,所以在xp下运行还应小心谨慎。

作者: pizigao     时间: 2004-2-3 00:00
谢谢了!
我在本机上测试遇到了一个问题:明明我的机子(98系统)上有RIGHTIUM目录,但是运行会报错(好象是找不到目录),这是什么原因造成的呢?

作者: willsort     时间: 2004-2-3 00:00
Re pizigao:

前一行是说环境变量空间溢出,但是我的程序中并没有使用太多的环境变量,那可能是变量值太长的结果,那就是说rightium所在的路径太深。

也有可能是批处理运行环境的环境空间太小。可参照以下帖子修正:
http://model.chinajewelry.net/dos/dosbbs/dispbbs.asp?BoardID=12&ID=8804&replyID=54137&skin=1

作者: pizigao     时间: 2004-2-4 00:00
谢谢指导
1、RIGHTIUM目录就在C盘的根目录下
2、问题已经解决