Powershell转义另一个变量中使用的变量中的引号

Powershell escaping quotation marks in a variable that is used in another variable

我发现很多 post 解释了如何使用 """" 表示一个双引号,或 '''' 表示单引号来逐字转义单引号和双引号标记(或只是做 `")。我发现自己处于需要搜索在不同查询中输入的名称列表的情况:

Foreach($Username in $AllMyUsers.Username){

    $Filter = "User = '$Username'"
    # do some more code here using $Filter

}

当我输入像 O'toole 或 O'brian 这样包含引号的用户名时,就会出现问题。如果字符串是文字,我可以用

转义它
O`'toole
O''brian
etc.

但是,由于它处于循环中,我需要为每个用户转义引号。

我尝试使用 [regex]::Escape(),但它没有转义引号。
我可能会做类似 $Username.Replace("'","''") 的事情,但感觉应该有一个比必须手动转义引号更通用的解决方案。在其他情况下,我可能需要转义单倍和双倍,并且只是像这样添加 .Replace $VariableName.Replace("'","''").Replace('"','""') 并不觉得这是最有效的编码方式。

感谢任何帮助!

编辑:这感觉就像“如何避免 SQL 注入?”问题,但用于在 Powershell 中处理字符串。我想我正在寻找类似 mysqli_real_escape_string 的东西,但对于 Powershell。

I could probably do something like $Username.Replace("'","''") but it feels like there should be a more generic solution than having to manually escape the quotation marks

正如 Mathias R. Jessen 的评论所暗示的,没有 generic 解决方案,因为您正在处理 embedded '...' 字符串,转义要求完全取决于最终目标 API 或实用程序 - 这不太可能是 PowerShell 本身(其中 '...' 字符串中的 ' 必须加倍,即表示为'').

在手头的例子中,您将过滤器字符串传递给 System.Data.DataTable's .DataView's .RowFilter property, '' is required as well

处理所需转义的概念上最简洁的方法是使用 -fformat operator,并结合单独的字符串替换操作:

$Filter = "User = '{0}'" -f ($UserName -replace "'", "''")

请注意 PowerShell 的 - 而不是 .NET [string] 类型的 .Replace() 方法 - 是如何用于执行替换的。

除了更符合 PowerShell 的习惯(关于:语法,默认情况下 不区分大小写 ,接受 数组 作为输入,按需转换为字符串),-replace 是基于 regex 的,这也使得执行 多个 替换更容易。

用你假设的 .Replace("'","''").Replace('"','""') 例子来证明:

@'
I'm "fine".
'@ -replace '[''"]', '[=11=][=11=]'

输出:

I''m ""fine"".