Как уже упоминалось в комментариях под вашим вопросом, очевидное зависание вызвано тем, что вы настроили команду cmd для выполнения через параметр реестра AutoRun
команды cmd: [HKEY_LOCAL_MACHINE/HKEY_CURRENT_USER]\Software\Microsoft\Command Processor\AutoRun
При использовании for /F
для захвата выходных данных другой команды / программы будет вызываться неявный экземпляр cmd
для выполнения команды / программы, указанной в предложении IN for
.
Когда естьэто запись в параметре реестра AutoRun
команды cmd, которая в свою очередь неявный экземпляр 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 из Windows 2000 в Windows 10
Если вы не хотите использовать пакетный файл и предпочитаете поставитьоператор переходит в 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"