В Powershell разумное использование скобок приведет к полному завершению операции перед передачей данных следующей команде в конвейере. По умолчанию для конвейера Get-Content
передается строка за строкой к следующей команде, но в скобках перед продолжением необходимо сформировать полный набор данных (например, загрузить все строки):
(Get-Content myFile) | Select-String 'MyFilter' | Set-Content myFile
Альтернативой, которая может использовать меньше памяти (я ее не тестировал), является принудительное выполнение только результатов Select-String
перед продолжением:
(Get-Content myFile | Select-String 'MyFilter') | Set-Content myFile
Вы также можете назначить переменную как дополнительный шаг. Любая техника загружает содержимое в память сессии Powershell, поэтому будьте осторожны с большими файлами.
Приложение: Select-String
возвращает MatchInfo
объектов. Использование Out-File
добавляет досадные лишние пустые строки из-за того, как он пытается отформатировать результаты в виде строки, но Set-Content
правильно преобразует каждый объект в свою собственную строку при записи, обеспечивая лучший вывод. Поскольку вы пришли из * nix и привыкли ко всему, что возвращает строки (тогда как Powershell возвращает объекты), один из способов принудительного вывода строк - это передать их через foreach
, который преобразует их:
(Get-Content myFile | Select-String 'MyFilter' | foreach { $_.tostring() }) | Set-Content myFile