Как сделать переменные уровня ресурса

Например, допустим, у меня есть ресурс Script:

configuration ChocolateyServer {
    node localhost {
        Script ChocolateyPackages {
            SetScript = {
                $tools = 'googlechrome,notepadplusplus,7zip,microsoftwse,octopusdeploy.tentacle,sqlserver-cmdlineutils'
                foreach($tool in $tools.Split(',')) {
                    if(($packages | ? { $_.ToString().ToLower().StartsWith($tool) }).Count -eq 0) {
                        choco install $tool -y
                    }
                }
            }
            TestScript = {
                $tools = 'googlechrome,notepadplusplus,7zip,microsoftwse,octopusdeploy.tentacle,sqlserver-cmdlineutils'
                $packages = (choco list -lr).ToLower()

                foreach($tool in $tools.Split(',')) {
                    if(($packages | ? { $_.ToString().ToLower().StartsWith($tool) }).Count -eq 0) {
                        return $false
                    }
                }

                return $true
            }
            GetScript = { return @{ Result = "nothing" } }
        }
    }
}

Я хотел бы вытащить $tools из этих двух отдельных функций, чтобы избежать дублирования кода. Я был бы доволен, чтобы иметь возможность добавить $tools на мой ресурс Script и разделить его между этими двумя функциями без необходимости определять его дважды.

Тем не менее, попытка сделать это дает мне ошибку:

Обнаружено недопустимое имя атрибута для ресурса "Сценарий". Имя атрибута должно быть простой строкой и не может содержать переменные или выражения. Замените '$ tools' простой строкой.

Как я могу поделиться этим кодом?

1 ответ

Решение

Объект Script не позволяет определять какие-либо дополнительные свойства, но я смог определить свои свойства на уровне узла и получить к ним доступ в своем ресурсе Script.

ПРИМЕЧАНИЕ. Эти переменные должны указываться с помощью using ключевое слово, например $using:tools

Пример:

configuration ChocolateyServer {
    node localhost {
        #defining it here is ok
        $tools = 'googlechrome,notepadplusplus,7zip,microsoftwse,octopusdeploy.tentacle,sqlserver-cmdlineutils'

        Script ChocolateyPackages {
            #defining it here will cause an error

            SetScript = {
                foreach($tool in $using:tools.Split(',')) {
                    if(($packages | ? { $_.ToString().ToLower().StartsWith($tool) }).Count -eq 0) {
                        choco install $tool -y
                    }
                }
            }
            TestScript = {                  
                $packages = (choco list -lr).ToLower()

                foreach($tool in $using:tools.Split(',')) {
                    if(($packages | ? { $_.ToString().ToLower().StartsWith($tool) }).Count -eq 0) {
                        return $false
                    }
                }

                return $true
            }
            GetScript = { return @{ Result = "nothing" } }
        }
    }
}
Другие вопросы по тегам