1

私は次のことをしようとしています。

$a = "Service1","EventLog","Service2"          
gwmi -Class Win32_Service -Filter "Name='$a[1]'" | select Name,State

これにより、出力は発生しません。ただし、変更$a[1]する$($a[1])と機能します。この構文変更を行う必要があるのはなぜですか? 私の見方$a[1]は、引用符の間ですか?

編集: また、配列インデックスが null に評価されたというエラーが表示されるのは$($a[1])なぜですか。$($a[$_])控えめに言っても迷ってます…

4

3 に答える 3

1

配列gwmiで指定したキーワードごとにコマンドを呼び出したいと思います。$aこのアプローチを試してください:

$a = "Service1","EventLog","Service2"          
$a | %{ gwmi -Class Win32_Service -Filter "Name='$_'" } | select Name,State

(部分 )にパイプ$aして、その中でを呼び出すということではありません。配列の各要素は、ブロック内で次のように使用できるようになりました。foreach-object%{ .. }gwmi$_

以前のケースでは、そのコンテキストでは特殊変数がnullであり、配列のインデックスをnullにすることはできないため、$($a[$_])間違いなくエラーが発生します。$_

于 2013-09-09T12:24:19.067 に答える
0

を複数回呼び出すのを避けたい場合はgwmi、サービスを 1 つのフィルターに連結できます。通常、パイプラインを介して必要以上にシャッフルするのではなく、元のコマンドレット (IIRC、これはベスト プラクティスと見なされます) でできるだけ多くのフィルタリングを実行しようとします (可能な限りソースに近いフィルタリングを行います)。これは、複数のリモート システムに対して WMI (およびその他の) クエリを実行し始めると、より重要になります。

ずさんですが、動作します:

$a = "Service1","EventLog","Service2";
$filter = "";
$a|foreach-object {$filter += "name='$_' or ";};
$filter = $filter.substring(0,$filter.Length - 3);
gwmi -Class Win32_Service -Filter $filter | select Name,State

配列を直接渡すこともできget-serviceますが、渡された 1 つ以上の名前でサービスが見つからない場合にスローされる例外を処理する必要があります。

$a = "Service1","EventLog","Service2";
get-service -Include $a|select name,state;
于 2013-09-09T14:17:54.293 に答える