我正在导入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()
}
我正在尝试了解我在第一组代码中做错了什么?
答案 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