PowerShell中的Foreach和数组变量

时间:2015-02-10 16:51:51

标签: arrays powershell csv import

我正在导入CSV并根据CSV中的值回收该网站。 csv是根据我们收到的警报动态构建的。 当我尝试以下代码时,我收到一个打印的值和错误

import-csv d:\emscripts\recy\recycle.txt -Header "site","IP","Log" | foreach {
    $_.IP
    $_.site
    $appPool = Get-WmiObject -Authentication PacketPrivacy -Impersonation Impersonate  -ComputerName $_.IP -namespace "root/MicrosoftIISv2"  -class IIsApplicationPool | Where-Object {$_.Name -eq "W3SVC/AppPools/$($_.site)" }
    $appPool.Recycle()
    }

* 192.168.100.182 Testsite1 您无法在空值表达式上调用方法。 在行:5 char:5 + $ appPool.Recycle() + ~~~~~~~~~~~~~~~~~~     + CategoryInfo:InvalidOperation:(:) [],RuntimeException     + FullyQualifiedErrorId:InvokeMethodOnNull

192.168.100.131 testsite2 您无法在空值表达式上调用方法。 在行:5 char:5 + $ appPool.Recycle() + ~~~~~~~~~~~~~~~~~~     + CategoryInfo:InvalidOperation:(:) [],RuntimeException     + FullyQualifiedErrorId:InvokeMethodOnNull *

您可以看到值已打印但无法将任何内容输入$ appPool。

我已将其更改为以下内容,并且按预期工作。

    $RecyleSites  = import-csv recycle.txt -Header "site","IP","Log" 
foreach ($site in $RecyleSites)  {
    $site.IP
    $site.site
    $appPool = Get-WmiObject -Authentication PacketPrivacy -Impersonation Impersonate  -ComputerName $site.IP -namespace "root/MicrosoftIISv2"  -class IIsApplicationPool | Where-Object {$_.Name -eq "W3SVC/AppPools/$($site.site)" }
    $appPool.Recycle()
    }

我正在尝试了解我在第一组代码中做错了什么?

2 个答案:

答案 0 :(得分:2)

我认为原始示例中的这段代码包含您的问题:

Where-Object {$_.Name -eq "W3SVC/AppPools/$($_.site)

$_.site不在范围内,因为$_现在代表Where-Object“循环中的当前对象”。当您将$_.site打印为foreach循环的第一行时,$_仍代表$RecycleSite列表中的当前项。

答案 1 :(得分:1)

这里有一个范围问题。您需要保存变量$_.Site以供日后使用。

$site = $_.site
$appPool = Get-WmiObject -Authentication PacketPrivacy -Impersonation Impersonate  -ComputerName $_.IP -namespace "root/MicrosoftIISv2"  -class IIsApplicationPool | 
    Where-Object {$_.Name -eq "W3SVC/AppPools/$site" }
$appPool.Recycle()

$_始终引用scope中的对象。将变量保存在该范围之外是常见的做法。

您的ForEach构造就是通过将每个传递中的变量保存到$site

来实现的。