中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何判断操作系统类别导入相应的注册表
作者:
标题: [已结]如何判断操作系统类别导入相应的注册表 上一主题 | 下一主题
suiyuanye
中级用户




积分 289
发帖 94
注册 2006-6-6
状态 离线
『楼 主』:  [已结]如何判断操作系统类别导入相应的注册表

判断操作系统类别的批处理,如下 ver >> c:\a.txt for /f "tokens=3 delims= " %%I in (c:\a.txt) do set %%I=a if %a%==98 do command1 if %a%==me do command1 if %a%==2000 do command2 if %a%==xp do command2 if %a%==2003 do command2 ################################ for /f "tokens=3 delims= " %%I in (c:\a.txt) 请问上面那个命令是如何在a.txt文件中取值的?因为我发现在98和XP下运行ver后输出内容的格式不统一,分别如下,会不会影响执行过程? Windows 98 [Version 4.10.2222] Microsoft Windows XP [版本 5.1.2600] [ Last edited by willsort on 2006-6-14 at 17:12 ]


   此帖被 -8 点积分      点击查看详情   


2006-6-8 10:26
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
bagpipe
银牌会员

DOS联盟捡破烂的


积分 1144
发帖 425
注册 2005-10-20
来自 北京
状态 离线
『第 2 楼』:  

我想楼主的代码中存在一些问题,例如do set %%I=a应该为set a=%%i,其实楼主没有必要这么麻烦把set a=%%i去掉,用%%i来判断也是可行的,如果楼主是用VER的返回信息作为判断标准,那么楼主判断是有一定难度的, Windows 98 [Version4.10.2222] Microsoft Windows XP [版本 5.1.2600] 按照楼主的语句%%i的值根本就判断不出来,取的部分也是不一样的,而且IF语句可以写到一行以精简语句,所以楼主的代码存在很多问题


2006-6-8 10:35
查看资料  发送邮件  访问主页  发短消息  网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 3 楼』:  

───────────────── 版主提示 ───────────────── 为了便于论坛用户浏览和版主管理,请您修改本主题的标题,以简要叙述主题的内容或意图 如果您确认标题不需要修改,请继续回复该主题进行申辩,若申辩理由充分,将取消该通知 如果您确认标题需要修改,请点击该主题首帖下方"编辑"按钮,在编辑页面中修改标题栏 如果此通知发出三日后您仍未进行申诉或修改,将由版主进行修改,并对作者进行相应处罚 处罚为扣除8点积分,包括追回您因发表主题奖励的6分和因标题违规而惩罚性扣除的2分 在得知您做出积极恰当的回应后,版主将在三个工作日内删除本提示以消除对您的不利影响 ───────────────── 版主提示 ───────────────── Re suiyuanye: 确实,你的代码存在一些比较重要的缺陷。 因为在98/Me的命令行中不提供 for/f 等许多命令扩展特性的支持,所以程序兼容的立足点无法得到保障。 判断系统版本最简单的方法是 ver | find "[系统版本1]" >nul if not errorlevel 1 goto [系统版本1处理代码] ver | find "[系统版本2]" >nul if not errorlevel 1 goto [系统版本1处理代码] ...... 但如果用于批处理代码中是否使用扩展特性的选择,则更常用的方法是 if "%OS%"=="Windows_NT" ... 因为绝大部分支持%OS%变量的命令行环境都支持命令扩展特性,但也有一些例外,比如关闭命令扩展的CMD/y命令行。如果需要考虑这个特殊的命令行环境,可以使用如下语句判别命令行环境。 if "%CmdExtVersion%"=="2" ... [ Last edited by willsort on 2006-6-8 at 11:22 ]




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-8 11:15
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
suiyuanye
中级用户




积分 289
发帖 94
注册 2006-6-6
状态 离线
『第 4 楼』:  

