2016-12-19 14 views
1

我目前正在編寫一個PoSH腳本來快照我們的VMware服務器。如果我想讓腳本在超過3個時候刪除最早的快照,就會遇到麻煩。 我已經把我想捕捉服務器和當前快照的數量爲Array,但是當我使用的作爲數組中與count相沖突的元素Count的問題。 Powershell

IF ($variable | where-object {$_.count -gt 3}) { 
     write-host $_.name } 

該腳本沒有返回值的腳本程序塊的邏輯,當我運行它手動$變量.count返回count不是數組中元素的值(我猜是因爲membertype)。 也就是說如果我在數組中有兩個項目,它將返回值2而不是計數列中的數字,即5. 我可能在做一些非常愚蠢的事情,但PowerCLI快照對象使用count作爲元素名稱。 感激地收到了任何想法。 感謝

回答

0

您粘貼從字面上的例子的意思是:「估計在$variable有大於三計數元素如果此值爲true,則寫$_(當前管道對象)的name屬性來承載。」這似乎不是你想要什麼比較,因爲它:

  1. 斷言,在你的$variable每個元素本身就是一個集合,通過檢查當前管道對象,而不是收集作爲一個整體計數。
  2. 會導致if語句從不計算爲true,因爲您的元素不是集合,因此沒有計數大於任何值。
  3. 使用管道外部的當前管道對象變量$_

這個簡單的例子可能是更接近你想要什麼。爲了舉例,讓我們刪除屬性,並使用一個簡單的字符串數組。如果收藏品的尺寸大於3,它將打印收藏品中最後一個物品的名稱:

PS C:> $arr = "test1","test2","test3","test4" 
PS C:> if($arr.Count -gt 3) { Write-Host $arr[-1] } 
test4 

隨意構建;我不確定你的問題主體是關於哪個數組元素特別想要刪除的更具體的細節。例如,如果要刪除第一個元素而不是最後一個元素,則需要使用$arr[0]來選擇該元素。

+0

謝謝,沒關係。我決定重新運行一個帶有select-/ count的-gt3的cmdlet到第二個數組中,它的工作原理也一樣。 –

0

您可以使用下面的代碼,供大家參考:

$maxtasks = 4 

$snaps = get-vm | get-snapshot -name "before power down" 

$i = 0 
while($i -lt $snaps.Count){ 
Remove-Snapshot -Snapshot $snaps[$i] -RunAsync -Confirm:$false 
$tasks = Get-Task -Status "Running" | where {$_.Name -eq "RemoveSnapshot_Task"} 
while($tasks.Count -gt ($maxtasks-1)) { 
sleep 30 
$tasks = Get-Task -Status "Running" | where {$_.Name -eq "RemoveSnapshot_Task"} 
    } 
    $i++ 
} 

只要有3個以上的 - 那麼該腳本會睡,一旦有低於3,則增加$ I通過1並將繼續刪除下一個快照。 請參閱鏈接以供參考。 Throttle Snapshot

如果您想根據天數刪除,則使用此方法: 此處的跨度爲30天。

$oneMonthAgo = (Get-Date).AddDays(-30) 
Get-VM | Foreach-Object { 
Get-Snapshot -VM $_ | Foreach-Object { 
if($_.Created -lt $oneMonthAgo) { 
Remove-Snapshot $_ -Confirm -WhatIf 
}}} 

注意:要在刪除快照非常小心,因爲它可能會造成很大的傷害

希望這可以幫助你。

+0

是的,我知道VMware的限制,這就是爲什麼我的快照腳本不允許超過3個當前快照。 –

+0

我試圖解釋的是,你可以用任何一種方式來處理我在答案中提到的情況。無論如何,對於一個簡單的解決方案,我希望你再檢查一件事情 - 數組的最後一個元素使用'array [-1]' –