无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 5277|回复: 16
打印 上一主题 下一主题

cmd + vbs +wmi 判断系统级别版本和类型

[复制链接]
跳转到指定楼层
1#
发表于 2016-5-30 09:21:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
cmd脚本:
  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. rem 本脚本用于确定当前nt5以上框架工作站系统的级别版本和类型,需vbs/wmi 支持

  4. >%temp%\verx.vbs  echo Set wmi=GetObject("winmgmts:\\.")
  5. >>%temp%\verx.vbs echo Set operation=wmi.instancesof(^"win32_Operatingsystem^")
  6. >>%temp%\verx.vbs echo For Each sys In operation
  7. >>%temp%\verx.vbs echo         WScript.Echo sys.caption^&","^&sys.Version^&","^&sys.OSArchitecture
  8. >>%temp%\verx.vbs echo Next

  9. set "winver=Unkonw"
  10. for /f "skip=2 delims=, tokens=1,2,3" %%c in ('cscript "%temp%\verx.vbs"') do (
  11.   echo %%c,%%d,%%e
  12.   echo ===========================================================
  13.   for /f "delims=. tokens=1,2" %%i in ("%%d") do (
  14.     if %%i.%%j equ 10.0 set "winver=Win_10"
  15.     if %%i.%%j equ 6.2  set "winver=Win_8"
  16.     if %%i.%%j equ 6.1  set "winver=Win_7"
  17.     if %%i.%%j equ 6.0  set "winver=Win_Vista"
  18.     if %%i.%%j equ 5.2  set "winver=Win_XP"
  19.     if %%i.%%j equ 5.1  set "winver=Win_XP"
  20.     if %%i.%%j equ 5.0  set "winver=Win_2K"
  21.   )
  22.   for /f "delims=- tokens=1" %%i in ("%%e") do (
  23.     set "winver=!winver!.%%i"
  24.     if %%i equ 32 set "winver=!winver:.%%i=.x86!"
  25.     if %%i equ 64 set "winver=!winver:.%%i=.x64!"
  26.   )
  27. )
  28. echo !winver!
复制代码


2#
发表于 2016-5-30 20:26:46 | 只看该作者
本帖最后由 nttwqz 于 2016-5-30 20:36 编辑

感觉还是太长了

  1. @echo off
  2. set PROCESSOR_ARCHITECTURE=%PROCESSOR_ARCHITECTURE:AMD64=x64%
  3. for /f "tokens=1-2 delims=." %%a in ('wmic os get version ^| findstr [0-9]') do set osver=%%a.%%b
  4. if %osver% equ 10.0 set "WINVER=Win10"
  5. if %osver% equ 6.3  set "WINVER=Win8.1"
  6. if %osver% equ 6.1  set "WINVER=Win7"
  7. if %osver% equ 5.2  set "WINVER=WinXP"
  8. echo %WINVER%_%PROCESSOR_ARCHITECTURE%
  9. pause
复制代码



其实吧,Win8、Vista、WinXP SP3以下的版本、Win2K现在几乎已经没人用了,可以略去。。。

点评

您好,感觉您这个代码通过批处理.cmd运行不错,简洁有效 但是如果是用.vbs的格式怎么写呢? 谢谢! 希望通过.vbs来实现判断系统版本和32/64位,然后分别来运行不同的程序(.cmd运行会有黑窗口)  详情 回复 发表于 2016-6-16 22:53
用 vbs 调用 wmi 显示 系统 name 目的是 为了 与 通过 version 得出的系统name最对比。 其实单独 获取 version 只需要 ver 命令 配套 for 就可以了,不用再有 第三个外部命令。  详情 回复 发表于 2016-5-30 21:36
回复

使用道具 举报

3#
 楼主| 发表于 2016-5-30 21:36:13 | 只看该作者
本帖最后由 dos时代菜鸟 于 2016-5-30 21:56 编辑
nttwqz 发表于 2016-5-30 20:26
感觉还是太长了


用 vbs 调用 wmi 显示 系统 name 目的是 为了 与 通过 version 得出的系统name对比。
其实单独 获取 version 只需要 ver 命令 配套 for 就可以了,不用再有 第三个外部命令。

而且 version 确定系统name 的方法本身需要参考 ms 的系统name与version列表,有的 server 版与 workstation 版 用一个version,而 xp 更是 有 5.1 5.2 两个version
更乱的是,还有 内部 BuildNumber

