我正在尝试执行以下操作。
$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。我很困惑,至少可以说...
答案 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
并非我们将$a
与foreach-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;