【问题标题】:How can I use batch to determine what version of windows a computer is runing?如何使用批处理来确定计算机正在运行的 Windows 版本?
【发布时间】:2019-02-10 17:50:22
【问题描述】:

在编写脚本时,有必要确定计算机正在运行的 Windows 版本。唯一的问题是 Windows-10 和 Server-2016 具有相同的版本号

这是当前的代码。在这种状态下,Windows10 和 Server2016 被标识为相同的编号 wmic os get 输出 10.0.18329(不起作用)。

for /f "tokens=4-5 delims=. " %%i in ('ver') do set Operating=%%i.%%j
if "%Operating%" == "6.3" set Operating=Windows81
if "%Operating%" == "6.2" set Operating=Windows8
if "%Operating%" == "10.0" set Operating=Windows10
if "%Operating%" == "10.0" set Operating=Server2016
echo Is %Operating% your operating system?

我想做的是 parsewmic os get name 来获取操作系统名称。这显示了一些挑战,因为输出是多行并且在操作系统名称('Windows 10')之前和之后有任意数量的字符。


这是 wmic os get name 在 windows 10 pro 上的输出:

Name
Microsoft Windows 10 Pro|C:\WINDOWS|\Device\Harddisk1\Partition3

这是wmic os get name 在 Server 2016 上的输出:

Name                                                                       
Microsoft Windows Server 2016 Standard|C:\Windows|\Device\Harddisk0\Partition2

【问题讨论】:

  • 是什么阻止您像使用 VER 命令一样使用 FOR /F 命令捕获输出?

标签: windows batch-file scripting wmic


【解决方案1】:

我知道您已经选择了一个解决方案,但如果这与您提出的最后一个问题有关,现已删除,您只是想在Windows 8、@987654323 之间进行确定@、Windows 10Windows Server 2016 那么我会提出以下建议:

@Echo Off
Set "_S="
For /F "EOL=P Tokens=*" %%A In ('"WMIC OS Get ProductType,Version 2>Nul"'
) Do For /F "Tokens=1-3 Delims=. " %%B In ("%%A") Do Set /A _S=%%B,_V=%%C%%D
If Not Defined _S Exit /B
If %_V% Lss 62 Exit /B
If %_S% Equ 1 (If %_V% Equ 62 Set "_S=Windows8"
    If %_V% Equ 63 Set "_S=Windows81"
    If %_V% Equ 100 Set "_S=Windows10"
) Else If %_V% Equ 100 (Set "_S=Server2016") Else Exit /B
Set _S
Pause
Exit /B

[编辑 /]

...对于通用方法,您可能会发现这很有用,尤其是使用 Caption 属性 (我建议这比使用 Name 属性要好得多,将其拆分为第一个管道字符,通过另一个 For 循环运行它,然后删除一个或多个尾随空格字符)。:

@For /F Tokens^=6Delims^=^" %%A In ('WMIC OS Get Caption/Format:MOF')Do Set "_S=%%A"

要测试它,只需添加第二行:

@Set _S&Pause

注意:此方法在某些早期操作系统上可能会出现问题,因为存在阻止它们查找.xsl 文件位置的错误。 对此有一些解决方法,或者将.xsl 文件从您的“语言”目录复制到上一级,或者提供.xsl 文件的完整路径,例如/Format:"%__AppDir__%wbem\en-US\MOF.xsl".

【讨论】:

  • @compo.. 幸运的是您看到了之前的答案并且可以提供更好的解决方案,我将代表 OP 投票。
  • @Cutwow,我在我的答案中添加了一个编辑,因为我认为您认为可以通过使用不同的属性来改进您认为会帮助其他人的答案。 ...对于那些能够查看已删除问题的人,here's the question 最初提示了我的回答
【解决方案2】:

要不要直接...

@echo off
for /f "skip=1 delims=|" %%i in ('wmic os get name') do echo %%i & exit /b

【讨论】:

  • 这是另一个很棒的解决方案。 +1。您应该选择添加 pause 以查看值是否将通过双击运行。
【解决方案3】:

这很简单:

@echo off

for /F "skip=1 tokens=2-4 delims=| " %%A IN ('wmic os get name') do (
    set "os=%%A %%B %%C"
)

echo You are using %os%.

包含所有 Windows 版本的另一种可能的解决方案:

@echo off

for /F "skip=1 delims=|" %%A IN ('wmic os get name') do (
    for /F "delims=" %%B IN ("%%A") do (
        set "os=%%B"
    )
)

echo You are using %os:Microsoft =%.
pause
exit /b

这将提取操作系统,在两种情况下都在末尾减去 Microsoft<space>

在第二种情况下,使用了两个循环,因为wmic不寻常的行结尾 (<CR><CR><LF>)。

【讨论】:

  • @double-beep 是的,但是代码块会变得更慢,更多的 for 循环也是如此。在下面的情况下,每次循环运行时都会设置item,但是回车换行设置为变量,所以last会一直设置为变量名,因此设置一次比较容易,那么退出循环,不需要代码块。不管怎样,只是想帮忙,你已经得到了绿色标记。 :)
【解决方案4】:

你可以使用ver命令,这里是一个例子:

@echo off
for /f "useback delimes=;" %%a in (`ver`) do set ver=%%a
echo The computer version your running is %ver%

使用变量%ver%作为你正在运行的版本,我用它来echo这个版本但是你可以用它做任何事情

【讨论】:

  • OP 明确提到,ver 不起作用,因为 Windows10 和 Windows-Server 2016 显示相同的版本号
猜你喜欢
  • 1970-01-01
  • 2021-10-27
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多