Основная проблема сценария PowerShell: "выражения разрешены только в качестве первого элемента конвейера"

Я пытаюсь написать простой скрипт, который читает файл, находит строку, заменяет строку другой строкой и сохраняет все новое содержимое файла (с замененной строкой) в новом файле. Вот что я использую:

(Get-Content C:file1.txt) | {$_ -replace "this:text", "withthis:text"} | Set-Content C:file2.txt

ошибка, которую я получаю: "выражения разрешены только как первый элемент конвейера"

Я уверен, что это из-за двоеточия ":" символ находится в обеих строках, которые я нахожу и заменяю его. Я пробовал экранирование символа двоеточия с символами " "и"`", но я получаю те же ошибки. Кто-нибудь знает, что в этом плохого?

Спасибо за помощь.

2 ответов


проблема заключается во втором элементе вашего конвейера.

{$_ -replace "this:text", "withthis:text"}

это блок скриптов (т. е. фрагмент кода). Если вы хотите применить scriptblock ко всем входящим элементам конвейера, вы можете использовать такой:

(Get-Content C:\file1.txt) | foreach-object {$_ -replace "this:text", "withthis:text"} | Set-Content C:\file2.txt

@shagun использует % псевдоним foreach-object командлет, так что код также выглядит правильно.


Я думаю, это потому, что после первого канала вы не обрабатываете каждый результат. так что правильный будет по мне:

(Get-Content C:\file1.txt) | %{$_ -replace "this:text", "withthis:text"} | Set-Content C:\file2.txt