Если все значения в 'foreach' истинны - PullRequest
0 голосов
/ 12 марта 2020

Я пишу сценарий Powershell для поиска всех Azure учетных записей хранения , в которых для всех контейнеров LastModifiedDate меньше 6 месяцев. Если ТОЛЬКО один контейнер ЛОЖЬ к этому утверждению, ASA следует игнорировать.

Один из способов добиться этого - получить массив LastModifiedDate для одной учетной записи хранения, а затем сравнить его с (Get- Дата) .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

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Я украл код у @iRon. Я поставил это как ответ, потому что в комментариях читать невозможно. Он / он должен создать ответ и получить кредит:)

$AllAccounts = Get-AzStorageAccount
$AccountsWithAtLeaseOneModifiedObject =  ($AllAccounts | ? { ($_ | Get-AzStorageContainer).LastModified -gt (Get-Date).AddDays(-180)}).StorageAccountName
compare-object $AccountsWithAtLeaseOneModifiedObject $AllAccounts.StorageAccountName
1 голос
/ 12 марта 2020

Как прокомментировано: В этом прелесть PowerShell, вам не нужно итерировать себя, операторы равенства сами будут перебирать коллекцию левых аргументов

Когда входные данные для оператора являются скалярным значением, операторы сравнения возвращают логическое значение. Когда входные данные представляют собой набор значений, операторы сравнения возвращают любые совпадающие значения. Если в коллекции нет совпадений, операторы сравнения возвращают пустой массив.

Поскольку у меня нет доступа к вашей среде, я создал общий ответ для этого:

$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

Все даты

Это означает, что если вы хотите проверить, попадают ли все даты в диапазон, вам нужно сделать обратное (проверьте, если любая дата не больше или равно указанной даты):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...