中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请帮忙优化一下这个自动更新游戏的批处理
作者:
标题: 请帮忙优化一下这个自动更新游戏的批处理 上一主题 | 下一主题
zhwvip
初级用户





积分 29
发帖 14
注册 2006-8-2
状态 离线
『楼 主』:  请帮忙优化一下这个自动更新游戏的批处理

我这里网吧应用还原卡, 所以游戏需要1太1台的更新 , 我现在用开机批处理更新 ,更新文件在电影的服务器上 .我每次更新时开4到5台 看他更新完 ,关机保存本来没什么不好。。。 后来我越来越懒 又更改批处理 一下把所有的机器都开开 开始更新4台 后来完成一台 另一台自动开始 。可是所有的都更新完也很费工夫 ,又把音乐做成另一个服务器让它自动分配到电影和音乐 ,一边分一个 , 可是又有问题 电影和音乐 的配置不一样, 造成更新速度不一样总之, 代码有问题...  而且是好几个批处理完成  我没法给他综合到一起..  最后只能让大家帮我参谋下了 .

客户机 开机启动 updata3.bat
[updata3.bat]
@call \\dianying2\游戏\更新纪录\updata3.bat

[updata3.bat]
@echo off
if exist ipconfig.txt  del ipconfig.txt  
ipconfig /all >ipconfig.txt
if exist phyaddr.txt   del phyaddr.txt
find  "Physical Address" ipconfig.txt >phyaddr.txt
if exist ipaddr.txt   del ipaddr.txt
find  "IP Address" ipconfig.txt >ipaddr.txt
for /f "skip=2 tokens=12" %%M in (phyaddr.txt) do set strMac=%%M
@echo %strMac%
for /f "skip=2 tokens=15" %%I in (ipaddr.txt) do set IPAddress=%%I
@echo %IPAddress%
arp -d >nul
arp -s %IPAddress% %strMac% >nul
ARP -s xxx.xxx.xxx.1 00-3C-01-xx-xx-xx >nul
::绑ip
start/W C:\WINDOWS\system32\worfiv.cpl
::狼牙借口
call \\dianying2\游戏\更新纪录\123\判断.bat
exit


[判断.bat]
for /f "" %%N IN (\\dianying2\useru$\123456\Config.ini) Do if %ComputerName%==%%N (
call \\dianying2\游戏\更新纪录\123\分配.bat
) Else (
echo 123
)
::主要为了看这台机器用不用更新


[分配.bat]
for /f "tokens=*" %%i in (a.txt) do (set /a "str=%%i")
set /A a=%str%+1
set /A b=%str% %%2
echo %a% > a.txt
echo %b%
@if "%b%"=="1" goto mbmbpd
@if "%b%"=="0" goto dianying2pd
:mbmbpd
call \\mbmb\游戏\更新纪录\123\判断连接.bat
exit
:dianying2pd
call \\dianying2\游戏\更新纪录\123\判断连接.bat
exit
::为了分配到dianying2 或者mbmb

[连接判断.bat]    (2个连接判断是一样的,就是位置不同)
@echo off
set /A x=0
:oo
for /f "tokens=*" %%i in (\\dianying2\useru$\123456\1.ini) do (set /a "str=%%i")
for /f "tokens=*" %%i in (\\dianying2\useru$\123456\2.ini) do (set /a "str1=%%i")
set /A x=x+1
set /A a=%str%
set /A b=%str1%
set /A c=a-b
if %c% GEQ 3 goto pau
if %c% LEQ 3 goto go
:pau
cls
echo.
echo        =================================
echo          第 %x% 次等待 连接数目到达最大
echo               8秒钟后尝试再次连接
echo             dianying2队列 请稍后...
echo        =================================
@echo  %ComputerName% 第 %x% 次等待 连接数目到达最大>> \\dianying2\useru$\123456\报告\等待报告.txt
@echo dianying2纪录 %time% , %date% >> \\dianying2\useru$\123456\报告\等待报告.txt
@echo. >> \\dianying2\useru$\123456\报告\等待报告.txt
ping -n 13 localhost > nul
goto oo
:go
for /f "tokens=*" %%i in (\\dianying2\useru$\123456\1.ini) do (set /a "str2=%%i")
set /A a=%str%+1
echo %a% > \\dianying2\useru$\123456\1.ini
call \\dianying2\游戏\更新纪录\123\更新.bat
exit


[更新.bat]

@xcopy /s /z /d /y/e/h \\dianying2\游戏\网络游戏\传奇世界 D:\网络游戏\传奇世界 >nul
...
rd /s/q d:\网络游戏\浩方对战平台
start /w \\dianying2\游戏\浩方\浩方对战平台.exe
for /f "tokens=*" %%i in (\\dianying2\useru$\123456\2.ini) do (set /a "str2=%%i")
set /A a=%str2%+1
echo %a% > \\dianying2\useru$\123456\2.ini
exit

