PowerShell ".метод "count", вызывающий неправильную обработку

Я создаю массив в 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

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

спасибо

14
задан STGdb
30.03.2023 0:34 Количество просмотров материала 3307
Распечатать страницу

1 ответ

Я предполагаю, что причина, почему 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 $_}}
4
отвечен shinjijai 2023-03-31 08:22

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх