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。
处理所需转义的概念上最简洁的方法是使用 -f
、format 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"".
我发现很多 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。
处理所需转义的概念上最简洁的方法是使用 -f
、format operator,并结合单独的字符串替换操作:
$Filter = "User = '{0}'" -f ($UserName -replace "'", "''")
请注意 PowerShell 的 [string]
类型的 .Replace()
方法 - 是如何用于执行替换的。
除了更符合 PowerShell 的习惯(关于:语法,默认情况下 不区分大小写 ,接受 数组 作为输入,按需转换为字符串),-replace
是基于 regex 的,这也使得执行 多个 替换更容易。
用你假设的 .Replace("'","''").Replace('"','""')
例子来证明:
@'
I'm "fine".
'@ -replace '[''"]', '[=11=][=11=]'
输出:
I''m ""fine"".