首页 > 解决方案 > Powershell在另一个变量中使用的变量中转义引号

问题描述

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

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 的东西。

标签: powershellescapingquoting

解决方案


我可能会做类似的事情,$Username.Replace("'","''")但感觉应该有一个比手动转义引号更通用的解决方案

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

在手头的情况下,您将过滤器字符串传递给System.Data.DataTable's.DataView.RowFilter属性,''也是必需的

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

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

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

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

用您的假设.Replace("'","''").Replace('"','""')示例进行演示:

@'
I'm "fine".
'@ -replace '[''"]', '$0$0'

输出:

I''m ""fine"".

推荐阅读