Как сделать переменные уровня ресурса
Например, допустим, у меня есть ресурс 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" } }
}
}
}