1

我一直在试图弄清楚如何获取计算机列表及其团队查看器 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
4

1 回答 1

1

第一批 - 勇敢!......还有Bravo!

让我们从reg命令开始。奇怪的是,如果请求的密钥丢失,reg则不会设置errorlevel为 non- 。0这就是为什么只有version 7部分被执行。

reg query缺少键不产生输出,但会产生错误消息,错误:系统无法找到指定的注册表键或值。The output string is sent tostdout and is the output that would be processed by thedo part. The error string is sent tostderr` 通常分配给控制台。

所以 - 首先,让我们强制num“设置”为

set "num="

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

SET批处理对语句中的空格很敏感。SET FLAG = N将名为“FLAG Space”的变量设置为“ SpaceN”的值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重定向到(即无处)的位置。插入符号称为 an并且在这里是必需的,因为它是 的一部分而不是. (因此被称为“逃脱”)stderrnul^escape character>reg queryfor>

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

还记得,我们将 num 初始化为nothing吗?我们现在可能已经设置numsomething(如果键存在?)所以现在我们可以测试变量是否已设置

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)

括号的位置很关键。第一个 open 必须与if(or do ) 在同一物理行,如果使用 else,则前面)和后续都(必须与 the 在同一物理行上,else并且else关键字和括号之间必须有空格。这允许有条件地执行多行。else如果缺少该子句,则不需要括号,else如果只需要执行一个命令,则不需要括号。

批处理只是逐行执行指令,直到exit遇到文件结尾或语句,因此

if condition (goto there) else (goto here)
:here

写的更简单

if condition goto there
: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是由CMDto mean理解的预定义标签end of file。冒号是必需的。

于 2015-12-31T06:32:34.733 回答