用于创建具有计算机名称和Teamviewer编号的.txt的批处理文件

时间:2015-12-30 23:00:16

标签: batch-file if-statement command-prompt teamviewer

我一直在努力弄清楚如何获取计算机列表及其团队查看器ID。此时我有一个带有计算机名称的文件。我开始尝试编写的批处理文件查看该名称列表创建了一个到我的机器的桥,然后报告主机名和Teamviewer ClientID。问题是我们安装了不同版本的teamviewer并且位置不一样。当我运行我的批处理文件时,它会给我teamviewer 7 ClientIDs,但就是这样。由于这是我的第一个批处理文件,所以非常感谢任何帮助!

::在网络位置创建包含主机名和Teamviewer ClientID的.txt文件。

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 个答案:

答案 0 :(得分: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 part. The error string is sent to stderr`,通常分配给控制台。

所以 - 首先,让num成为"设置" nothing

set "num="

语法SET "var=value"(其中value可以为空)用于确保任何杂散尾随空格不包含在分配的值中。 set /a可以安全地使用"无报"。

批处理对SET语句中的空格敏感。 SET FLAG = N设置一个名为" FLAG Space "的变量。值为" 空间 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^>nulstderr邮件重定向到nul(即无处)。插入符^称为escape character,因此>reg query的一部分,而for不属于>。 (set因此被称为"逃脱")

结果将是,如果密钥存在,将执行num并为num分配值。如果密钥丢失,num将保持不变。

请记住,我们将num初始化为 nothing ?我们可能现在已将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关键字与括号之间必须有空格。这允许有条件地执行多行。如果缺少else子句,则不需要括号;如果只需要执行一个命令,则不需要exit子句。

Batch只是逐行执行指令,直到遇到文件结尾或if condition (goto there) else (goto here) :here 语句为止,因此

if condition goto there
:here

写得更简单

:here

因此如果condition为false,则会执行标签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,否则将继续执行子程序代码。 CMDend of file理解为libboost-python的预定义标签。冒号必需