中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 18:55
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何判断操作系统类别导入相应的注册表
楼 主 [已结]如何判断操作系统类别导入相应的注册表 发表于 2006-06-08 10:26 ·  中国 陕西 榆林 电信
中级用户
★★
积分 289
发帖 94
注册 2006-06-06 00:00
UID 56670
性别 男
状态 离线
判断操作系统类别的批处理,如下

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

Microsoft Windows XP

[ Last edited by willsort on 2006-6-14 at 17:12 ]
2 发表于 2006-06-08 10:35 ·  中国 北京 联通
银牌会员
★★★
DOS联盟捡破烂的
积分 1,144
发帖 425
注册 2005-10-20 00:00
UID 43784
来自 北京
状态 离线
我想楼主的代码中存在一些问题,例如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语句可以写到一行以精简语句,所以楼主的代码存在很多问题
3 发表于 2006-06-08 11:15 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线

───────────────── 版主提示 ─────────────────
为了便于论坛用户浏览和版主管理,请您修改本主题的标题,以简要叙述主题的内容或意图
如果您确认标题不需要修改,请继续回复该主题进行申辩,若申辩理由充分,将取消该通知
如果您确认标题需要修改,请点击该主题首帖下方"编辑"按钮,在编辑页面中修改标题栏
如果此通知发出三日后您仍未进行申诉或修改,将由版主进行修改,并对作者进行相应处罚
处罚为扣除8点积分,包括追回您因发表主题奖励的6分和因标题违规而惩罚性扣除的2分
在得知您做出积极恰当的回应后,版主将在三个工作日内删除本提示以消除对您的不利影响
───────────────── 版主提示 ─────────────────



Re suiyuanye:

确实,你的代码存在一些比较重要的缺陷。

因为在98/Me的命令行中不提供 for/f 等许多命令扩展特性的支持,所以程序兼容的立足点无法得到保障。

判断系统版本最简单的方法是
ver | find "" >nul
if not errorlevel 1 goto
ver | find "" >nul
if not errorlevel 1 goto
......

但如果用于批处理代码中是否使用扩展特性的选择,则更常用的方法是
if "%OS%"=="Windows_NT" ...

因为绝大部分支持%OS%变量的命令行环境都支持命令扩展特性,但也有一些例外,比如关闭命令扩展的CMD/y命令行。如果需要考虑这个特殊的命令行环境,可以使用如下语句判别命令行环境。
if "%CmdExtVersion%"=="2" ...


[ Last edited by willsort on 2006-6-8 at 11:22 ]
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
4 发表于 2006-06-08 11:52 ·  中国 陕西 榆林 电信
中级用户
★★
积分 289
发帖 94
注册 2006-06-06 00:00
UID 56670
性别 男
状态 离线
微软网站找到的

如何确定登录脚本中的 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
5 发表于 2006-06-08 11:59 ·  中国 陕西 榆林 电信
中级用户
★★
积分 289
发帖 94
注册 2006-06-06 00:00
UID 56670
性别 男
状态 离线
我的水平差,看的不是太懂,我所要功能只是判断操作系统类别,分别导入自己的注册表文件。不懂是否使用扩展特性,高手说说

@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
6 发表于 2006-06-08 12:18 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re suiyuanye:

如果仅是为导入注册表文件,且其中修改的注册表键值相同,则完全可以仅用98下的版本导入,因为2K/XP/2K3也支持REGEDIT4格式。

如果它们导入的键值不同,可以使用3楼提到的几种方法。建议使用变量%OS%。但是,因为WinNT4.x也提供了系统变量%OS%,而它仅支持REGEDIT4格式的注册表,所以使用变量%OS%判断将无法兼容NT4。尽管事实上,我们的个人代码也很少提供对NT4的支持了。

不过,虽然现在我无法得知NT4的命令扩展版本号,但曾记得NT4的命令行默认不开启命令扩展,因此可以使用第三种方案,同时为了兼容更新的系统,我们略作改变,仅判断它是否存在,而不再判断其具体内容。


if "%OS%"=="Windows_NT" regedit /s forxp.reg
if "%OS%"=="" regedit /s for98.reg



if not "%CmdExtVersion%"=="" regedit /s forxp.reg
if "%CmdExtVersion%"=="" regedit /s for98.reg
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
7 发表于 2006-06-08 12:42 ·  中国 陕西 榆林 电信
中级用户
★★
积分 289
发帖 94
注册 2006-06-06 00:00
UID 56670
性别 男
状态 离线
re: willsort  知道如何感谢你才好呢,你太让我happle了

这样吧,不用考虑NT了,只是这样,
win98 winme运行regedit /s forxp.reg
win2000 winXP win2003运行regedit /s for98.reg
8 发表于 2006-06-08 12:46 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re suiyuanye:

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

另外,再次提请修改主题的标题。
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
9 发表于 2006-06-08 13:14 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
UID 42843
性别 男
来自 四川南充
状态 离线
re suiyuanye:
看下下面的命令满足要求不?
for %os%#==# do regedit /s for98.reg
for not %os%#==# do regedit /s forxp.reg
10 发表于 2006-06-08 13:45 ·  中国 陕西 榆林 电信
中级用户
★★
积分 289
发帖 94
注册 2006-06-06 00:00
UID 56670
性别 男
状态 离线
这个问题,已经解决了,谢谢各位,
11 发表于 2006-06-14 17:11 ·  中国 山西 太原 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线

───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:修改标题 - 批处理文件的问题,请进。
说明:原主题作者在通知发出三日后仍未申诉或修改,由版主修改并进行处罚
处罚:扣除因发表该主题而奖励的6点积分,扣除标题违规惩罚性2点积分
───────────────── 版务记录 ─────────────────
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
12 发表于 2006-09-20 16:47 ·  中国 广西 贵港 电信
高级用户
★★
学无尽止
积分 635
发帖 244
注册 2006-04-15 05:07
UID 53857
性别 男
来自 广西贵港
状态 离线
@echo off
start /s regedit "C:\Program Files\admin\解锁.reg"

请问这样为什么不能导入指定的注册表项呢
13 发表于 2006-09-21 00:31 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  如果是XP的系统,把 start 命令换成 regedit 就可以了,其他系统暂时没条件测试。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
论坛跳转: