Как сделать a -Contain -Not: строка содержит «Что-либо, кроме»

#powershell

#powershell

Вопрос:

Как я могу написать сценарий «Содержит ли строка не _» / «Содержит ли строка что-либо, кроме _»?

Я не застрял, так как нашел достаточно хороший обходной путь. Больше любопытства, чем чего-либо еще.

Пример:

 $String = 1,1,1,2,5
$String -contains !(1)
  

Это всегда выдает False

Мое решение на данный момент состоит в том, чтобы удалить 1 и посмотреть, равно ли оно нулю, например:

 $String2 = $String -ne 1
if ([String]::IsNullOrEmpty($String2)) {
    Write-Host "True"
} else {
    Write-Host "False"
}
  

Пример из реального мира:

Мой скрипт предназначен для выполнения определенного действия, пока оно не сработает. В этом случае получаем-msoluser . В конце моего скрипта я хочу подсчитать любые ошибки (и перечислить их позже), но для «get-msoluser» всегда будет указана ошибка, поскольку она терпит неудачу, пока не сработает. Поэтому я пытаюсь не включать эту определенную ошибку в подсчет.

 $Errors = $Error.InvocationInfo.MyCommand.Name
if ($Errors -contains !("get-msoluser")) {
    Write-Host "There was an error I actually care about"
}
  

ВМЕСТО этого я должен сделать это:

 $Errors = $Error.InvocationInfo.MyCommand.Name
$ErrorsICareAbout = $Errors -ne "get-msoluser"
if ([String]::IsNullOrEmpty($ErrorsICareAbout)) {
    Write-Host "$ErrorsICareAbout.Count"
} else {
    Write-Host "There were errors you actually cared about"
}
  

Я что-то упускаю, что находится прямо у меня под носом?

Комментарии:

1. Вы пробовали If (!($Errors -contains ("get-msoluser")))

2. Да. Прямо у меня под носом. Спасибо!

3. -notcontains это оператор, который вы ищете.

Ответ №1:

Вам просто нужно использовать -notcontains или добавить оператор not вокруг всего -contains сравнения следующим образом:

 If ($Errors -notcontains ("get-msoluser"))
  

или

 If (!($Errors -contains ("get-msoluser")))
  

Ответ №2:

Вместо того, чтобы отфильтровывать ошибку, попробуйте не создавать ошибку в первую очередь. Чтобы подавить ошибки от конкретной команды, вы можете установить для действия ошибки значение SilentlyContinue .

 Write-Error 'fail' -ErrorAction SilentlyContinue
  

Поэтому в случае повторной попытки до тех пор, пока Get-MsolUser не сработает, вы могли бы использовать что-то вроде

 while($msolUser -eq $null) {
   $msolUser = Get-MsOlUser ... -ErrorAction SilentlyContinue

   #Wait a second before retrying.
   Start-Sleep -Seconds 1   
}

#Now work with $msolUser
  

(Вы, вероятно, также хотите установить верхний предел для количества попыток)

Комментарии:

1. В настоящее время я использую это, чтобы подавить ошибку на экране powershell, но она по-прежнему появляется в переменной $error . Повторите попытку после второго раза вручную человеком, который ее запускает, с помощью всплывающей кнопки отмены «перейти дальше».