2015-02-10 36 views
0

我正在導入CSV並根據CSV中的值回收該站點。 csv根據我們收到的警報動態組建。 當我嘗試下面的代碼我收到打印的價值觀和錯誤Powershell中的Foreach和數組變量

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字符:5 + $ appPool.Recycle() + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + FullyQualifiedErrorId:InvokeMethodOnNull

192.168.100.131 testsite2 您無法在空值表達式上調用方法。 在線:5字符:5 + $ appPool.Recycle() + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 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

添加代碼來驗證你真的找回,你以爲你是WMI對象只是這樣做。 – EBGreen 2015-02-10 16:59:00

+0

謝謝。我做到了這一點,我得到了$ appPool的空值。但第二組類似的代碼正在工作。唯一不同的是,我正在將這些值傳遞給一個數組,並且在我讀取的第一組數據集中嘗試傳遞它。我認爲它沒有傳遞_.site或$ _。IP的值。 – Sunil 2015-02-10 17:11:12

+0

我剛剛使用ForEach-Object進行了測試。不,它不工作,結果相同。與foreach也是它打印的價值,但不會進入Get-WmiObject – Sunil 2015-02-10 17:19:21

回答

2

我認爲這段代碼從原來的樣品中含有您的問題:

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

$_.site不在範圍內了,因爲現在$_代表在Where-Object「循環」當前對象。當您將$_.site作爲foreach循環的第一行打印時,$_仍表示$RecycleSite列表中的當前項目。

+0

謝謝,我明白你的意思。但在這種情況下,我如何使用第一個循環和第二個循環。任何想法 ? – Sunil 2015-02-10 17:47:23

+0

您的修正版本的代碼看起來不錯。任何地方你都可以明確地引用你想要的對象(即。$ site.IP vs $ _。IP)。做這件事的原因正是你的問題所指出的,「$ _」代表不同的對象,取決於它的使用位置。 – 2015-02-10 17:51:39

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

+0

這是正確的,這基本上是他通過更改爲「foreach($ RecycleSites $ site)」循環所做的。但是,是的,如果您想使用第一個代碼片段的格式,則必須執行上述操作。 – 2015-02-10 17:53:29

+0

非常感謝,我剛剛檢查了這個問題後得到這個[鏈接] http://stackoverflow.com/questions/8237251/how-can-i-access-a-higher-level-pipeline-variable-from-a-nested - 管道並進行測試。 – Sunil 2015-02-10 17:59:19

+0

我無法將兩個答案都作爲答案。所以我保持第一個答案告訴我有關該問題的答案。謝謝 – Sunil 2015-02-10 18:00:58