3

我有一个相当复杂的 SQL 查询,我想在 PowerShell 脚本的 here-string 中使用。在查询中,我想用 PowerShell 变量替换某些值。我试图准确了解我需要在哪里声明和初始化将在此处字符串中使用的变量。

简化示例:

$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 跟踪时,PowerShell 变量出现在 PS 脚本中的位置没有任何值。

当在这样的字符串中调用时,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
4

3 回答 3

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,马特

于 2011-07-06T06:20:12.983 回答
3

试试这个(这里单引号字符串):

$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
}

通常,您需要在分配变量后(在循环内)声明此处的字符串。您可以使用子表达式来扩展值(例如 $(...)):

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)
}

于 2011-07-06T07:09:20.703 回答
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
}
于 2011-07-06T09:57:53.460 回答