Использование метода Where с циклом ForEach

#powershell

#powershell

Вопрос:

Просто любопытно, можно ли использовать метод Where в сочетании с циклом ForEach?

 $numbers = @(1..10)

ForEach($number in $numbers.Where({$number = 2})){

    Write-Host "the number is $number"

}
 

Хорошо, разобрался

Оказывается, вы также можете выполнить это с помощью Get-ChildItem, используя следующее

 $start = Get-Date
$end = (Get-Date).AddDays(-1)
$sourcePath = Get-ChildItem -path "C:"

ForEach($file in ($sourcePath.where({$_.CreationTime -ge $end -and 
$_.CreationTime -le $start}))){

    Write-Host $file.Name

}
 

Спасибо!

Комментарии:

1. -эквалайзер not =, $_ not $number $numbers = 1..10; ForEach($number in $numbers.Where{$_ -eq 2})

2. Есть ли какая-то причина не использовать трубы? Get-ChildItem -Path "C:" | Where-Object { $_.CreationTime -ge $end -and $_.CreationTime -le $start } | ForEach-Object { Write-Host $_.Name }

3. Вы можете получить немного лучшую производительность, избегая конвейера. Вероятно, в данном случае это несущественно.

4. @Dabombber причина, по которой я не могу использовать канал, заключается в том, что фактический код, в который это входит, находится во вложенном цикле, где мне нужно использовать BREAK, чтобы выйти из этого внутреннего цикла. Однако при использовании break с каналами, по-видимому, он останавливает весь канал, поэтому я должен использовать ForEach, чтобы внешний цикл продолжался. Я просто привел супер-супер простой пример, чтобы я мог понять синтаксис концепции для применения к моему фактическому коду.

5. @N.Ха, да, это раздражающий способ попасться. Это может сделать ваш код более читаемым, если вы объедините Where-Object с Get-ChildItem , а не помещаете его в цикл. $fileList = Get-ChildItem -Path "C:" | Where-Object {$_.CreationTime -ge $end -and $_.CreationTime -le $start} и foreach ($file in $fileList) { . Или пойти другим путем и использовать обычный if s: foreach ($file in $sourcePath) { if ($file.CreationTime -ge $end -and $file.CreationTime -le $start) { Write-Host $file.Name } } . Просто используйте то, что кажется более подходящим.

Ответ №1:

Возможно, вы получаете неприятный уровень вложенности по сравнению с выполнением этого в той же строке, что и $numbers.

 $numbers = @(1..10)

ForEach($number in ($numbers.Where({$_ -eq 2}))){

    Write-Host "the number is $number"

}
 

Комментарии:

1. итак, последующий вопрос. Будет ли работать метод Where при попытке использовать его с Get-ChildItem ? Например $path = "C:" ForEach($file in $path.Where($_.CreationTime -ge $end -and $_.CreationTime -le $start){ Write-Host "something" }

2. Да, вы можете использовать . Метод Where для результатов Get-Childitem или любого другого массива. Нет смысла использовать его для строки типа «C: » в вашем примере.

3. Я был в довольно странной ситуации, но я смог разобраться в синтаксисе. Большое вам спасибо! Отредактированный исходный вопрос: D