powershell - 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 的东西。
解决方案
我可能会做类似的事情,
$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"".
推荐阅读
- python - 在另一个 .txt 文件中逐位搜索一个 .txt 文件的内容段并打印匹配行
- python - 在 Python Pandas 中将 1 分钟 OHLCV 数据重采样为 5 分钟数据
- reactjs - TypeError:无法读取未定义的属性“格式”
- ruby-on-rails - 将 Sinatra 语法转换为 Rails
- python - 特定窗口的键盘输入(python)
- javascript - CSS - 如何为文本设置永久位置,而不管上面出现的任何文本消息
- amazon-web-services - 获取 CWMetricData cmdlet 示例
- c - 将四个 16 位数字组合成一个 64 位数字
- sql - 查询 - 嵌套顶部 1 选择
- selenium - 在 Maven 项目中运行 Runner.java 时出错