Board logo

标题: [已结]如何判断操作系统类别导入相应的注册表 [打印本页]

作者: suiyuanye     时间: 2006-6-8 10:26    标题: [已结]如何判断操作系统类别导入相应的注册表

判断操作系统类别的批处理,如下

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 ]
作者: bagpipe     时间: 2006-6-8 10:35
我想楼主的代码中存在一些问题,例如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语句可以写到一行以精简语句,所以楼主的代码存在很多问题
作者: willsort     时间: 2006-6-8 11:15

───────────────── 版主提示 ─────────────────
为了便于论坛用户浏览和版主管理,请您修改本主题的标题,以简要叙述主题的内容或意图
如果您确认标题不需要修改,请继续回复该主题进行申辩,若申辩理由充分,将取消该通知
如果您确认标题需要修改,请点击该主题首帖下方"编辑"按钮,在编辑页面中修改标题栏
如果此通知发出三日后您仍未进行申诉或修改,将由版主进行修改,并对作者进行相应处罚
处罚为扣除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 ]
作者: suiyuanye     时间: 2006-6-8 11:52
微软网站找到的

如何确定登录脚本中的 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
作者: suiyuanye     时间: 2006-6-8 11:59
我的水平差,看的不是太懂,我所要功能只是判断操作系统类别,分别导入自己的注册表文件。不懂是否使用扩展特性,高手说说

@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
作者: willsort     时间: 2006-6-8 12:18
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

作者: suiyuanye     时间: 2006-6-8 12:42
re: willsort  知道如何感谢你才好呢,你太让我happle了

这样吧,不用考虑NT了,只是这样,
win98 winme运行regedit /s forxp.reg
win2000 winXP win2003运行regedit /s for98.reg
作者: willsort     时间: 2006-6-8 12:46
Re suiyuanye:

      所有的方案我都已经给出,有考虑NT4的版本[1]和不考虑NT4的版本[2],不需要再重贴了。

      另外,再次提请修改主题的标题。
作者: 不得不爱     时间: 2006-6-8 13:14
re  suiyuanye:
     看下下面的命令满足要求不?
for  %os%#==# do regedit /s for98.reg
for not  %os%#==# do regedit /s forxp.reg
作者: suiyuanye     时间: 2006-6-8 13:45
这个问题,已经解决了,谢谢各位,
作者: willsort     时间: 2006-6-14 17:11

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

作者: chainliq     时间: 2006-9-20 16:47
@echo off
start /s regedit "C:\Program Files\admin\解锁.reg"

请问这样为什么不能导入指定的注册表项呢
作者: namejm     时间: 2006-9-21 00:31
  如果是XP的系统,把 start 命令换成 regedit 就可以了,其他系统暂时没条件测试。