Какой способ лучше в PowerShell и почему - PullRequest
1 голос
/ 20 апреля 2020

Я новичок в powershell и очень редко использую его для каких-то мелочей. Я использую этот вкладыш для извлечения рекурсивных писем

(Get-ChildItem -Include *.txt -Recurse | Get-Content | Select-String -Pattern "(?:[a-zA-Z0-9_\-\.]+)@(?:[a-zA-Z0-9_\-\.]+)\.(?:[a-zA-Z]{2,5})").Matches | Select-Object -ExpandProperty Value -Unique

Для доступа к свойству Matches я добавил круглые скобки. Позже я приду к такому выводу:

Get-ChildItem -Include *.txt -Recurse | Get-Content | Select-String -Pattern "(?:[a-zA-Z0-9_\-\.]+)@(?:[a-zA-Z0-9_\-\.]+)\.(?:[a-zA-Z]{2,5})" | Select-Object -ExpandProperty Matches -Unique | Select-Object -ExpandProperty Value

Я хочу спросить, какие именно скобки действуют в первой версии.

1 Ответ

1 голос
/ 21 апреля 2020

Скажем, у вас есть $output через некоторую функцию (gci в вашем случае), и вас интересует поле $output.Matches.

  • Если вы запускаете $output | select Matches (пример 1), вы запускаете оператор Foreach-Object для каждого объекта в вашем массиве. Этот конвейер будет использовать некоторое ОЗУ (действительно очень ограниченное), которое используется в последовательном вычислении, поэтому каждый объект $ output обрабатывается один за другим.

  • Если вы запустите $output.Matches (пример 2), вы выбираете поле из массива. При этом одновременно будет использоваться много оперативной памяти, но поле будет обрабатываться как один большой объект вместо множества маленьких объектов.

Что касается производительности. Как всегда, обратите внимание, что PowerShell не подходит для go, если вам нужна высокая производительность. Он никогда не был разработан, чтобы быть быстрым языком программирования.

При использовании небольших объектов (например, gci $env:userprofile\Desktop) снижение производительности будет небольшим. При использовании больших объектов или использовании большого количества вложенных каналов производительность будет большой.

Я только что проверил ее с gci Z:\ -recurse, когда Z: \ является сетевым диском. В этом конкретном случае c производительность падает с коэффициентом 20. (Используйте Measure-Command, чтобы проверить это.)

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