我想在PowerShell脚本中的here-string中使用相当复杂的SQL查询。在查询中,我想用PowerShell变量替换某些值。我试图准确理解我需要声明和初始化将在here-string中使用的变量。
简化示例:
$SqlQuery = @"
update MyTable
set foo = $bar
where baz = $quux
"@
...
foreach ($part in $parts) {
$bar = $part[0]
$quux = $part[1]
Run-SqlNonQuery $SqlQuery #Run-SqlNonQuery is a funct. that executes the query
}
我在顶部声明了here-string,它引用了一些PowerShell变量,$ bar和$ quux,每次循环都会改变。
但是,我在运行脚本时遇到错误。当我运行SQL跟踪时,PS脚本中没有出现PowerShell变量的值。
在像这样的here-string中调用时,PowerShell变量是否被插值?我是否需要将整个here-string 放在变量初始化的循环中?对于这样的事情,正确的结构是什么?
我在Windows 7,.Net 4,VS2010上运行PowerShell。我不清楚这个版本; $Host
返回
Name : PowerConsole
Version : 1.0.30222.0
但$PSVersionTable
返回
PSVersion 2.0
PSCompatibleVersions {1.0, 2.0}
BuildVersion 6.1.7601.17514
答案 0 :(得分:5)
已修改为包含Mark的建议 假设您将数组的顺序部分与{x}等使用的顺序匹配。
$SqlQuery = @"
update MyTable
set foo = {0}
where baz = {1}
"@
...
foreach ($part in $parts) {
Run-SqlNonQuery $SqlQuery -f $part #Run-SqlNonQuery is a funct. that executes the query
}
原始版本
这应该做的工作
$SqlQuery = @"
update MyTable
set foo = {0}
where baz = {1}
"@
...
foreach ($part in $parts) {
$bar = $part[0]
$quux = $part[1]
Run-SqlNonQuery $SqlQuery -f $bar, $quux #Run-SqlNonQuery is a funct. that executes the query
}
如果您想要更多信息Google“powershell字符串格式化”
HTH, 马特
答案 1 :(得分:3)
试试这个(单引号here-string):
$SqlQuery = @'
update MyTable
set foo = $bar
where baz = $quux
'@
foreach ($part in $parts)
{
$bar = $part[0]
$quux = $part[1]
$q = $ExecutionContext.InvokeCommand.ExpandString($SqlQuery)
Write-Host $q
#Run-SqlNonQuery $q
}
<击> 通常,您需要在分配变量(在循环内)后声明here-string。您可以使用子表达式来扩展值(例如$(...)):
foreach ($part in $parts) {
$SqlQuery = @"
update MyTable
set foo = $bar
where baz = $quux
"@
$bar = $part[0]
$quux = $part[1]
Write-Host $($SqlQuery)
#Run-SqlNonQuery $($SqlQuery)
}
击> <击> 撞击>
答案 2 :(得分:1)
正如Shay所说,here-string中的变量需要在here-string中使用之前声明。我有机会想要移动它只是为了使脚本更容易阅读/维护,并使用脚本块:
$MakeHereString = {
@"
Variables 1-3 are:
Variable 1 = $variable1
Variable 2 = $variable2
Variable 3 = $variable3
"@
}
$Variable1 = "First"
$Variable2 = "Second"
$Variable3 = "Third"
&$MakeHereString
Variables 1-3 are:
Variable 1 = First
Variable 2 = Second
Variable 3 = Third
对于你的例子:
$SqlQuery = {
@"
update MyTable
set foo = $bar
where baz = $quux
"@
}
...
foreach ($part in $parts) {
$bar = $part[0]
$quux = $part[1]
Run-SqlNonQuery (&$SqlQuery) #Run-SqlNonQuery is a funct. that executes the query
}