|
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 |
|