第一批 - 勇敢!......还有Bravo!
让我们从reg
命令开始。奇怪的是,如果请求的密钥丢失,reg
则不会设置errorlevel
为 non- 。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
可以安全地使用“无引号”。
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并且在这里是必需的,因为它是 的一部分而不是. (因此被称为“逃脱”)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)
括号的位置很关键。第一个 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
是由CMD
to mean理解的预定义标签end of file
。冒号是必需的。