主要在
[判断.bat][分配.bat][连接判断.bat] [更新.bat]
着几个批处理 可不可以简化下... 我实在是没办法了.现在还有个问题
因为dianying2 和mbmb的配置不同,造成排队的机器一多就一个队列先完成另
一个还要半天 我想了想,不应该先分配队列.应该先排队进队列.在分配更新服务器... 应该是这样把 ?   恳请大家帮忙看看... 呼 手疼

ps:执行过程:在updata3棒定mac 连接判断
                 判断.bat 确定本机是否更新 是 连接分配
                 分配.bat 根据a.txt里的总数分配到diangying2或者mbmb
                              连接dianying2或mbmb里的连接判断 同时a.txt
                              加1
                 连接判断.bat 读取1.ini和2.ini 数字象减得出现在更新机器
                              数 大于4排队. 小于连接更新(2台服务器一样的
                              连接判断和更新)
                 更新.bat 进入时1.ini加1
                             各种更新(用xcopy .rar无应答覆盖自解压,不用管这里)
                              退出2.ini加1

   简化或综合到1个批里从4楼的he200377 兄给的思路中已经有启发了
   简化方案 6楼zerocq兄 给出判断的简话方案可以综合到updata3里
    同时在8楼的代码抛弃了一堆ini ~~~
   谢谢了
   
   现在想实现的过成是
                 updata3:棒定mac 等前期准备 同时判断是否更新(实现),连
                             接 排队分配.bat
                 排队分配.bat : 看前方是否有8台机器在更新 ,有的话排队等
                             戴 ,没有 进入更新队列 , 判断dianying2更新的机器
                             多还是mbmb多,挑更新机器少的服务器开始更新.
                             (排队好半可以自己实现 但是怎么在队列里自动分配
                              到某台服务器 ?)
                 更新.bat:各种更新

    再次感谢您能看完我写的这些 (能看完我罗里罗嗦写完这些就很谢谢您了)

[ Last edited by zhwvip on 2006-10-29 at 06:53 AM ]

2006-10-28 04:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zhwvip
初级用户





积分 29
发帖 14
注册 2006-8-2
状态 离线
『第 2 楼』:  

虽然 没人理我 还是要把它顶起来 ...

2006-10-28 21:47
查看资料  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 3 楼』:  

随便写的

::本地网络主机游戏更新目录
set update_server_path=\\192.168.0.200\游戏更新
::本机游戏更新目录
set update_local_path=d:\游戏更新

@echo off
cls
setlocal enabledelayedexpansion
title 本地网络游戏更新,更新没有的,时间小的,时间大且大小不一样的
set sp=%update_server_path%
set lp=%update_local_path%
::创建目录结构,包括子目录,除过空目录
xcopy /T /s %sp% %lp%||(echo 错误&pause>nul&ping -n 2 127.1>nul&goto :eof)

if exist update_.txt del /q update_.txt

::生成本地网络主机游戏更新目录下所有文件附时间大小
for /f "tokens=*" %%a in ('dir /a-d/s/b %sp%') do (
        set var=%%a
        >>update_.txt echo !var:%sp%\=!#%%~ta#%%~za
                                                   )

for /f "tokens=1-3 delims=#" %%b in (update_.txt) do (
        if not exist "%%b" copy "%sp%\%%b" "%%b" else call :fc_files "%%b" "%%c" "%%d"
                                                      )

goto :eof

:fc_files
for %%? in ("%lp%\%1") do (
        if %%~t? lss %2 copy "%sp%\%1" "%1" else (if not %%z?==%3 copy "%sp%\%1" "%1")
                          )
goto :eof

2006-10-29 00:32
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
zhwvip
初级用户





积分 29
发帖 14
注册 2006-8-2
状态 离线
『第 4 楼』:  

谢谢 he200377 兄弟
不过我现在想的主要是怎么实现先排队在分派到更新的服务器上 ... 好象你这里
for /f "tokens=1-3 delims=#" %%b in (update_.txt) do (
        if not exist "%%b" copy "%sp%\%%b" "%%b" else call :fc_files "%%b" "%%c" "%%d"
                                                      )

goto :eof

:fc_files
for %%? in ("%lp%\%1") do (
        if %%~t? lss %2 copy "%sp%\%1" "%1" else (if not %%z?==%3 copy "%sp%\%1" "%1")
                          )
少2个括号把? .. 而且着段实现要费好长时间 ... 没什么大用出啊? 不过还是多谢了

看到着段发现在1个批里也能call 下一段代码 好象GOTO.. 不过我就是在[判断.bat]
这里GOTO 不下去才连接[分配.bat] . 现在看来可以把分配整和起来 加个  :分配
直接CALL它就好了 ......     对吧?

2006-10-29 01:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zerocq
中级用户




积分 458
发帖 196
注册 2006-10-5
状态 离线
『第 5 楼』:  

[判断.bat]
find "%ComputerName%" \\dianying2\useru$\123456\Config.ini>nul||call \\dianying2\游戏\更新纪录\123\分配.bat

应该可以......

这么多ini,txt文件都什么用的,看不懂下边代码了

等高手来:D

[ Last edited by zerocq on 2006-10-29 at 02:56 AM ]

