Первая партия - храбрый! ... а также Bravo !!
Для начала возьмите команду reg
. Необязательно, reg
не задает errorlevel
не 0
, если запрошенный ключ отсутствует. Вот почему была выполнена часть version 7
.
reg query
с отсутствующим ключом не производит выход, но вызывает сообщение об ошибке. ОШИБКА: Системе не удалось найти указанный ключ или значение реестра. The output string is sent to
stdout and is the output that would be processed by the
do part. The error string is sent to
stderr`, который обычно назначается консоли.
Итак - первый, давайте заставить num
быть «установить» в ничего
set "num="
Синтаксис SET "var=value"
(где значение может быть пустым) используется для того, чтобы любые паразитные хвостовые пробелы не включены в присвоенное значение. set /a
можно безопасно использовать «quoteless».
Пакет чувствителен к пробелам в заявлении SET
. SET FLAG = N
устанавливает переменную с именем «FLAG Пробел» на значение «Пробел N» set /a
- это более поздняя реализация, которая игнорирует это правило. (Только осторожно)
Тогда мы можем использовать щекотали версию кода
for /f "tokens=3" %%a in ('reg query HKLM\Software\Wow6432Node\TeamViewer\Version7 /v ClientID 2^>nul') do (set /a num = %%a)
где дополнительный 2^>nul
перенаправляет stderr
сообщения в nul
(т.е. нигде). Каретка ^
называется escape character
и требуется здесь, потому что >
является частью reg query
, не являющейся частью for
. (>
, таким образом, называют «убежали»)
Результат будет, что если ключ существует, set
будет выполняться и num
будет присвоено значение. Если ключ отсутствует, num
останется без изменений.
Помните, что мы инициализировали num до nothing? И у нас может теперь установлены num
на something
(если ключ существует?), Так что теперь мы можем проверить, был ли установлен переменная или не
if defined num goto print
(партия в значительной степени чувствительны к регистру)
Так что - немного экскурс в настоящее время в синтаксисе if
. В части действия пакет не знает, является ли строка else
параметром какой-либо команды или является ключевым словом ELSE
. Следовательно, мы должны сказать ему:
if somebinarycondition (
dothis_if_true
) else (
dothis_if_false
)
или
if somebinarycondition (dothis_if_true) else (dothis_if_false)
позиционирование скобок имеет решающее значение. Первый открытый должен быть на одной и той же физической линии, что и if
(или делают) и если еще используется тогда как предыдущий )
и последующие (
должны происходить на одной и той же физической линии, что и else
и должно быть пробел между ключевым словом else
и круглыми скобками. Это позволяет условно выполнять несколько строк. Скобки не требуются, если отсутствует предложение else
или в предложении else
, если требуется выполнить только одну команду.
Batch просто не выполняет инструкцию линии за линией до конца из-файла или exit
утверждения встречается, следовательно,
if condition (goto there) else (goto here)
:here
будет проще написан
поэтому инструкций после этикетки :here
будет выполнен, если condition
является ложным.
Таким образом, в целом,
SET "num="
for /f "tokens=3" %%a in ('reg query HKLM\Software\Wow6432Node\TeamViewer\Version7 /v ClientID 2^>nul') do (set /a num = %%a)
IF DEFINED num GOTO print
:EIGHT
for /f "tokens=3" %%a in ('reg query "HKLM\Software\Wow6432Node\TeamViewer\Version8 /v ClientID" 2^>nul') do (set /a num = %%a)
IF DEFINED num GOTO print
:NINE
for /f "tokens=3" %%a in ('reg query HKLM\Software\Wow6432Node\TeamViewer /v ClientID 2^>nul') do (set /a num = %%a)
IF DEFINED num GOTO print
echo Not found!
pause
goto :eof
:Print
echo Teamviewer ID is %num%
В отличие от многих языков, партия не имеет ни малейшего понятия о конце «процедуры» - это просто продолжает выполнение построчно-линии до тех пор, пока не достигнет конца файла, , Следовательно, после завершения основной линии вам необходимо выполнить goto :eof
, иначе выполнение будет продолжено через код подпрограммы. :EOF
является предопределенной меткой, понимаемой под номером CMD
, что означает end of file
. Двоеточие требуется.
СПАСИБО ВАМ @Magoo! Я не хочу слишком сильно меняться, но здорово иметь такую огромную поддержку, как я начинаю участвовать в таких начинаниях. Я на самом деле закончил тем, что начал работать после долгого рабочего дня, но вот что я смог собрать.
for/f "tokens = 3" %% a in ('reg query HKLM \ Software \ Wow6432Node \ TeamViewer \ Version7/v ClientID') do (set/a num = %% a) if% ERRORLEVEL% EQU 0 (echo Число TeamViewer равно% num%) else (echo not exists) –