在 PowerShell 中将非文字脚本变量传递给 Invoke-Sqlcmd 时出错

Error passing non-literal scripting variables to Invoke-Sqlcmd in PowerShell

我正在尝试将一些脚本变量传递给 PowerShell 中的 Invoke-Sqlcmd,如下所示:

$hello = "hello"
$params = "greeting=" + $hello, "audience=world"
Invoke-Sqlcmd -Query "select '`$(greeting) `$(audience)'" -Variable $params

我收到以下错误:

The format used to define the new variable for Invoke-Sqlcmd cmdlet is invalid. Please use the 'var=value' format for defining a new variable.

但是如果我删除 $hello 并使用文字,我就成功了:

$params = "greeting=hello", "audience=world"

.GetType() returns $params 的两个版本都一样,所以我不确定是什么问题。

在您的第一个示例中,变量 $params 被设置为 string:

$hello = "hello"
$params = "greeting=" + $hello, "audience=world"
$params.GetType()

IsPublic IsSerial Name          BaseType
-------- -------- ----          --------
True     True     String        System.Object

PS /> $params
greeting=hello audience=world

除非你告诉 PowerShell 你想要一个 object[] 作为你的操作结果。即:用 ( ):

包围串联操作
$params = ("greeting=" + $hello), "audience=world"
$params.GetType()

IsPublic IsSerial Name            BaseType
-------- -------- ----            --------
True     True     Object[]        System.Array

PS /> $params
greeting=hello
audience=world

或者使用 array sub-expression operator 例如:

$params = @(
    "greeting=" + $hello
    "audience=world"
)

有关这方面的官方文档,请参阅 about_Operator_Precedence

$string = 'a'
$array = 'b','c'

PS /> ($string + $array).GetType()

IsPublic IsSerial Name          BaseType
-------- -------- ----          --------
True     True     String        System.Object

PS /> $string + $array
ab c

PS /> ($array + $string).GetType()

IsPublic IsSerial Name            BaseType
-------- -------- ----            --------
True     True     Object[]        System.Array

PS /> $array + $string
b
c
a