2014-11-18 4 views
0

В PowerShell, как заменить:PowerShell комплекс -replace

Session("*Logging")="true" 

в

Session("*Logging")="false" 

Следующий скрипт PowerShell не работает.

get-content E:\WebSystems\Web1\web.config -replace "Session("*Logging")="true"", "Session("*Logging")="false"" | set-content E:\WebSystems\Web1\web.config 

Это говорит кучу ошибок:

Вы должны указать выражение значения на правой стороне оператора «*».

Неожиданный токен ... в выражении или заявлении.

Отсутствует аргумент в списке параметров.

+0

Это строковый литерал: 'Session (" * Logging ") =" true "'? '-replace' использует регулярное выражение для поиска совпадений, а' * '- это специальный символ, который нужно экранировать. – Matt

ответ

3

Если Session("*Logging")="true" является строковым литералом, некоторые персонажи должны были бы сбежать, чтобы матч работал. -replace использует регулярное выражение для соответствия строк, а скобки и звездочки имеют специальные функции. Одна вещь, которую вы можете сделать, это использовать статический метод [regex]::escape, чтобы выполнить тяжелую работу для вас. Другие проблемы заключаются в том, что в скобках необходимо заключить Get-Content, иначе он будет обрабатывать -replace в качестве параметра Get-Content. Кроме того, строка не сбрасывается должным образом, что является причиной большинства синтаксических ошибок. В приведенных ниже переменных я включаю строку в одинарные кавычки, которая является одним из нескольких подходов для решения этой проблемы.

$match = [regex]::escape('Session("*Logging")="true"') 
$replace = 'Session("*Logging")="false"' 

(get-content E:\WebSystems\Web1\web.config) -replace $match, $replace | .... 

Снятая строка выглядит как Session\("\*Logging"\)="true". Вам не нужно работать над специальными символами для самой строки замены.

3

Ваша строка со ссылкой на пюре, «Session (» это строка, то * Logging выходит за пределы строки, и PowerShell пытается справиться с ней как умножение или аналогичный.

Если вы зафиксировали цитирование, вы бы тогда нужно бежать REGEX специальные символы, чтобы использовать их в качестве строковых литералов.

И если вы исправить это, я в конечном итоге с ошибкой говоря get-content не принимает параметр -replace.

Как о чем-то :

Это использует foreach для доступа к методу string.replace(), который использует строковые литералы и избегает иметь дело с escape-окнами regex, использует одинарные кавычки, чтобы иметь строку с двойными кавычками в ней и обертывает get- содержимое в круглых скобках, поэтому он считывает все содержимое и закрывает файл и не сталкивается с установленным содержимым.

+0

Не требуется встраивание в ForEach ... это будет работать' (get-content 'C: \ temp \ new 2.txt ') - замените «ABC», «CBA» | Set-Content c: \ temp \ newer.txt'. Похоже, мы заметили все то же самое. – Matt

+0

@ Matt Piping в ForEach не требуется для решения, но при этом он дает доступ к $ _. Replace(), который представляет собой другой метод Replace, который не имеет отношения к Regexes, поэтому вытеснение символа регулярного выражения перестает иметь значение. – TessellatingHeckler

+1

Вы все еще могли бы выполнить (gc E: \ WebSystems \ Web1 \ web.config) .Replace ('Session («* Logging») = «true», «Session (« * Logging ») =« false »') '.Просто представить вариант все – Matt

Смежные вопросы