如果你只需要主版本号和次版本号,可以通过
powershell来获取,那么只返回这两个数似乎更合理,而不是之后再解析结果。
For /F %%G In ('^""%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" ^
-NoProfile -NoLogo -Command "[System.Environment]::OSVersion.Version | " ^
"ForEach-Object { '{0}.{1}' -F $_.Major,$_.Minor }"^"') Do Set "OSVar=%%G"
作为一行代码:
For /F %%G In ('%__AppDir__%WindowsPowerShell\v1.0\powershell.exe -NoP "[System.Environment]::OSVersion.Version|%%{'{0}.{1}' -F $_.Major,$_.Minor}"')Do Set "OSVar=%%G"
如果您真的想坚持使用
powershell和
Get-CimInstance
:
For /F %%G In ('^""%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP ^
"(Get-CimInstance Win32_OperatingSystem).Version.Split('.')[0,1] -Join '.'"^"'
) Do Set "OSVar=%%G"
作为一行代码:
For /F %%G In ('%__AppDir__%WindowsPowerShell\v1.0\powershell.exe -NoP "(GCim Win32_OperatingSystem).Version.Split('.')[0,1] -Join '.'"')Do Set "OSVar=%%G"
然而,如果您更喜欢在检索后在do
部分解析它,则我建议使用比使用标记和分隔符更简单的方法:
For /F %%G In ('^""%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" ^
-NoProfile -NoLogo "(Get-CimInstance Win32_OperatingSystem).Version"^"'
) Do Set "OSVar=%%~nG"
作为一行代码:
For /F %%G In ('%__AppDir__%WindowsPowerShell\v1.0\powershell.exe -NoP "(GCim Win32_OperatingSystem).Version"')Do Set "OSVar=%%~nG"
在前两个示例中,
.BuildNumber
被视为扩展名,因此可以使用元变量扩展返回没有扩展名的名称。
然而,您不需要 powershell 来获取 WMI 信息,您可以使用 wmic 替代:
For /F %%G In ('"%__AppDir__%wbem\WMIC.exe" OS Get Version'
) Do If "%%~xG" NEq "" Set "OSVar=%%~nG"
再次作为一行代码:
For /F %%G In ('%__AppDir__%wbem\WMIC.exe OS Get Version')Do If "%%~xG" NEq "" Set "OSVar=%%~nG"
1,2
1,2,3*等一起使用。我更新了答案来证明它
:)这是元变量的用法。我们将第一个点值分配给令牌1(元变量
%%i),将第二个值分配给令牌2(元变量
%%j)。在这里,您不能使用余数,因为我们没有将其分配给令牌。因此,
echo %%k将导致
%%k`。只有告诉系统之后的所有内容都应分配给另一个令牌,它才能使用它。 - Gerhardtokens=1,2
是有效的,尽管我发誓以前用过相同的语法。这表明有时候你只需要上网抱怨一下,它就会开始工作了,但还是谢谢你的解释! - Chocobits