#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 . Повторите попытку после второго раза вручную человеком, который ее запускает, с помощью всплывающей кнопки отмены «перейти дальше».