Где должны быть инициализированы переменные в строках PowerShell? - PullRequest
3 голосов
/ 06 июля 2011

У меня довольно сложный SQL-запрос, который я хочу использовать в строке здесь в скрипте PowerShell. Внутри запроса я хочу заменить определенные значения переменными 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
}

Я объявляю строку здесь вверху, и она ссылается на пару переменных PowerShell, $ bar и $ quux, которые меняются каждый раз при прохождении цикла.

Однако, я получаю ошибки, когда запускаю свой скрипт. Когда я запускаю трассировку SQL, нет значения, где переменные PowerShell появляются в сценарии PS.

Переменные PowerShell интерполируются при вызове в строке здесь, как это? Нужно ли помещать всю строку здесь в цикл, где инициализируются переменные? Какова правильная структура для чего-то подобного?

Я использую PowerShell в Windows 7, .Net 4, VS2010. Я не ясно о версии; $Host возвращает

Name             : PowerConsole
Version          : 1.0.30222.0

но $PSVersionTable возвращает

PSVersion             2.0                                                      
PSCompatibleVersions  {1.0, 2.0}
BuildVersion          6.1.7601.17514

Ответы [ 3 ]

5 голосов
/ 06 июля 2011

отредактировано для включения предложения Марка предполагает, что вы частично сопоставляете порядок массива с порядком, используемым с {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, Matt

3 голосов
/ 06 июля 2011

Попробуйте это (одна строка в кавычках):

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

1 голос
/ 06 июля 2011

Как отмечает Шей, переменные в строке здесь должны быть объявлены до их использования в строке здесь. У меня была возможность захотеть переместить его, чтобы было легче читать / поддерживать скрипт, и использовал блок скрипта:

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