1

我正在尝试执行以下操作。

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

这不会导致任何输出。但是,当我更改$a[1]为它时,$($a[1])它确实有效。为什么我必须更改此语法?我看到它的方式$a[1]是在引号之间?

编辑:另外,为什么我$($a[1])$($a[$_])收到数组索引评估为空的错误。至少可以说我很困惑...

4

3 回答 3

1

我猜你想为你在数组gwmi中指定的每个关键字调用命令。$a试试这个方法:

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

并不是说我们正在管道$aforeach-object%{ .. }部分)并gwmi在其中调用。数组的每个元素现在都可以在块内使用$_

在您之前的情况下,$($a[$_])肯定会给出您得到的错误,因为在该上下文中,特殊$_变量为空,并且数组的索引不能为空。

于 2013-09-09T12:24:19.067 回答
1

这只是因为在"Name='$a[1]'"零件$a中首先被评估。它给 :

Name='Service1 EventLog Service2[1]'

对于 $_ 小心,它给出了foreach-objectCmdlet 中的当前值。所以在你的情况下应该是$null

对不起,我不够清楚。在您的情况下,“Name='$a[$_]'” 在您的情况下没有任何意义,您可以尝试:

$a | foreach-object  {gwmi -Class Win32_Service -Filter "Name='$_'" | select Name,State
于 2013-09-09T12:00:42.940 回答
0

如果您想避免多次调用gwmi,可以将您的服务连接到一个过滤器中。通常,我尝试在原始 cmdlet(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,但您需要处理当传入的一个或多个名称未找到服务时引发的异常:

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