Как заменить содержимое файла с обратной косой чертой (\) в его строке с помощью PowerShell? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть файл конфигурации, в котором есть несколько заполнителей, которые я хочу заменить другими значениями с помощью PowerShell, но приведенный ниже код не может заменить %WebClientPath%\www значением, содержащимся в переменной $WebClientPath. В нем есть этот путь " C: \ IWeb \ Demo \ Main \ UIPresentation \ WebApp " где %VirtualApplicationName% заменяется IMWeb

Я попытался удалить \ www из %WebClientPath%, и это сработало, но я хочу, чтобы \ www также был заменен. Я думаю, что это происходит из-за обратной косой черты (\)

[CmdletBinding()]
Param
(   
    [string]$PathofWebConfigFile="C:\Automate\Web.config"  ,
    [string]$VirtualApplicationName="IMWeb"  
)


# Code to get WebClient Path from PhysicalPath attribute.
$WebClientPath=(get-webapplication IMWeb).PhysicalPath


(Get-Content -Path "$PathofWebConfigFile") | ForEach-Object {$_ -Replace "%VirtualApplicationName%","$VirtualApplicationName"} | Set-Content -Path "$PathofWebConfigFile"
(Get-Content -Path "$PathofWebConfigFile") | ForEach-Object {$_ -Replace "%WebClientPath%\www","$WebClientPath"} | Set-Content -Path "$PathofWebConfigFile"

Ответы [ 3 ]

0 голосов
/ 03 мая 2018


Слэш \ экранируется двойными слешами \\, попробуйте это:

"mypath\www" -replace "\\www","\zzz"

Этот командлет заменит \www на \zzz.

0 голосов
/ 03 мая 2018

Оператор -replace основан на RegEx, поэтому вам нужно либо

  • экранирование одиночных символов, которые являются директивами для RegEX или
  • если содержимое переменной неизвестно, лучше использовать [Regex]::Escape()

Вы могли бы альтернативно использовать метод String.Replace, который не основан на RegEx:

$_.Replace("%WebClientPath%\www","$WebClientPath")
0 голосов
/ 03 мая 2018

Просто, чтобы дать вам краткий обзор того, как вы можете использовать символ escape-последовательности для регулярных выражений в строке

$currenttext = "\www.google.com" 
echo "$currenttext"
$currenttext2 = [Regex]::Escape($currenttext)
echo "escaped : $currenttext2"

$newtext = "www.yahoo.com"

$currenttext2 = $currenttext2.replace($currenttext2, $newtext)
echo "$currenttext2"
...