我一直在努力弄清楚如何获取计算机列表及其团队查看器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
答案 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^>nul
将stderr
邮件重定向到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
,否则将继续执行子程序代码。 CMD
是end of file
理解为libboost-python
的预定义标签。冒号必需。