在 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
我正在尝试将一些脚本变量传递给 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