微软网站找到的 如何确定登录脚本中的 OS 类型 察看本文应用于的产品 文章编号 : 190899 最后修改 : 2004年12月15日 修订 : 3.1 概要 管理员往往喜欢仅在 Windows 95 或 Windows 98 客户端上或者仅在 Windows NT Workstation 客户端上运行软件。他们可能不想在 Windows NT Server 计算机上或域控制器上运行某些登录脚本命令。 更多信息 使用一个简单的批处理文件和一个很小的可执行文件,您就可以判断出客户端是下面的哪一种客户端: • Windows 95 或 Windows 98 客户端 • Windows NT Workstation • Windows 2000 Professional 安装 • Windows NT Server 非域控制器 • Windows 2000 Server 非域控制器 • Windows NT Server 域控制器 • Windows 2000 Server 域控制器 • Windows NT Enterprise/Terminal Server 域控制器 • Windows NT Enterprise/Terminal Server 非域控制器 将以下文本复制到一个批处理文件中: @echo off REM Batch file to detect OS REM ---------------------------------- if Windows_NT == %OS% goto WINNT echo You are not running Windows NT (Windows 95/98 perhaps?) goto END :WINNT gettype.exe if errorlevel=9 goto FILENOTFOUND echo You are running Windows NT. echo More Specifically: echo. if ERRORLEVEL=8 goto EIGHT if ERRORLEVEL=7 goto SEVEN if ERRORLEVEL=6 goto SIX if ERRORLEVEL=5 goto FIVE if ERRORLEVEL=4 goto FOUR if ERRORLEVEL=3 goto THREE if ERRORLEVEL=2 goto TWO if ERRORLEVEL=1 goto ONE :FILENOTFOUND echo. echo Gettype not found. echo. goto END :EIGHT echo Windows NT Enterprise/Terminal Server Non-Domain Controller goto END :SEVEN echo Windows NT Enterprise/Terminal Server Domain Controller goto END :SIX echo Windows 2000 Server Domain Controller goto END :FIVE echo Windows NT Server Domain Controller goto END :FOUR echo Windows 2000 Server Non-Domain Controller goto END :THREE echo Windows NT Server Non-Domain Controller goto END :TWO echo Windows 2000 Professional installation goto END :ONE echo Windows NT Workstation goto END :END pause 将 Gettype.exe 文件和该批处理文件复制到目标工作站并运行该批处理文件。 您可以安装 Windows 2000 Resource Kit 工具,然后便可从中获得 Gettype.exe 4.0 版。 Gettype.exe 的运行方式是,在注册表中查询安装类型并相应地设置 DOS ERRORLEVEL: • 如果安装类型是 Windows NT Workstation,就会返回 1。 • 如果安装类型是 Windows 2000 Professional,则返回 2。 • 如果安装类型是 Windows NT Server 非域控制器,则返回 3。 • 如果安装类型是 Windows 2000 Server 非域控制器,则返回 4。 • 如果安装类型是 Windows NT Server 域控制器,则返回 5。 • 如果安装类型是 Windows 2000 Server 域控制器,则返回 6。 • 如果安装类型是 Windows NT Enterprise/Terminal Server 域控制器,则返回 7。 • 如果安装类型是 Windows NT Enterprise/Terminal Server 非域控制器,则返回 8。 可以用 /s 参数来设置安静模式。您也可以对远程计算机运行此工具。 -------------------------------------------------------------------------------- 这篇文章中的信息适用于: • Microsoft Windows 2000 Advanced Server • Microsoft Windows 2000 Professional Edition • Microsoft Windows 2000 Server • Microsoft Windows NT Server 4.0 Terminal Server(终端服务器) • Microsoft Windows NT Server 3.51 • Microsoft Windows NT Server 4.0 Standard Edition • Microsoft Windows NT Workstation 3.51 • Microsoft Windows NT Workstation 4.0 开发员版 • Microsoft Windows NT Server 4.0 企业版 • Microsoft Windows 98 Standard Edition • Microsoft Windows 95


