Powershell - Используйте функцию «Содержит» / «Соответствие» для карт ha sh - PullRequest
2 голосов
/ 25 февраля 2020

Я хочу проверить, существуют ли следующие буквы в следующих словах. Мой код:

$testString="Word"
$illegalCharacter =@{Warning="a","b";Error="c","d"}

if($testString -match $illegalCharacter.Error){
Write-Host "WORKS!"
}

Я думаю, "-contains" работает только с массивами, а не с Ha sh Maps. Но почему это не работает?

Спасибо:)

Ответы [ 4 ]

2 голосов
/ 25 февраля 2020

Вы должны использовать немного другой подход:

$testString="Word"
$illegalCharacter =@{Warning=@("a","b");Error= @("c","d")}

$illegalCharacter.Error | ForEach-Object { 
    if( $testString.Contains( $_ ) ) {
        Write-Host "WORKS!"; break 
    }
}  
1 голос
/ 25 февраля 2020

Если это поиск с учетом регистра, то Split (char []) будет кратким решением.

$testString="Word"
$illegalCharacter =@{Warning=@("a","b");Error= @("c","d")}
if ($teststring.Split($illegalCharacter.Error).Count -gt 1) {
    Write-Host "WORKS!"
}

Если вы хотите использовать * Оператор 1007 * или оператор -cmatch (сопоставление с учетом регистра), вам необходимо создать выражение регулярного выражения, которое включает в себя чередования (|).

$testString="Word"
$illegalCharacter =@{Warning=@("a","b");Error= @("c","d")}
$regex = ($illegalcharacter.Error |% { [regex]::Escape($_) }) -join '|'
if ($teststring -match $regex) {
    Write-Host "WORKS!"
}

Символ регулярного выражения | выполняет OR. В этом случае он попытается сопоставить c и, альтернативно, d, если c не совпадет. Специальные символы регулярных выражений должны быть экранированы, если вы соответствуете им буквально. Regex.Escape (String) автоматически экранирует символы регулярного выражения.

1 голос
/ 25 февраля 2020

Сначала вам нужно разделить строку, чтобы проверить каждый символ. Вы можете сделать это с .ToCharArray()

Мое предложение:

# Will throw for the first illegal character in the word
$testString.ToCharArray() | where { $illegalCharacter.Error -eq $_ } | foreach {
    throw "Illegal character: $_"
}
1 голос
/ 25 февраля 2020

РЕДАКТИРОВАТЬ: Я неправильно использовал -contains здесь сначала, но -match это то, что мы хотим.

Другой подход:

$testString = "Word"

$illegalCharacter = @{
    Warning = "a", "b"
    Error   = "c", "d"
}

if ($testString -match ($illegalCharacter.Error -join "|")) {
    Write-Host "WORKS!"
}

Эта сборка строка (пример для Error: "c|d"), которая анализируется как регулярное выражение, означающее либо символ c, либо d

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...