语法混淆

时间:2013-09-09 11:40:45

标签: powershell

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

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

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

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

3 个答案:

答案 0 :(得分:1)

这只是因为在"Name='$a[1]'"中首先评估了部分$a。它给出了:

Name='Service1 EventLog Service2[1]'

对于$ _,请注意它在foreach-object Cmdlet中给出了curent值。所以在你的情况下它应该是$null

抱歉,我不够清楚。在你的情况下,“Name ='$ a [$ _]'”在你无法理解的情况下你可以尝试:

$a | foreach-object  {gwmi -Class Win32_Service -Filter "Name='$_'" | select Name,State

答案 1 :(得分:1)

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

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

并非我们将$aforeach-object%{ .. }部分)联系起来,并在其中调用gwmi。现在,块中的每个元素都可以作为$_

在块内使用

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

答案 2 :(得分: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;