Как заменить текст в файле с помощью Powershell? - PullRequest
0 голосов
/ 09 октября 2019

Я хочу удалить следующий текст в моих файлах .csproj

    <EmbeddedResource Include="Properties\licenses.licx" />. 

Поэтому другими словами заменить на ''. Я пробовал следующее

$c = (($_ | Get-Content)) | Out-String
if ($c.Contains("<EmbeddedResource Include=""Properties\licenses.licx"" />"))
{
  $c = $c -replace "<EmbeddedResource Include=""Properties\licenses.licx"" />",""

Это говорит, что шаблон регулярного выражения недопустим. Как я могу установить регулярные выражения здесь?

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Вы можете сделать следующее:

$content = Get-Content $File
$replace = [regex]::Escape('<EmbeddedResource Include="Properties\licenses.licx" />')
$content = $content -replace $replace

Использование [regex]::Escape() автоматически создаст для вас экранированную строку регулярного выражения. Поскольку вы хотите заменить совпадение пустой строкой, вы можете просто сделать простой синтаксис string -replace value и отказаться от замены строки. Только соответствующие строки будут заменены. Несоответствующие строки останутся без изменений. Если вы используете одинарные кавычки вокруг строки регулярного выражения (или любой строки), все, что внутри, будет обрабатываться как литеральная строка, что упрощает захват внутренних кавычек.

Кроме того, технически не нужно устанавливать Get-Content к переменной в первую очередь. Вся команда может быть LHS -replace.

$content = (Get-Content $File) -replace $replace
0 голосов
/ 09 октября 2019

Все, что вам не хватает, это \ для экранирования \ разделителя пути к файлу. Вы также можете добавить \r\n, чтобы избежать пустой строки в файле проекта.

# $content = Get-Content "File.csproj"

$content = "
<EmbeddedResource Include=`"SomeFile.txt`" />
<EmbeddedResource Include=`"Properties\licenses.licx`" />
<EmbeddedResource Include=`"SomeOtherFile.txt`" />
"

$content = $content -replace '<EmbeddedResource Include="Properties\\licenses.licx" />\r\n',''

# $content | Out-File "File.csproj"

Write-Host $content

# Output
# <EmbeddedResource Include="SomeFile.txt" />
# <EmbeddedResource Include="SomeOtherFile.txt" />
...