Когда командлет выводит что-то в конвейер, конвейер выполняется до обработки следующего вывода командлета.Таким образом, поскольку ваша строка работает по конвейеру до Set-Content
, Get-Content
все еще активен (с открытым выходным файлом), ожидая своей очереди на продолжение выполнения.Однако когда вы заключаете выражение в ()
, все выходные данные собираются в массив, который затем передается по конвейеру.Get-Content
готово и файл закрыт.Чтобы продемонстрировать, рассмотрим эту функцию:
function get-10dates { $count = 0; while($count -lt 10){ get-date; $count += 1 }}
, когда вы запускаете ее и передаете ее в цикл foreach
:
get-10dates | foreach { $_; sleep -Seconds 1 }
, вы получаете следующий вывод, каждая дата которого задерживается насекунда, из-за sleep
в foreach:
# ~> get-10dates | foreach { $_; sleep -Seconds 1 }
June 19, 2019 9:58:36 AM
June 19, 2019 9:58:37 AM
June 19, 2019 9:58:38 AM
June 19, 2019 9:58:39 AM
June 19, 2019 9:58:40 AM
June 19, 2019 9:58:41 AM
June 19, 2019 9:58:42 AM
June 19, 2019 9:58:43 AM
June 19, 2019 9:58:44 AM
June 19, 2019 9:58:45 AM
Теперь, если вы оберните функцию в ()
.Вы можете видеть, что все 10 дат создаются одновременно (в течение 1 секунды), прежде чем они будут переданы по конвейеру:
# ~> (get-10dates) | foreach { $_; sleep -Seconds 1 }
June 19, 2019 9:58:53 AM
June 19, 2019 9:58:53 AM
June 19, 2019 9:58:53 AM
June 19, 2019 9:58:53 AM
June 19, 2019 9:58:53 AM
June 19, 2019 9:58:53 AM
June 19, 2019 9:58:53 AM
June 19, 2019 9:58:53 AM
June 19, 2019 9:58:53 AM
June 19, 2019 9:58:53 AM