2006-10-29 02:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhwvip
初级用户





积分 29
发帖 14
注册 2006-8-2
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by zerocq at 2006-10-29 02:52:
[判断.bat]
find "%ComputerName%" \\dianying2\useru$\123456\Config.ini>nul||call \\dianying2\游戏\更新纪录\123\分配.bat

应该可以......

这么多ini,txt文件都什习...

怪我没说清楚 抱歉...
其实1.ini 2.ini 主要作用是 每当一台客户机开始更新 1.ini里的数+1 ,更新完退出时 2.ini里数字+1   它们相-就是在更新的机器数 ,用这个来判断是否直接开始更新 或者排队...  麻烦把...   2抬更新用服务器上有4个这样的 ini  还有个总数的a.txt  用来看单双来分派排在哪个服务器队列里 .      555  帮帮我把..我要死了  过两天我肯定不知道都是什么了  .  看来还是要写备注的

看明白find "%ComputerName%" \\dianying2\useru$\123456\Config.ini>nul||call \\dianying2\游戏\更新纪录\123\分配.bat 这个了 ,谢谢
用FIND判断本机名在不在config里 有的话执行分配  .简单就是好

[ Last edited by zhwvip on 2006-10-29 at 03:46 AM ]

2006-10-29 03:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zerocq
中级用户




积分 458
发帖 196
注册 2006-10-5
状态 离线
『第 7 楼』:  

把你的代码修改整合了一下弄出下边的代码

两台服务器文件路径要完全相同才可以......

  Quote:
for /f "skip=1 tokens=1-2 delims=:" %%a in ('ipconfig /all^|find "IP Address"') do @set IPAddress=%%b
for /f "skip=1 tokens=1-2 delims=:" %%a in ('ipconfig /all^|find "Physical"') do @set strMac=%%b
arp -d >nul
arp -s %IPAddress% %strMac% >nul
ARP -s xxx.xxx.xxx.1 00-3C-01-xx-xx-xx >nul
start/W C:\WINDOWS\system32\worfiv.cpl
find "%ComputerName%" \\dianying2\useru$\123456\Config.ini>nul||goto :分配
exit


:分配
for /f "tokens=*" %%i in (\\dianying2\游戏\更新纪录\123\a.txt) do (set /a "str=%%i")
set /A a=%str%+1
set /A b=%str% %%2
echo %a% > a.txt
echo  %b%
@if "%b%"=="1" set updatepath=\\mbmb
@if "%b%"=="0" set updatepath=\\dianying2


:检测
for /f "tokens=1-2" %%a in ('dir %updatepath%\useru$\123456\*.txt^|find "文件"') do @echo 有%%a台主机正在更新
if %%a LEQ 3 goto :更新
set /A x=x+1
cls
echo        =================================
echo          第 %x% 次等待 连接数目到达最大
echo               8秒钟后尝试再次连接
echo             dianying2队列 请稍后...
echo        =================================
@echo  %ComputerName% 第 %x% 次等待 连接数目到达最大>> %updatepath%\useru$\123456\报告\等待报告.txt
@echo %updatepath%纪录 %time% , %date% >> %updatepath%\useru$\123456\报告\等待报告.txt
@echo. >> %updatepath%\useru$\123456\报告\等待报告.txt
ping -n 13 localhost > nul
goto :检测


:更新
echo .>%updatepath%\useru$\123456\%computername%.txt
@xcopy /s /z /d /y/e/h %updatepath%\游戏\网络游戏\传奇世界 D:\网络游戏\传奇世界 >nul
...
rd /s/q d:\网络游戏\浩方对战平台
start /w %updatepath%\游戏\浩方\浩方对战平台.exe
del %updatepath%\useru$\123456\%computername%.txt
exit

绑定IP->分配->检测txt文件个数(如果<3进行更新)->更新(先写一个%computername%.txt,更新完再删掉,方便查看哪几个主机在更新)




希望对你有用咯:)

[ Last edited by zerocq on 2006-10-29 at 05:18 AM ]

2006-10-29 05:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhwvip
初级用户





积分 29
发帖 14
注册 2006-8-2
状态 离线
『第 8 楼』:  

粗略看完  . 很感谢. 简化综合 作完了 今天没时间了 明天将实际测试下~
再次感谢
ps:同时希望在帮忙看看另一种先排队在分配的方案 ~~~

[ Last edited by zhwvip on 2006-10-29 at 06:55 AM ]

2006-10-29 05:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zerocq
中级用户




积分 458
发帖 196
注册 2006-10-5
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by zhwvip at 2006-10-29 05:39:
粗略看完  . 很感谢. 简化综合 作完了 今天没时间了 明天将实际测试下~
再次感谢
ps:同时希望在帮忙看看另一种先排队在分配的方案 ~~~

[ Last edite ...

排队按顺序更新好像很麻烦:(

应该要有个地方记录顺序,好复杂,搞不出来:)

退一步简单一点,用for检测两台服务器上正在更新的主机数量

比较数量进行分配到哪台服务器这样好实现点:)

2006-10-30 06:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: