0

特定のユーザーを検索するターミナルサーバーを反復処理するために、バッチファイル(SUで質問した)を作成しています。それで、私は自分がやろうとしていることの基本的なスタートを切りました。

  1. ユーザー名を入力
  2. ターミナルサーバーを繰り返す
  3. ユーザーが見つかったサーバーを表示します(接続が失われた方法に応じて、複数のサーバーで何度も見つけることができます)
  4. オプションのメニューを表示する

私が持っているターミナルサーバーの反復:

for /f "tokens=1" %%Q in ('query termserver') do (set __TermServers.%%Q)

今、私はエラーが発生しています...

Environment variable __TermServers.SERVER1 not defined

...ターミナルサーバーごとに。現時点では、これが私のバッチファイルにある唯一のものです。このエラーが発生している理由について何か考えはありますか?明らかに、変数は定義されていませんが、SETコマンドがまさにそれを行うことを理解しました。

また、イテレーション(各ターミナルサーバー)で作業を続けるには、次のようなことを行う必要があると考えています。

:Search    
for /f "tokens=1" %%Q in ('query termserver') do (call Process) 
goto Break

:Process
for /f "tokens=1" %%U in ('query user %%username%% /server:%%Q') do (set __UserConnection = %%C)
goto Search

ただし、これについて私を悩ませていることが2つあります。

  1. プロセスを呼び出すときに%%Q値はまだ生きていますか?
  2. 検索に移動すると、forループが最初からやり直されますか?

私は自分が自由に使えるツールを使ってこれを行っているので、PowerShellやその他の方法について聞きたいのですが、それは無駄です。私はメモ帳を持っていて、それだけです。

注:プログラミングの詳細について詳しく説明しているように見えることを除いて、SuperUserでこの一連の質問を続けます。

4

1 に答える 1

4

わかりました、それらはかなりの数の質問/問題/などです。1つで:-)

そして、私はまだあなたがそのスクリプトでどこに向かっているのか正確にはわかりません。

まず、setコマンドの構文は次のとおりです。

set <variable name>=<value>

あなたがただするなら

set <variable name>

次に、で始まるすべての環境変数が一覧表示されます<variable name>。存在しない場合は、表示されているエラーメッセージが出力されます。

実際にその値を気にせずに変数を定義したい場合でも、値を指定する必要があります。私は通常1、そのようなフラグに使用します。これは、値を保持する実際の変数よりもオン/オフスイッチであるためです。

set Foo=1

あなたの場合、あなたはおそらく何か他のものが欲しいでしょう。バッチファイルには配列自体はありません。いくつかの変数を作成し、どこかにカウントを保持することで、配列を模倣できます。私は以前にそれについて書いたことがあります(今では少し時代遅れですが、まだ有効です)。

あなたの場合、複数のサーバーを反復処理し、サーバーごとに多数のユーザーを反復処理する必要があります。ネストされたループでそれを行うことができます:

for /f "tokens=1" %%Q in ('query termserver') do (
   for /f "tokens=1" %%U in ('query user ... /server:%%Q' do (
      ...
   )
)

そこでの2つの質問について:

  1. いいえ、ループ変数はループ内でのみ有効であり、サブルーチンを呼び出すときは有効ではありません。ただし、これをサブルーチンに渡すことができます。

    for ... in (...) do call Process %%Q
    

    %1その後、サブルーチン内でアクセスできます。正直なところ、ほとんどの場合、ネストされたループの方が読みやすいと思います。

  2. はい。

別のエラー(あなた噛むエラー):前述のように、set構文は次のとおりです。

set variable=value

看板の周りにはスペースがないことに注意してください。=ある場合は、変数名の末尾または値の先頭にスペースがあります。

> set foo = bar
> echo %foo%
%foo%
> echo %foo %
 bar
于 2010-04-27T22:11:26.897 に答える