带有文本“$__VAR__”的 PowerShell Dobule 转义字符串
PowerShell Dobule Escape string with text "$__VAR__"
我的一个脚本可以简化为以下代码。
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
的文本
请注意 $_
已展开,我不希望它展开。我尝试添加更多转义字符,但这只会导致它们出现在文件中。如何对字符串进行转义以防止 $_
扩展?
在 powershell 中,如果您不希望变量在您的字符串中扩展,请使用 'single quotes' 而不是 "double quotes",这样可以省去转义 $
符号的麻烦反引号。
现在,在您的情况下,您面临着额外的挑战,即 -replace
运算符还希望在替换字符串中扩展以 $
符号开头的表达式,而不管引号的类型如何你用的。
要告诉 -replace
您确实想在替换字符串中看到 $
,您需要编写 $$
:
'#$__LIBRARY_DIR\prj.gpj' -replace '^#$__LIBRARY_DIR\prj.gpj','$$__LIBRARY_DIR\prj.gpj'
注意:正如其他人在评论中正确指出的那样,如果您的任务是从前导 #
中删除表达式,您可以在更多简单方法:
'#$__LIBRARY_DIR\prj.gpj' -replace '^#'
或者用旧的 "trim":
'#$__LIBRARY_DIR\prj.gpj'.TrimStart('#')
我的一个脚本可以简化为以下代码。
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
请注意 $_
已展开,我不希望它展开。我尝试添加更多转义字符,但这只会导致它们出现在文件中。如何对字符串进行转义以防止 $_
扩展?
在 powershell 中,如果您不希望变量在您的字符串中扩展,请使用 'single quotes' 而不是 "double quotes",这样可以省去转义 $
符号的麻烦反引号。
现在,在您的情况下,您面临着额外的挑战,即 -replace
运算符还希望在替换字符串中扩展以 $
符号开头的表达式,而不管引号的类型如何你用的。
要告诉 -replace
您确实想在替换字符串中看到 $
,您需要编写 $$
:
'#$__LIBRARY_DIR\prj.gpj' -replace '^#$__LIBRARY_DIR\prj.gpj','$$__LIBRARY_DIR\prj.gpj'
注意:正如其他人在评论中正确指出的那样,如果您的任务是从前导 #
中删除表达式,您可以在更多简单方法:
'#$__LIBRARY_DIR\prj.gpj' -replace '^#'
或者用旧的 "trim":
'#$__LIBRARY_DIR\prj.gpj'.TrimStart('#')