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



我试图在PowerShell中传递一些脚本变量到Invoke-Sqlcmd,如下所示:

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

我得到以下错误:

用于定义Invoke-Sqlcmd cmdlet的新变量的格式为无效的。请使用"var=value"格式来定义一个新的变量。

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

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

.GetType()$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

相关内容

  • 没有找到相关文章

最新更新