【问题标题】:If all values in 'foreach' are true如果“foreach”中的所有值都为真
【发布时间】:2020-06-24 12:31:49
【问题描述】:

我正在编写一个 Powershell 脚本,用于查找所有容器“LastModifiedDate”小于 6 个月的所有 Azure 存储帐户。如果只有一个容器对此语句为 FALSE,则应忽略 ASA。

实现此目的的一种方法是获取一个存储帐户的“LastModifiedDate”数组,然后将其与 (Get-Date).AddDays(-180) 进行比较。问题是如何正确地做到这一点?如果数组中只有一个值为 FALSE,则应忽略它。

我使用 BREAK 运算符实现了这一点,但我认为这不是一个好的解决方案。谁能帮我解决这个问题?

function check_stores {

     $stores = Get-AzureRmResource -ODataQuery "`$filter=resourcetype eq 'Microsoft.Storage/storageAccounts'" $x = (Get-Date).AddDays(-180)

     foreach($store in $stores){

         $storename = $store.Name

         $names = (Get-AzureRmStorageContainer -ResourceGroupName $store.ResourceGroupName -StorageAccountName $store.Name).Name

         foreach($name in $names){

             $date = (Get-AzureRmStorageContainer -ResourceGroupName $store.ResourceGroupName -StorageAccountName $store.Name -Name $name).LastModifiedTime

             if($date -gt $x){
                  break
             }
         }

         if($x -gt $date){
             "Storage Account Name: $storename"

         }
     }

}

check_stores

【问题讨论】:

  • 这就是PowerShell的美妙之处,你不需要自己迭代,-eq操作符会自行迭代左边的变量:If ((Get-AzureRmStorageContainer -ResourceGroupName $store.ResourceGroupName -StorageAccountName $store.Name).LastModifiedTime -le $x) {"Storage Account Name: $storename"}
  • @iRon 谢谢,但它不起作用!它只会给我一个包含此语句的每个容器的列表。就我而言,我只需要存储帐户,每个帐户的每个值都是 TRUE。这是一个有趣的部分。所有容器的“LastModifiedDate”应少于 6 个月。
  • ` $Stores = Get-AzureRmResource -ODataQuery "$filter=resourcetype eq 'Microsoft.Storage/storageAccounts'" $x = (Get-Date).AddDays(-180) $FilteredAccounts = (Get-AzureRmStorageContainer -ResourceGroupName $store.ResourceGroupName -StorageAccountName $store.Name).LastModifiedTime -le $x $FilteredAccounts | % { $storename } | Select -Unique

标签: azure powershell azure-storage


【解决方案1】:

正如评论:这就是 PowerShell 的美妙之处,你不需要自己迭代,equality operators 会自己迭代左边的参数集合

当运算符的输入是标量值时,比较运算符 返回一个布尔值。当输入是值的集合时, 比较运算符返回任何匹配的值。如果没有 在集合中匹配,比较运算符返回一个空数组。

由于我无法访问您的环境,因此我为此创建了一个通用答案:

$Dates = [DateTime[]]('2020-03-10', '2020-03-11', '2020-03-12', '2020-03-14')
$Date1 = [DateTime]'2020-03-09'
$Date2 = [DateTime]'2020-03-12'
$Date3 = [DateTime]'2020-03-15'

任何日期

检查是否有任何日期小于给定日期

If ($Dates -lt $Date1) {"Some dates are less then $Date1"} Else {"None of the dates are less then $Date1"}
If ($Dates -lt $Date2) {"Some dates are less then $Date2"} Else {"None of the dates are less then $Date2"}
If ($Dates -lt $Date3) {"Some dates are less then $Date3"} Else {"None of the dates are less then $Date3"}

产量:

None of the dates are less then 03/09/2020 00:00:00
Some dates are less then 03/12/2020 00:00:00
Some dates are less then 03/15/2020 00:00:00

所有日期

这意味着如果您想检查 所有 日期是否在范围内,则需要执行相反的操作(检查 any日期不大于或等于然后给定日期):

If (!($Dates -ge $Date1)) {"All dates are less then $Date1"} Else {"Some of the dates aren't less then $Date1"}
If (!($Dates -ge $Date2)) {"All dates are less then $Date2"} Else {"Some of the dates aren't less then $Date2"}
If (!($Dates -ge $Date3)) {"All dates are less then $Date3"} Else {"Some of the dates aren't less then $Date3"}

产量:

Some of the dates aren't less then 03/09/2020 00:00:00
Some of the dates aren't less then 03/12/2020 00:00:00
All dates are less then 03/15/2020 00:00:00

全部正确

一般来说,如果您想检查 所有值是否为真,您可能只需检查 如果 none 的值是否不 真

$SomeTrue = $False, $True, $False, $True # (Not all true)
$AllTrue = $True, $True, $True, $True

!($SomeTrue -ne $True) # => All true?
False
!($AllTrue -ne $True) # => All true ?
True

【讨论】:

  • 看起来这个对我有用 (!($Dates -ge $x))。为此,我拍摄了一系列日期。谢谢!
【解决方案2】:

我从@iRon 窃取了代码。我把它作为一个答案,因为在 cmets 中是不可能阅读的。她/他应该创造答案并获得荣誉:)

$AllAccounts = Get-AzStorageAccount
$AccountsWithAtLeaseOneModifiedObject =  ($AllAccounts | ? { ($_ | Get-AzStorageContainer).LastModified -gt (Get-Date).AddDays(-180)}).StorageAccountName
compare-object $AccountsWithAtLeaseOneModifiedObject $AllAccounts.StorageAccountName

【讨论】:

  • 这段代码(答案)只是给出一个容器列表,我需要存储帐户每个的每个值都是 TRUE。不像你的情况那样随机。谢谢!
  • 嗨@OlehTarasenko,我想我找到了一个很酷的解决方案 :) 我使用的是 Az cmds 而不是 RM,因为我使用的是 cloud shell。
猜你喜欢
  • 2012-10-12
  • 2021-10-15
  • 2018-01-24
  • 2022-11-25
  • 1970-01-01
  • 2016-05-03
  • 2022-12-08
  • 2021-01-13
  • 2016-05-13
相关资源
最近更新 更多