Как правильно составить команду Invoke-Expression для построения значения переменной на основе значений файла конфигурации - PullRequest
0 голосов
/ 01 октября 2019

Пожалуйста, ознакомьтесь с последним кодом, который сейчас работает, больше нет необходимости в каких-либо командлетах Invoke:

$ClassificationList = $null
$classifications = $null
$ClassificationList = $ConfigFile.Settings.Project.Classifications

If ( $ClassificationList )
{
    $ClassificationList = $ClassificationList -replace ',','|'

    $classifications = $wsus.GetUpdateClassifications() | 
    where title -match $ClassificationList

    $updatescope.Classifications.Clear()
    $updatescope.Classifications.AddRange($classifications)
}

Оригинальный вопрос:

Этот вопрос был сжат, чтобы избежать путаницы.

При выполнении приведенного ниже кода:

$ScriptText = 
@"
`$classifications = `$wsus.GetUpdateClassifications() | 
        ?   {
                $_.Title -eq 'Critical Updates' `
                -OR `
                $_.Title -eq 'Security Updates' `
                -OR `
                $_.Title -eq 'Definition Updates' 
            }
"@
$scriptBlock = [Scriptblock]::Create($ScriptText)
Invoke-Command -ScriptBlock {$scriptBlock}
Write-Host $classifications

Переменная $ классификации не заполняется, но выполняетсякод без упаковки в блок скрипта работает нормально. Я пытаюсь прочитать из файла конфигурации все классификации, которые я хочу найти в WSUS, и динамически добавить их в приведенный выше сценарий, но выполнение этого сценария при его создании не работает, хотя никаких ошибок не выдается.

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Я бы сделал это так.

$wsus.GetUpdateClassifications() | 
  where title -match 'critical updates|security updates|definition updates'
0 голосов
/ 01 октября 2019

Не определяйте свой код как строку, а затем помещайте эту строку в блок скриптов.

<strike>Invoke-Command -Scriptblock {$ScriptText}</strike>

Если вам нужно создать блок скриптов из строки, вы сделаете это следующим образом:

$ScriptText = "if ( 1 -ne 2 ) {
    Write-Host 'Hello'
} else {
    Write-Host 'GoodBye'
}"
Invoke-Command -ScriptBlock ([Scriptblock]::Create($ScriptText))

Однако обычно вы создаете скрипт-блок как литерал, либо как переменную

$scriptblock = {
    if ( 1 -ne 2 ) {
        Write-Host 'Hello'
    } else {
        Write-Host 'GoodBye'
    }
}
Invoke-Command -ScriptBlock $scriptblock

, либо как встроенный

Invoke-Command -ScriptBlock {
    if ( 1 -ne 2 ) {
        Write-Host 'Hello'
    } else {
        Write-Host 'GoodBye'
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...