Назад | Перейти на главную страницу

Powershell - проверьте, находится ли строка в списке строк

Контекст: мы создаем API для получения списка всех виртуальных машин и фильтрации его с помощью циклов if, чтобы возвращать только виртуальные машины с именем, начинающимся только со значений в $ MachineList.

Список серверов разделен на 2 части:

Это сценарий

$EnvironmentList = "Environments-4" -or "Environments-5" -or "Environments-41" -or "Environments-61"
$MachineList = "srv-a*" -or "srv-b*" -or "srv-c*" -or "srv-d*" -or "srv-e*" -or "srv-f*" -or "srv-g*" -or "srv-h*" -or" srv-i*" -or "srv-j*" -or "srv-k*" -or "srv-l*"

function CheckService{
    $MachinesRequest = (Invoke-WebRequest -Method Get -Headers @{"X-system-ApiKey"="Hashed-API-Key-Value"} -URI https://url-to-site.local/api/machines/all).Content | ConvertFrom-Json
    foreach ($Machine in $MachinesRequest){
        if($EnvironmentList -contains $Machine.EnvironmentIds){
            if($MachineList -contains $Machine.Name){
                    $Machine.Name               
            }
        }
    }
}


CheckService

Мы пытаемся вернуть только те элементы, которые соответствуют значениям в списке машин, однако это возвращает полный список машин (как srv *, так и tst *).

Помощь приветствуется.

Заранее спасибо.

Определение переменной с помощью -or приведет только к переменной, содержащей True, и ничего больше:

PS C:\> $EnvironmentList = "Environments-4" -or "Environments-5" -or "Environments-41" -or "Environments-61"
PS C:\> $EnvironmentList
True

Для хранения всех этих значений вам необходимо определить свои списки в виде массивов:

$EnvironmentList = "Environments-4","Environments-5" #,...
$MachineList = "srv-a*","srv-b*","srv-c*" #,...

Дополнительно, -contains не работает с подстановочными знаками, вы должны использовать -like использовать тех.

Пример:

function CheckService{
    $MachinesRequest = (Invoke-WebRequest -Method Get -Headers @{"X-system-ApiKey"="Hashed-API-Key-Value"} -URI https://url-to-site.local/api/machines/all).Content | ConvertFrom-Json
    foreach ($Machine in $MachinesRequest){
        if($EnvironmentList -contains $Machine.EnvironmentIds){
            foreach ($Test in $MachineList) {
                if($Machine.Name -like $Test){
                        $Machine.Name               
                }
            }
        }
    }
}

Самое близкое к тому, о чем вы спрашиваете, что я обнаружил в прошлом, был параметр «-in» в Where-Object. Однако я не уверен, работает ли он с подстановочными знаками. Чтобы выяснить это, вам нужно будет протестировать / поэкспериментировать.

Мой реальный пример:

$entries | Where-Object -Property account -In $accounts.account

Где $ entry содержали большой список учетных записей, которые я хотел отфильтровать, а $ accounts содержали меньший список учетных записей, по которым я хотел фильтровать. Эта команда вернула только записи в $ entries, которые содержат (атрибут "account") одну из учетных записей, перечисленных в $ accounts.

Я надеюсь это имеет смысл. Я не обнаружил это самостоятельно, но нашел ответ некоторое время назад через поиск в Интернете.