Я создаю массив в PowerShell, который не всегда содержит данные (иногда он пуст). Мне нужно проверить, что массив содержит данные, прежде чем пытаться что-либо сделать с объектами массива. Когда я использую следующий код, все работает как положено:

$Array = @(“This”,”is”,”a”,”test”)
$Array | ForEach-Object {
If ($Array.Count -ge 1)
    {
    [string]$A = $_
    Write-Host $A
    }
}

Используя приведенный выше код, я получаю следующий вывод:

This
is
a
test

Выше проверяет .Подсчет массива каждый раз, когда он обрабатывает объект в массиве (поэтому он может проверять счетчик массива в тысячу и более раз в зависимости от количества объектов в массиве). Я хочу проверить счетчик массива только один раз и до того, как он начнет обрабатывать объекты массива. Однако следующий код не обеспечивает правильного вывода:

$Array = @(“This”,”is”,”a”,”test”)
If ($Array.Count -ge 1)
{
$Array | ForEach-Object {
    {
    [string]$A = $_
    Write-Host $A
    }
}
}

Я получаю следующий вывод при запуске приведенного выше кода:

    [string]$A = $_
    Write-Host $A

    [string]$A = $_
    Write-Host $A

    [string]$A = $_
    Write-Host $A

    [string]$A = $_
    Write-Host $A

Он не записывает-записывает значение переменной $ A, как это делал предыдущий код, но вместо этого печатает сам код PowerShell. Все, что я сделал, это пошевелил .Граф чека , так что он проверяет счетчик до начала обработки объектов в массиве. Почему я получаю вышеприведенный вывод при перемещении проверки количества массивов перед оператором ForEach-Object ? Нужно ли проверять количество массивов каждый раз, когда я обрабатываю объект из массива?

Спасибо

1 ответ1

4

Я предполагаю причину, почему Powershell печатает это для вашего второго примера

[string]$A = $_
Write-Host $A

[string]$A = $_
Write-Host $A

потому что Powershell принимает двойную скобку { { } } как строковый литерал.

Что касается того, как заставить это работать, вы должны проверить $Array перед выполнением цикла for.

Вот как должен выглядеть код:

$Array = @(“This”,”is”,”a”,”test”)
if($Array.Count -ge 1){
    foreach($A in $Array){
        Write-Host $A
    }
}

И как однострочник (иш)

$Array = @(“This”,”is”,”a”,”test”) 
if($Array.Count -ge 1){ $Array| %{Write-Host $_}}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .