防止变量和变量中的特殊字符替换
Prevent variable and special character substitution in variable
我正在使用存储过程将文件中的正则表达式加载到数据库中,如下所示:
$stuff = Get-Content -Path '.\data.txt' -Raw
Invoke-Sqlcmd -Query "Exec dbo.loadStuff @stuff='$stuff'" -ServerInstance $server -Database $database -Username $username -Password $password
这在大多数情况下都有效,但有时文件包含 $randomtext
,PowerShell 随后无法展开,因为 $randomtext
变量不存在。
有没有办法告诉 PowerShell 按原样传递 $stuff
变量的内容而不扩展它?
添加 -DisableVariables
似乎不起作用。
编辑:正如 zett42 所指出的,PowerShell 没有执行第二次扩展。它将全文传递给 sqlcmd
.
sqlcmd
正在查找 $(randomtext)
并将其视为变量。 -DisableVariables
应该已经解决了这个问题,但没有。
从测试源文件中删除所有 $ 符号后它仍然失败,我怀疑这是由于 $stuff
包含单引号和双引号。
我没有意识到 Invoke-Sqlcmd
只是通往 sqlcmd
的过渡。我将停止使用 Invoke-Sqlcmd
并改用 zett42 提供的资源。
Invoke-Sqlcmd
非常适合简单调用,但如果您要执行更复杂的操作(例如将任意文本作为参数传递),最好使用 .NET 堆栈,例如 System.Data.SqlClient.SqlCommand
.
我重写了我的代码以使用这种更合适的方法,并且我能够传递绑定参数(不可能 SQL 注入)无需 PowerShell 或 sqlcmd 处理或尝试解析参数值(这两个都是原始问题的原因)。
我正在使用存储过程将文件中的正则表达式加载到数据库中,如下所示:
$stuff = Get-Content -Path '.\data.txt' -Raw
Invoke-Sqlcmd -Query "Exec dbo.loadStuff @stuff='$stuff'" -ServerInstance $server -Database $database -Username $username -Password $password
这在大多数情况下都有效,但有时文件包含 $randomtext
,PowerShell 随后无法展开,因为 $randomtext
变量不存在。
有没有办法告诉 PowerShell 按原样传递 $stuff
变量的内容而不扩展它?
添加 -DisableVariables
似乎不起作用。
编辑:正如 zett42 所指出的,PowerShell 没有执行第二次扩展。它将全文传递给 sqlcmd
.
sqlcmd
正在查找 $(randomtext)
并将其视为变量。 -DisableVariables
应该已经解决了这个问题,但没有。
从测试源文件中删除所有 $ 符号后它仍然失败,我怀疑这是由于 $stuff
包含单引号和双引号。
我没有意识到 Invoke-Sqlcmd
只是通往 sqlcmd
的过渡。我将停止使用 Invoke-Sqlcmd
并改用 zett42 提供的资源。
Invoke-Sqlcmd
非常适合简单调用,但如果您要执行更复杂的操作(例如将任意文本作为参数传递),最好使用 .NET 堆栈,例如 System.Data.SqlClient.SqlCommand
.
我重写了我的代码以使用这种更合适的方法,并且我能够传递绑定参数(不可能 SQL 注入)无需 PowerShell 或 sqlcmd 处理或尝试解析参数值(这两个都是原始问题的原因)。