无忧启动论坛

标题: 求一个VBS脚本:根据“系统版本号+32/64位系统”分别运行相应程序 [打印本页]

作者: netmjwork    时间: 2016-6-16 23:50
标题: 求一个VBS脚本:根据“系统版本号+32/64位系统”分别运行相应程序
本帖最后由 netmjwork 于 2016-6-26 09:19 编辑

求一个VBS脚本:自动判断“系统版本号+32/64位系统” ,然后分别运行相应程序

比如:(根据版本号来判断系统类型,5.1、5.2是XP,6.3是win8.1,10.0是win10 )

当判断当前系统是“winxp_x32”时运行 A.exe

当判断当前系统是“win8.1_x32”时运行 B.exe

当判断当前系统是“win10_x64”时运行 C.exe
作者: 2010siril    时间: 2016-6-17 12:14
类似的我弄过,   贴出来供参考:

Set wshshell=wscript.createobject("wscript.shell")
appname = Left(WScript.ScriptFullName, InstrRev(WScript.ScriptFullName, "\")-1)
appname = right(appname, Len(appname)-InstrRev(appname, "\"))
arch=32
If wshshell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%")="AMD64" Then arch=64
wshshell.run(appname &  arch & ".exe")

比如 有个 Recuva 目录, 里面有  Recuva32.exe 和 Recuva64.exe 和Recuva.vbs,  双击recuva.vbs执行对应的程序。


获取系统版本号有待大神补充
作者: lkflsj    时间: 2016-6-17 12:31
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
    For Each objItem in colItems
      strOScaption=objitem.Caption
      strOSversion=objitem.Version
    Next
    select case strOSversion
    case "5.2.3790"
    wscript.echo "Windows Server 2003"
    case "5.0.2195"
    wscript.echo "Windows 2000"
    case "5.1.2600"
    wscript.echo "Windows XP"
    case "6.0.6001"
    wscript.echo "windows visita"
    case "6.1.7601"
    wscript.echo "windows 7"
    case else
    wscript.echo "i don't know"
    end select

保存为VBS脚本就可以了
作者: netmjwork    时间: 2016-6-17 13:54
lkflsj 发表于 2016-6-17 12:31
strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2" ...

谢谢!
这个是显示版本号的,但是怎么组合到一起实现我希望的效果呢?水平有限,不会“组合”……
帮忙举一个完整的实例,多谢了!

当判断当前系统是“win10_x64”时运行 C.exe
作者: netmjwork    时间: 2016-6-17 13:55
2010siril 发表于 2016-6-17 12:14
类似的我弄过,   贴出来供参考:

Set wshshell=wscript.createobject("wscript.shell")

现在就缺怎么把版本号和32/64的判断组合到一起……
作者: lkflsj    时间: 2016-6-17 14:23
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
    For Each objItem in colItems
      strOScaption=objitem.Caption
      strOSversion=objitem.Version
    Next
    select case strOSversion
    case "5.2.3790"
    wscript.echo "Windows Server 2003"
    case "5.0.2195"
    wscript.echo "Windows 2000"
    case "5.1.2600"
    wscript.echo "Windows XP"
    case "6.0.6001"
    wscript.echo "windows visita"
    case "6.1.7601"
    wscript.echo "windows 7"
    dim wsh
    set wsh=wscript.createobject("wscript.shell")
    wsh.run "notepad.exe"
    case else
    wscript.echo "i don't know"
    end select
作者: pogua007    时间: 2016-6-18 16:34
netmjwork 发表于 2016-6-17 13:54
谢谢!
这个是显示版本号的,但是怎么组合到一起实现我希望的效果呢?水平有限,不会“组合”……
帮忙 ...

汗,把  wscript.echo "windows visita"之类的改为你wscript.run 你的的程序。
我不记得你会写run的吗,你上次提问的脚本里面就有。
作者: netmjwork    时间: 2016-6-19 12:39
pogua007 发表于 2016-6-18 16:34
汗,把  wscript.echo "windows visita"之类的改为你wscript.run 你的的程序。
我不记得你会写run的吗, ...

多谢回复~

case "5.1.2600"
    wscript.echo "Windows XP"
改成:
case "5.1.2600"
    wscript.run 程序  ……

但是这样只能实现:判断是什么系统,我来运行什么程序

我希望的效果是:判断是什么系统,并且是32位还是64位,同时满足了再运行什么程序,这个我不知道怎么组合……


作者: pogua007    时间: 2016-6-19 14:35
本帖最后由 pogua007 于 2016-6-19 14:47 编辑
netmjwork 发表于 2016-6-19 12:39
多谢回复~

case "5.1.2600"


.SystemType,属性是判断系统是否64位的,我把3楼和6楼的脚本改一下
  1. strComputer = "."
  2.     Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")
  3.     Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
  4.     For Each objItem in colItems
  5.       strOScaption=objitem.Caption
  6.       strOSversion=objitem.Version
  7.       strOSsystype=objitem.SystemType
  8.     Next
  9.     dim wsh
  10.     set wsh=wscript.createobject("wscript.shell")
  11.     If InStr( strOSsystype, "86") <> 0 Then
  12.        select case strOSversion
  13.        case "5.2.3790"
  14.            wscript.echo "Windows Server 2003" & "32位"
  15.        case "5.0.2195"
  16.            wscript.echo "Windows 2000" & "32位"
  17.        case "5.1.2600"
  18.             wscript.echo "Windows XP" & "32位"
  19.        case "6.0.6001"
  20.            wscript.echo "windows visita" & "32位"
  21.        case "6.1.7601"
  22.            wscript.echo "windows 7" & "32位"
  23.            wsh.run "Win7_32.exe"
  24.        case else
  25.            wscript.echo "未知的32位系统"
  26.        end select
  27.     elseif InStr(strOSsystype, "64") <> 0 Then
  28.        select case strOSversion
  29.        case "5.2.3790"
  30.            wscript.echo "Windows Server 2003" & "64位"
  31.        case "5.0.2195"
  32.            wscript.echo "Windows 2000" & "64位"
  33.        case "5.1.2600"
  34.             wscript.echo "Windows XP" & "64位"
  35.        case "6.0.6001"
  36.            wscript.echo "windows visita" & "64位"
  37.        case "6.1.7601"
  38.            wscript.echo "windows 7" & "64位"
  39.            wsh.run "Win7_64.exe"
  40.        case else
  41.            wscript.echo "未知的64位系统"
  42.        end select
  43.     else
  44.        wscript.echo "不知道32位还是64位的"
  45.     end if
复制代码

把select case写到Function(函数)里面代码更简洁,但是考虑你是新手,我想还是别出现更多的知识点了,代码累赘点就累赘点吧。
作者: netmjwork    时间: 2016-6-19 18:15
pogua007 发表于 2016-6-19 14:35
.SystemType,属性是判断系统是否64位的,我把3楼和6楼的脚本改一下

把select case写到Function(函 ...

确实刚开始接触,很多地方不太懂,只能从简易的来入手……
方便的话给下“把select case写到Function(函数)里面”的代码,学习学习怎么来简化,多谢!
作者: netmjwork    时间: 2016-6-20 11:11
pogua007 发表于 2016-6-19 14:35
.SystemType,属性是判断系统是否64位的,我把3楼和6楼的脚本改一下

把select case写到Function(函 ...

您好,刚测试,无法运行,XP系统

7行报错: 对象不支持此属性或方法 'objitem.SystemType'
作者: pogua007    时间: 2016-6-20 15:43
本帖最后由 pogua007 于 2016-6-21 20:22 编辑
netmjwork 发表于 2016-6-20 11:11
您好,刚测试,无法运行,XP系统

7行报错: 对象不支持此属性或方法 'objitem.SystemType'


我在整我的WES7+bblean,整的正happy,突然虚拟磁盘文件损坏,我把虚拟磁盘拆开,也没有恢复的了数据。
玩了两天游戏,才从数据损坏的打击中恢复。
  1. strComputer = "."
  2. dim wsh
  3. set wsh=wscript.createobject("wscript.shell")
  4. 'wscript.echo OSver(strComputer) & X86orX64(strComputer) & ".exe"
  5. wsh.run OSver(strComputer) & X86orX64(strComputer) & ".exe"

  6. Function X86orX64(strComputer)
  7.         Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")
  8.         Set colItems = objWMIService.ExecQuery("Select * from Win32_ComputerSystem") ''尼玛是否64位和版本号不是一个查询,所以上次出错
  9.         For Each objItem in colItems
  10.                 strOSsystype=objitem.SystemType
  11.         Next
  12.         set objWMIService = nothing
  13.         set colItems = nothing
  14.         If InStr( strOSsystype, "86") <> 0 Then
  15.                 X86orX64="_x86"
  16.         elseif InStr(strOSsystype, "64") <> 0 Then
  17.                 X86orX64="_x64"
  18.         else
  19.                 wscript.echo "不知道32位还是64位的"
  20.                 wscript.quit
  21.         end if
  22. End Function

  23. Function OSver(strComputer)
  24.         Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")
  25.         Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
  26.         For Each objItem in colItems
  27.                 strOScaption=objitem.Caption
  28.                 strOSversion=objitem.Version
  29.         Next
  30.         set objWMIService = nothing
  31.         set colItems = nothing
  32.         select case strOSversion
  33.                 case "5.2.3790"
  34.                         OSver = "2K3"
  35.                 case "5.0.2195"
  36.                         OSver =  "2K"
  37.                 case "5.1.2600"
  38.                         OSver = "XP"
  39.                 case "6.0.6001"
  40.                         OSver = "visita"
  41.                 case "6.1.7601"
  42.                         OSver = "W7"
  43.                 case else
  44.                         wscript.echo "未知的操作系统"
  45.                         wscript.quit
  46.         end select
  47. End Function
复制代码

作者: netmjwork    时间: 2016-6-21 16:12
pogua007 发表于 2016-6-20 15:43
我在整我的WES7+bblean,整的正happy,突然虚拟磁盘文件损坏,我把虚拟磁盘拆开,也没有恢复的了数据。 ...

虚拟磁盘操作还得随时备份数据,raid这种都需要小心操作,都是不好恢复数据的……
调整好心情~

另,我这里没法运行,上半段运行报错: 类型不匹配 'OSver' ; 下半段儿单独放一个空的vbs运行没有任何提示……
也可能我不会用……

多谢您的帮助~
作者: pogua007    时间: 2016-6-21 17:54
本帖最后由 pogua007 于 2016-6-21 17:56 编辑
netmjwork 发表于 2016-6-21 16:12
虚拟磁盘操作还得随时备份数据,raid这种都需要小心操作,都是不好恢复数据的……
调整好心情~


汗!那是一整个的脚本,你给拆开,当然报错。
主程序就前面的5行,后面两个Function都是主程序的子过程。你把OSver过程删掉,当然出错,后面的Function没有主程序也当然没有反应。
这次的脚本我测试过的,'wscript.echo OSver(strComputer) & X86orX64(strComputer) & ".exe",就是我的测试语句,我都没有删掉,只是给注释了起来。
作者: netmjwork    时间: 2016-6-21 18:30
pogua007 发表于 2016-6-21 17:54
汗!那是一整个的脚本,你给拆开,当然报错。
主程序就前面的5行,后面两个Function都是主程序的子过 ...

这次明白了,新手容易闹笑话,呵呵……

多谢!
作者: netmjwork    时间: 2016-6-21 19:07
本帖最后由 netmjwork 于 2016-6-21 19:19 编辑
pogua007 发表于 2016-6-21 17:54
汗!那是一整个的脚本,你给拆开,当然报错。
主程序就前面的5行,后面两个Function都是主程序的子过 ...


刚发现一个问题:版本号能不能不那么精确的来判断?只判断前面大的数字即可

比如:                case "5.1.2600"   就必须完全是这个值才行,如果是 case "5.1."就不行了
之前在dos里的批处理就是“ver|find "5.1." >nul&&set "v=xp"”  这样写的,不管“5.1.”后面的数字多少,都判断为xp系统

怎么实现:只判断前面能判断系统类型就行了,后面的build号不用判断,这样方便,win10的build 更多,一是不知道有多少版本,二来全部写也比较麻烦


另外:您下面这句起什么作用呢,怎么来应用,是不是能够替换 if then 的效果?
wsh.run OSver(strComputer) & X86orX64(strComputer) & ".exe"

作者: pogua007    时间: 2016-6-21 20:27
netmjwork 发表于 2016-6-21 19:07
刚发现一个问题:版本号能不能不那么精确的来判断?只判断前面大的数字即可

比如:                 ...

运行程序啊, OSver(strComputer)传递参数strComputer给Function OSver,获得返回字符串系统版本,X86orX64(strComputer)传递参数传递参数strComputer给Function X86orX64获得返回字符串"_x86"或者"_x64"。
你把这句前面加单引号注释掉,然后把上面的那一句的单引号删除,测试一下看看,会显示一个字符串,在不同的系统中,这个字符串是不一样的,这就是要运行的程序了。
你要运行的程序以 “系统版本”+"_x86/x64"+".exe"这样的规则命名,就可以实现根据系统不同运行不同的程序了。如果程序不方便改名等,可以用以上述规则命名的快捷方式实现,把.exe改为.lnk。
这句只是个示例,具体的路径还需要处理的。
不比较小版本号,那要对字符串处理一下。把]Function OSver部分改成下面内容
  1. Function OSver(strComputer)
  2.         Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")
  3.         Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
  4.         For Each objItem in colItems
  5.                 strOScaption=objitem.Caption
  6.                 strOSversion=objitem.Version
  7.         Next
  8.         set objWMIService = nothing
  9.         set colItems = nothing
  10.         strOSversion=left(strOSversion,InStrRev(strOSversion,".",-1,1) - 1) ''截取strOSversion为最后一个"."的左面部分
  11.         select case strOSversion
  12.                 case "5.2"
  13.                         OSver = "2K3"
  14.                 case "5.0"
  15.                         OSver =  "2K"
  16.                 case "5.1"
  17.                         OSver = "XP"
  18.                 case "6.0"
  19.                         OSver = "visita"
  20.                 case "6.1"
  21.                         OSver = "W7"
  22.                 case else
  23.                         wscript.echo "未知的操作系统"
  24.                         wscript.quit
  25.         end select
  26. End Function
复制代码

作者: netmjwork    时间: 2016-6-21 21:47
pogua007 发表于 2016-6-21 20:27
运行程序啊, OSver(strComputer)传递参数strComputer给Function OSver,获得返回字符串系统版本,X86orX ...

非常感谢!

我再添加命令就可以用了,跟您学习不少~
作者: 青青草    时间: 2016-6-25 00:17
如果不进入系统,比如,在grub2,可不可以判断本地硬盘系统版本号+32/64位系统?
谢谢!
作者: 窄口牛    时间: 2016-6-25 11:40
legacy下应该可以,efi下困难。




欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3