2015-12-30 6 views
1

Я пытался выяснить, как получить список компьютеров и их идентификаторы зрителей команд. На данный момент у меня есть файл с именами компьютеров. Пакетный файл, который я начал писать, просматривает этот список имен, создает мост для моей машины, а затем возвращает имя хоста и идентификатор клиента Teamviewer. Проблема в том, что у нас установлены разные версии TeamViewer, а расположение не одинаковое. Когда я запускаю свой пакетный файл, так как он даст мне идентификаторы ClientID, которые вызывают Teamviewer 7, но это он. Поскольку это мой первый командный файл, любая помощь очень ценится!Пакетный файл для создания .txt с именами компьютеров и номерами Teamviewer

:: Создает .txt-файл с именем хоста и идентификатором Teamviewer ClientID в сети.

call net use x: \\server\location (Password) /user:(UserName) 

call hostname >> x:\TeamviewerID.txt 

for /f "tokens=3" %%a in ('reg query HKLM\Software\Wow6432Node\TeamViewer\Version7 /v ClientID') do (set /a num = %%a) 
if %ERRORLEVEL% EQU 0 GOTO Print ELSE GOTO EIGHT 

:EIGHT 
for /f "tokens=3" %%a in ('reg query "HKLM\Software\Wow6432Node\TeamViewer\Version8 /v ClientID"') do (set /a num = %%a) 
if %ERRORLEVEL% EQU 0 GOTO Print ELSE GOTO NINE 

:NINE 
for /f "tokens=3" %%a in ('reg query HKLM\Software\Wow6432Node\TeamViewer /v ClientID') do (set /a num = %%a) 
if %ERRORLEVEL% EQU 0 GOTO Print 


:Print 
echo Teamviewer ID is %num%>> x:\TeamviewerID.txt 

call net use x: /delete 

ответ

1

Первая партия - храбрый! ... а также 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 Пробел» на значение «Пробел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. Двоеточие требуется.

+0

СПАСИБО ВАМ @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) –