Один из моих сценариев может быть приведен к следующему коду.
function Replace
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory, Position=0)]
[string]
$LiteralPath,
[Parameter(Mandatory, Position=1)]
[string]
$Expression,
[Parameter(Mandatory, Position=2)]
[string]
$Replacement
)
Get-Content $LiteralPath | ForEach-Object {$_ -replace $Expression, $Replacement } | Set-Content $LiteralPath + ".temp"
}
Пример вызова сценария будет
Replace ".\MyFile.txt" "^#define abc.*" "#define abc 1"
Я столкнулся с ситуацией, когдаСтрока, которую мне нужно найти и заменить, содержит как знаки доллара, так и подчеркивание.Чтобы избежать расширения переменной PowerShell, знаки доллара должны быть экранированы.Одна строка содержит знак доллара, за которым следует подчеркивание.Это вызывает проблему, поскольку PowerShell не расширяет имя переменной, а затем расширяет переменную $_
.Как я могу запретить PowerShell расширять как имя переменной, так и токен конвейера.
Это пример вызова функции со строкой, которую мне нужно экранировать.
Replace ".\MyFile.txt" "^\#\`$__LIBRARY_DIR\\prj.gpj" "`$__LIBRARY_DIR\prj.gpj"
В этом примере строкатекста, который читается как #$__LIBRARY_DIR\prj.gpj
, изменяется на #$__LIBRARY_DIR\prj.gpj_LIBRARY_DIR\prj.gpj
. Я ищу текст, который нужно изменить на $__LIBRARY_DIR\prj.gpj
Обратите внимание, что $_
расширен, и я не хочу его расширять.Я попытался добавить больше escape-символов, но это только заставляет их появляться в файле.Как можно экранировать строку, чтобы предотвратить расширение $_
?