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

最初のバッチ - 勇敢!...そしてブラボー!!

regまず、コマンドを実行してみましょう。奇妙なことに、要求されたキーが欠落している場合、non- にreg設定されません。そのため、その部分だけが実行されていました。errorlevel0version 7

reg queryキーが見つからない場合、出力は生成されませんが、エラー メッセージが生成されます。エラー: 指定されたレジストリ キーまたは値が見つかりませんでした。The output string is sent to通常はコンソールに割り当てられるstdout 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" という名前の変数を " N"Spaceの値に設定するのは、このルールを無視する後の実装です。(ただの注意)Spaceset /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リダイレクトstderrnul(つまり、 nowhere )。キャレット^は と呼ばれ、の一部ではない部分であるescape characterため、ここで必要です。(したがって、「エスケープ」と呼ばれます)>reg queryfor>

その結果、キーが存在する場合、setが実行さnumれ、値が割り当てられます。キーが欠落している場合は、num変更されません。

num を何も初期化しなかったことを覚えていますか? そして、(キーが存在する場合)に設定した可能性があるので、変数が設定されているかどうかをテストできます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)

括弧の位置は重要です。最初のオープンはif(またはdo ) と同じ物理行にある必要があり、else が使用されている場合は、前後の両方が)(同じ物理行にelseあるelse必要があり、キーワードと括弧の間にはスペースが必要です。これにより、複数の行を条件付きで実行できます。else節が欠落している場合、またはelse実行する必要があるコマンドが 1 つだけの場合は節に括弧は必要ありません。

exitバッチは、ファイルの終わりまたはステートメントが検出されるまで、命令を 1 行ずつ実行するだけです。

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

より簡単に書かれています

if condition goto there
:here

が false の: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。コロンが必要です

于 2015-12-31T06:32:34.733 に答える