cmd 下 调用 wmic 的时候 ,wmic 有一个 bug 就是 在输出 文本流 时,每一行结尾都用 软回车+硬回车 两个符号表示换行,而 软回车符号 会在 脚本中参与 set 的变量设置。
所以,我在用 wmic 的 get 的时候 都会附带一个无用的字段同时 加 /format:csv参数,让无用字段来包含换行符号,避免要采集的数据字段包含换行符。
看来 你用 findstr 正则的方式解决 还不错,就是如果涉及 其他非数字的字段就要另想办法。

在 没有 wmi 的情况下 ,通过 vbs 获取系统版本,可以通过 vbs 获取 系统 explorer.exe 的文件版本 来确定系统version ,通过 明确系统是否存在 SysWOW64 文件夹 来确定 是否为 x64.

点评

其实我之前不是这样写的,之前写的比这要长,思路不同,看之前反向提取的脚本,你应该用的比我熟练,做法很简单。 后来还是觉得太长了,就换了个方法。 最开始我在XP上写,只用了一句,正常,但后来到  详情 回复 发表于 2016-5-30 22:10
回复

使用道具 举报

4#
发表于 2016-5-30 22:10:23 | 只看该作者
dos时代菜鸟 发表于 2016-5-30 21:36
用 vbs 调用 wmi 显示 系统 name 目的是 为了 与 通过 version 得出的系统name对比。
其实单独 获取 v ...
如果涉及 其他非数字的字段就要另想办法。


其实我之前不是这样写的,之前写的比这要长,思路不同,看之前反向提取的脚本,你应该用的比我熟练,做法很简单。

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set PROCESSOR_ARCHITECTURE=%PROCESSOR_ARCHITECTURE:AMD64=x64%
  4. for /f "skip=1 tokens=1-2 delims=." %%a in ('wmic os get version') do (
  5.         set /a n+=1
  6.         if !n!==1 set osver=%%a.%%b
  7. )
  8. echo %osver%
  9. pause
复制代码


后来还是觉得太长了,就换了个方法。

最开始我在XP上写,只用了一句,正常,但后来到了Win10上竟然有两行结果,第二行是个".",输入到文本才发现竟然有回车,太扯了,所以改了上面的方法,只要一行,就没有回车一说了,回来太长,用了findstr

  1. for /f "skip=1 tokens=1-2 delims=." %%a in ('wmic os get version') do echo %%a.%%b
复制代码


点评

关键就是 wmic 文本流 的换行符 太捣乱了。 如果 set abc=%%a.%%b 而 %%b 恰恰是该行的最后一个字段,就会把 换行符设置进变量。  详情 回复 发表于 2016-5-30 22:41
回复

使用道具 举报

5#
 楼主| 发表于 2016-5-30 22:41:36 | 只看该作者
本帖最后由 dos时代菜鸟 于 2016-5-30 22:55 编辑
nttwqz 发表于 2016-5-30 22:10
其实我之前不是这样写的,之前写的比这要长,思路不同,看之前反向提取的脚本,你应该用的比我熟练, ...


关键就是 wmic 文本流 的换行符 太捣乱了。
如果 set  abc=%%a.%%b 而 %%b 恰恰是该行的最后一个字段,就会把 换行符设置进变量。

用 ver + for
  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. for /f "delims=" %%c in ('ver')  do (for %%i in (%%c) do (for /f "delims=. tokens=1-2" %%l in ("%%i") do (set winver=%%l.%%m)))
  4. echo !winver!
  5. pause
复制代码

点评

乍看之下,好奇怪,运行了一下,明白了。 虽然 版本号前面的字符不少,但关键是版本号在最后面,而For中使用set只会将最后的值赋予winver,所以winver能显示最终的版本号,所以依然可以得到正确的结果,如果你把s  详情 回复 发表于 2016-5-31 00:01
回复

使用道具 举报

6#
发表于 2016-5-31 00:01:06 | 只看该作者
dos时代菜鸟 发表于 2016-5-30 22:41
关键就是 wmic 文本流 的换行符 太捣乱了。
如果 set  abc=%%a.%%b 而 %%b 恰恰是该行的最后一个字段 ...

乍看之下,好奇怪,运行了一下,明白了。

虽然 版本号前面的字符不少,但关键是版本号在最后面,而For中使用set只会将最后的值赋予winver,所以winver能显示最终的版本号,所以依然可以得到正确的结果,如果你把set winver=换成echo,那就不会仅显示版本号了……

还是觉得 for /f "tokens=1-2 delims=." %%a in ('wmic os get version ^| findstr [0-9]') do set osver=%%a.%%b 比较好,用ver长了点,要三个for才能得到版本号,打算用这个替代之前自动安装脚本中的判断方法,看看使用效果如何。

点评

嗯,好的。 各有侧重。呵呵, ver 是内部命令,而for 也是内部脚本支持,所以运行上效率并不差。而且可以避免 没有wmi 和findstr 的系统。 如果是用于安装,又何必把 版本号转换成 系统name ? 直接在 脚本中  详情 回复 发表于 2016-5-31 06:56
回复

