windows - 从批处理文件中调用 FOR 表达式中的“ver”会冻结 Windows 10 中的 cmd
问题描述
我正在尝试从批处理文件中检查操作系统版本,但遇到了以下问题。
线
FOR /F "tokens=*" %%i IN ('ver') DO (SET var=%%i)
从批处理文件执行时将冻结 cmd 而命令ver
本身(在同一个批处理文件中)执行没有问题。(ver
具有以下输出。)
Microsoft Windows [Version 10.0.18362.356]
表达中可能有什么问题?
解决方案
正如您在问题下方的评论中提到的那样,明显的冻结是由于您已将 cmd 语句设置为通过 cmd 的AutoRun
注册表设置执行:[HKEY_LOCAL_MACHINE/HKEY_CURRENT_USER]\Software\Microsoft\Command Processor\AutoRun
当for /F
用于捕获另一个命令/程序的输出时,cmd
将调用 的隐式实例来执行for
IN 子句中引用的命令/程序。
当 cmd 的AutoRun
注册表设置中有一个条目时,该隐式cmd
实例将依次执行AutoRun
命令,并且在您的情况下,该AutoRun
命令将cmd
通过该for /F
命令执行另一个实例。您会看到它的发展方向:cmd
将启动无限的嵌套 s 链,直到耗尽系统资源。
为避免陷入无限循环,您需要防止语句执行多次
这是一种编写为批处理文件的方法:
:: This batch file can be safely executed through cmd's Autorun
@echo off
if not defined WinVer (
set "WinVer=AutorunGuard"
for /F "tokens=1* delims=[" %%A in ('ver') do (
for /F "tokens=2 delims=] " %%V in ("%%B") do set "WinVer=%%V"
)
)
我还扩展了提取 windows 版本的方法,只包含版本号,而不是返回的整个版本字符串ver
它可以用来提取从 Windows 2000 到 Windows 10 的 windows 版本的版本号
如果您不想使用批处理文件,并且更喜欢将语句海峡放入AutoRun
注册表设置,则可以使用此单行代码:
@if not defined WinVer set "WinVer=AutorunGuard" & for /F "tokens=1* delims=[" %A in ('ver') do @for /F "tokens=2 delims=] " %V in ("%B") do @set "WinVer=%V"
推荐阅读
- string - 在某些条件下提取字符串中的子字符串
- security - 在 GET 请求中的 nginx access.log 中找到的 URL
- mongodb - 远程访问MongoDB集群
- excel - 在“for each”语句期间就地修改集合和数组的预期行为
- android - 如何在本机反应中调整整个屏幕的大小?
- java - 即使我从不安全的路由中抛出响应代码为 400 的自定义异常,Spring Security 也会返回 403 Forbidden 异常
- postgresql - 如何在 Postgresql 中创建通过公钥/私钥而不是密码验证的用户
- android - 如何使用 MyDrawer 功能?
- flutter - 如何在flutter中实现这样的过渡效果?
- javascript - 错误 TS2345:“X”类型的参数不可分配给“QueryDeepPartialEntity”类型的参数
'