2006-6-8 11:52
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
suiyuanye
中级用户




积分 289
发帖 94
注册 2006-6-6
状态 离线
『第 5 楼』:  

我的水平差,看的不是太懂,我所要功能只是判断操作系统类别,分别导入自己的注册表文件。不懂是否使用扩展特性,高手说说 @echo off 如果是win98,winme,winNT,则运行regedit /s for98.reg 如果是2000,XP,2003,则运行regedit /s forxp.reg start startor.exe start /min privoxy.exe start sc32.exe


2006-6-8 11:59
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 6 楼』:  

Re suiyuanye: 如果仅是为导入注册表文件,且其中修改的注册表键值相同,则完全可以仅用98下的版本导入,因为2K/XP/2K3也支持REGEDIT4格式。 如果它们导入的键值不同,可以使用3楼提到的几种方法。建议使用变量%OS%[1]。但是,因为WinNT4.x也提供了系统变量%OS%,而它仅支持REGEDIT4格式的注册表,所以使用变量%OS%判断将无法兼容NT4。尽管事实上,我们的个人代码也很少提供对NT4的支持了。 不过,虽然现在我无法得知NT4的命令扩展版本号,但曾记得NT4的命令行默认不开启命令扩展,因此可以使用第三种方案[2],同时为了兼容更新的系统,我们略作改变,仅判断它是否存在,而不再判断其具体内容。 [1]
if "%OS%"=="Windows_NT" regedit /s forxp.reg
if "%OS%"=="" regedit /s for98.reg 
[2]
if not "%CmdExtVersion%"=="" regedit /s forxp.reg
if "%CmdExtVersion%"=="" regedit /s for98.reg




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-8 12:18
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
suiyuanye
中级用户




积分 289
发帖 94
注册 2006-6-6
状态 离线
『第 7 楼』:  

re: willsort  知道如何感谢你才好呢,你太让我happle了 这样吧,不用考虑NT了,只是这样, win98 winme运行regedit /s forxp.reg win2000 winXP win2003运行regedit /s for98.reg


2006-6-8 12:42
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 8 楼』:  

Re suiyuanye: 所有的方案我都已经给出,有考虑NT4的版本[1]和不考虑NT4的版本[2],不需要再重贴了。 另外,再次提请修改主题的标题。




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-8 12:46
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 9 楼』:  

re suiyuanye: 看下下面的命令满足要求不? for %os%#==# do regedit /s for98.reg for not %os%#==# do regedit /s forxp.reg




2006-6-8 13:14
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
suiyuanye
中级用户




积分 289
发帖 94
注册 2006-6-6
状态 离线
『第 10 楼』:  

这个问题,已经解决了,谢谢各位,


2006-6-8 13:45
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 11 楼』:  

───────────────── 版务记录 ───────────────── 执行:Will Sort 操作:修改标题 - 批处理文件的问题,请进。 说明:原主题作者在通知发出三日后仍未申诉或修改,由版主修改并进行处罚 处罚:扣除因发表该主题而奖励的6点积分,扣除标题违规惩罚性2点积分 ───────────────── 版务记录 ─────────────────




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-14 17:11
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
chainliq
高级用户

学无尽止


积分 635
发帖 244
注册 2006-4-15
来自 广西贵港
状态 离线
『第 12 楼』:  

@echo off start /s regedit "C:\Program Files\admin\解锁.reg" 请问这样为什么不能导入指定的注册表项呢


2006-9-20 16:47
查看资料  发送邮件  访问主页  发短消息  网志  OICQ (86682419)  编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 13 楼』:  

  如果是XP的系统,把 start 命令换成 regedit 就可以了,其他系统暂时没条件测试。




尺有所短,寸有所长,学好CMD没商量。 考虑问题复杂化,解决问题简洁化。
2006-9-21 00:31
查看资料  发短消息  网志   编辑帖子  回复  引用回复

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


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



论坛跳转: