DOS Отсроченное расширение в командной строке
Я задавал другие вопросы о сцепленных командах в DOS, но, очевидно, еще не настолько уверен в том, что нужно принимать во внимание все аспекты.
Может ли кто-нибудь взглянуть на приведенный ниже код и вывод в моей системе и посмотреть, могут ли они посоветовать, какой синтаксис неправильный (обратите внимание, я разбил строки вручную):
%comspec% /v:on /k "(for /f "tokens=2*" %a in ('reg query hkcu\software\microsoft
\windows\currentversion\policies\system /v DisableTaskMgr') do @set DisableTaskMg
r=%b) 2>nul & set DisableTaskMgr& pause & (if defined programfiles^(x86^) (set
"ProgramFiles(x32)=%programfiles(x86)%") else (set "ProgramFiles(x32)=%programfil
es%")) & !ProgramFiles(x32)!\Mozilla\Firefox\Firefox.exe -chrome chrome://browser
/content & echo. & if defined DisableTaskMgr (echo DisableTaskMgr reg key existed
prior to running, and... & (set DisableTaskMgr=%DisableTaskMgr:~2,3% & echo !
DisableTaskMgr! & reg add hkcu\software\microsoft\windows\currentversion\policies
\system /v DisableTaskMgr /t REG_DWORD /d %DisableTaskMgr% & if %DisableTaskMgr%
eql 0 (echo Previous state was Task Manager enabled) else (echo Previous state
was Task Manager DISabled))) else (echo DisableTaskMgr reg key DID NOT exist pri
or to running & reg delete hkcu\software\microsoft\windows\currentversion\polici
es\system /v DisableTaskMgr /f)"
,
Я пытался вырезать части кода, чтобы исправить отдельные части, но мои попытки методом проб и ошибок доказывают, что я не очень понимаю, что не так, и что я не собираюсь решать это самостоятельно очень быстро:(
2 ответа
Ваш оператор сравнения IF неверен. У тебя есть eql
- так должно быть equ
,
Я понятия не имею, если это ваша единственная проблема - у вас есть ужасная проблема обслуживания с этим чудовищем заявления.
Возможно, вам лучше создать пакетный файл с той же логикой, но с хорошим форматированием. Затем вы можете просто вызвать командный файл вместо попытки встроить весь сложный процесс в одну сложную команду.
Я вижу вашу проблему прямо здесь! Это твой код! *улыбка*
Если серьезно, даже если вы собираетесь поддерживать этот беспорядок, я рекомендую разбить его на составляющие компоненты для целей отладки. Вы можете даже избежать иногда таинственных ошибок блока, помещая то, что находится внутри ()
блокирует в отдельные подпрограммы. Поворачивая такого рода вещи...
if statement (
code block 1
code block 1
code block 1
code block 1
) else if (
code block 2
code block 2
code block 2
code block 2
)
... в такие вещи:
if statement (
call :CodeBlock1
) else if (
call :CodeBlock2
)
goto :eof
:CodeBlock1
code
code
code
code
goto :eof
:CodeBlock2
code
code
code
code
goto :eof
Попытка отладить это как единую строку означает постоянно помнить все и то, как оно взаимодействует. И в основном нужно угадать, какой похожий фрагмент кода на самом деле создал ошибку, которую вы пытаетесь исправить.
Лично я потратил немало времени, пытаясь исправить совершенно хороший код, не осознавая, что ошибка, на которую я смотрел, была на самом деле ниже в блоке кода.
После того, как вы нашли и исправили свои ошибки, вы можете снова вставить все это в одну строку, если хотите. Преодоление проблемы не обязательно означает выполнение ее самым сложным способом. Самым простым способом преодоления проблемы является также, по определению, преодоление проблемы.