Мы знаем, что % - это псевдоним ForEach-Object . Но я могу использовать такую команду, чтобы удалить "image" из имени файла

gci | Rename-Item -NewName {$_.Name.replace("image","")}

Я знаю, что это вызов ForEach-Object для его реализации. Как понять это использование о пропуске символа %?


И почему эта команда не может опустить символ %

ls | Rename-Item {$_.name ($_.name -replace "image")}//error command.

1 ответ1

2

Командлет Get-ChildItem получает все файлы в текущей папке, а затем использует оператор конвейера (|) для отправки этих файлов в Rename-Item.

Он отправляет файлы один за другим, каждый как отдельный элемент, так что Rename-Item также получает их один за другим и воздействует на каждого по очереди.

В блоке сценария автоматическая переменная $_ представляет каждый файловый объект, когда он поступает к команде через конвейер, поэтому он может воздействовать на нее.

Это поведение сильно отличается от поведения операционной системы, где первая команда в конвейере производит весь вывод в виде одного списка, который затем передается как один блок через конвейер.

Философия конвейеров PowerShell имеет следующие цели:

  • Заставьте каждую программу делать что-то хорошо
  • Ожидайте, что выходные данные каждой программы станут входными данными для другой

Таким образом, вы можете выполнять строковые программы, где каждая из них делает что-то одно, не требуя от сценария использования искусственных объектов, таких как списки. Такие сложные объекты или списки требуют анализа, которого PowerShell избегает, передавая элементы вместо списков.

В заключение, ForEach-Object не требуется, потому что концепция конвейера PowerShell разработана специально для того, чтобы избежать циклов, которые потребовали бы этого. Здесь нет подразумеваемого цикла, есть только две программы, одна из которых генерирует элементы, которые обрабатываются следующей в конвейере.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .