Командлет Get-ChildItem
получает все файлы в текущей папке, а затем использует оператор конвейера (|
) для отправки этих файлов в Rename-Item.
Он отправляет файлы один за другим, каждый как отдельный элемент, так что Rename-Item
также получает их один за другим и воздействует на каждого по очереди.
В блоке сценария автоматическая переменная $_
представляет каждый файловый объект, когда он поступает к команде через конвейер, поэтому он может воздействовать на нее.
Это поведение сильно отличается от поведения операционной системы, где первая команда в конвейере производит весь вывод в виде одного списка, который затем передается как один блок через конвейер.
Философия конвейеров PowerShell имеет следующие цели:
- Заставьте каждую программу делать что-то хорошо
- Ожидайте, что выходные данные каждой программы станут входными данными для другой
Таким образом, вы можете выполнять строковые программы, где каждая из них делает что-то одно, не требуя от сценария использования искусственных объектов, таких как списки.
Такие сложные объекты или списки требуют анализа, которого PowerShell избегает, передавая элементы вместо списков.
В заключение, ForEach-Object
не требуется, потому что концепция конвейера PowerShell разработана специально для того, чтобы избежать циклов, которые потребовали бы этого.
Здесь нет подразумеваемого цикла, есть только две программы, одна из которых генерирует элементы, которые обрабатываются следующей в конвейере.