PowerShell here-字符串中的变量必须在哪里初始化?

时间:2011-07-06 04:29:32

标签: powershell heredoc

我想在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

3 个答案:

答案 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
}