Count作为数组中的元素与count冲突的问题。电源外壳

时间:2016-12-19 05:19:24

标签: powershell

我目前正在编写一个PoSH脚本来快照我们的VMware服务器。遇到麻烦,因为我希望脚本在超过3个时删除最旧的快照。 我已将我想要捕获的服务器和当前快照的数量放入一个数组中,但是当我使用

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

脚本块没有返回任何内容,当我手动运行时,$ variable.count返回计数而不是数组中元素的值(我猜是因为membertype)。 即如果我在数组中有两个项目,则返回值2而不是计数列中的数字,即5。 我可能正在做一些非常愚蠢的事情,但快照的PowerCLI对象使用count作为元素名称。 任何想法都感激不尽。 感谢

2 个答案:

答案 0 :(得分:0)

您粘贴的示例字面意思是:"评估$variable中计数大于3的元素。如果此计算结果为true,则将$_(当前管道对象)的name属性写入主机。"哪个看起来不是你想要的,因为它:

  1. 断言$variable中的每个元素本身都是一个集合,通过检查当前管道对象的计数而不是整个集合。
  2. 导致if语句永远不会评估为true,因为您的元素不是集合,因此不会有任何计数。
  3. 使用管道外的当前管道对象变量$_
  4. 这个简单的例子可能更接近你想要的。为了举例,我们删除属性并只使用一个简单的字符串数组。如果集合的大小大于3,它将打印集合中最后一项的名称:

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

    随意建立在此基础之上;我不确定您的问题正文中有关您要删除哪个数组元素的更具体细节。例如,如果要删除第一个元素而不是最后一个元素,则需要使用$arr[0]来选择该元素。

答案 1 :(得分: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
}}}

注意:对Remove-Snapshot非常小心,因为它可能会造成很大的伤害

希望这会对你有所帮助。