Автоматическая переменная $_
, представляющая текущий входной объект на каждом шаге конвейера, может использоваться только в аргументах, которые блоки сценариев ({ ... }
), но не в расширяемые строки ("..."
).
Блок сценариев для каждого объекта ввода чаще всего используется с командлетом ForEach-Object
, но вы также можете использовать его как параметр блока скрипта задержки-привязки с параметрами конвейерной привязки .
Хотя это не работает с Out-File
, оно работает с Set-Content
, чтокак правило, правильный инструмент для использования с строками в любом случае:
(Get-ChildItem D:\Data -File -Filter *.csv).Count |
Set-Content -LiteralPath { "D:\test$_.txt" }
Обратите внимание, что я заменил -Include
на -Filter
, что не только более эффективно, но итакже позволяет избежать ловушки
-Include
, применяемой только к входному каталогу , а не к элементам внутри него - см. эту проблему GitHub .
Предупреждение : В Windows PowerShell - но, к счастью, больше не в PowerShell Core , где (без спецификации) UTF-8 теперь последовательно используется - Out-File
и Set-Content
по умолчанию используют разные кодировки символов: UTF-16LE ("Unicode") в сравнении с активной кодовой страницей ANSI системы ("По умолчанию")«);при необходимости используйте параметр
-Encoding
, чтобы указать требуемую кодировку.