防止变量和变量中的特殊字符替换

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 处理或尝试解析参数值(这两个都是原始问题的原因)。