3

PowerShell スクリプトのヒア文字列で使用したいかなり複雑な 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
}

先頭でヒア文字列を宣言しています。これは、ループのたびに変化する $bar と $quux という 2 つの PowerShell 変数を参照しています。

ただし、スクリプトを実行するとエラーが発生します。SQL トレースを実行すると、PowerShell 変数が PS スクリプトに表示される場所に値がありません。

このようなヒア文字列で呼び出された場合、PowerShell 変数は補間されますか? 変数が初期化されるループにヒア文字列全体を入れる必要がありますか? このようなものに適した構造は何ですか?

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

これを試してください(一重引用符で囲まれた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)
}

于 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 に答える