使用道具 举报

7#
 楼主| 发表于 2016-5-31 06:56:52 | 只看该作者
nttwqz 发表于 2016-5-31 00:01
乍看之下,好奇怪,运行了一下,明白了。

虽然 版本号前面的字符不少,但关键是版本号在最后面,而For ...

嗯,好的。

各有侧重。呵呵,
ver 是内部命令,而for 也是内部脚本支持,所以运行上效率并不差。而且可以避免 没有wmi 和findstr 的系统。

如果是用于安装,又何必把 版本号转换成 系统name ? 直接在 脚本中设置以 版本号 为 段名称不就得了? 到时候直接 goto 版本号段。

比如:
  1. goto !winver!
  2. :5.0_x32
  3.    rem win2k
  4. :5.2_x32
  5.    rem winxp
  6. :6.0_x32
  7.    rem win_vista
  8. .........

复制代码

点评

PE中肯定是for ver更合适,其实我也不知道你这么写有何意义,我原来分段,现在用条件语句判断,因为不同的系统不通用的只是一少部分,下面是脚本中的一段  详情 回复 发表于 2016-5-31 08:50
回复

使用道具 举报

8#
发表于 2016-5-31 08:50:45 来自手机 | 只看该作者
dos时代菜鸟 发表于 2016-5-31 06:56
嗯,好的。

各有侧重。呵呵,

PE中肯定是for ver更合适,其实我也不知道你这么写有何意义,我原来分段,现在用条件语句判断,因为不同的系统不通用的只是一少部分,下面是脚本中的一段

  1. rem Win8以上系统自定IE的Flash插件,故仅Win7及以下系统安装
  2. if !ver! LEQ 6.1 start /wait install_flash_player_ax.exe /install

  3. rem 根据不同的系统类型,安装不同的WinRAR
  4. if /i "%osarch%"=="x86" start wrar531sc.exe /S
  5. if /i "%osarch%"=="x64" start winrar-x64-531sc.exe /S
  6. xcopy .\reg\rarreg.key "%programfiles%\WinRAR" /q /y>nul 2>nu
复制代码
回复

使用道具 举报

9#
发表于 2016-6-16 22:53:22 | 只看该作者
nttwqz 发表于 2016-5-30 20:26
感觉还是太长了

您好,感觉您这个代码通过批处理.cmd运行不错,简洁有效
但是如果是用.vbs的格式怎么写呢? 谢谢!

希望通过.vbs来实现判断系统版本和32/64位,然后分别来运行不同的程序(.cmd运行会有黑窗口)

点评

我不会VBS,你问问@dos时代菜鸟  详情 回复 发表于 2016-6-17 00:21
回复

使用道具 举报

10#
发表于 2016-6-16 23:34:26 | 只看该作者
代码有点长。呵呵。
回复

使用道具 举报

11#
发表于 2016-6-17 00:21:38 | 只看该作者
netmjwork 发表于 2016-6-16 22:53
您好,感觉您这个代码通过批处理.cmd运行不错,简洁有效
但是如果是用.vbs的格式怎么写呢? 谢谢!

我不会VBS,你问问@dos时代菜鸟
回复

使用道具 举报

12#
发表于 2016-6-18 12:38:15 | 只看该作者
不错。。越来越简
回复

使用道具 举报

13#
发表于 2016-6-23 23:51:08 | 只看该作者
最近发现,批处理对数值运算和小数支持不好,简单的if 10.0 gtr 6.1 比较不出来10.0比6.1大的正确结果。

所以,对系统版本判断做了修改,去掉版本号中的“.”,这样小数变整数,if 100 gtr 61 便不会出错了

  1. @echo off
  2. for /f "tokens=1,2 delims=." %%a in ('wmic os get version ^| findstr "[0-9]"') do set osver=%%a%%b
  3. if %osver% gtr 62 (echo 当前是Win8及以上系统) else (echo 当前是Win8以下系统)
  4. if %osver% lss 100 echo 您是Win10以下系统。
  5. pause
复制代码
回复

使用道具 举报

14#
发表于 2016-6-26 20:05:11 | 只看该作者
谢楼主分享~~~
回复

使用道具 举报

15#
发表于 2016-7-20 00:51:35 | 只看该作者
学习了~~
回复

使用道具 举报

16#
发表于 2016-8-10 14:42:40 | 只看该作者
学习下,支持了
回复

使用道具 举报

17#
发表于 2016-9-4 00:38:33 | 只看该作者

楼主辛苦 谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-27 13:56

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表