我试图在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