【问题标题】:How to make resource level variables如何制作资源级变量
【发布时间】:2017-07-04 07:48:09
【问题描述】:

例如,假设我有一个脚本资源:

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 添加到我的脚本资源并在这两个函数之间共享它而无需定义两次。

但是,尝试这样做会给我一个错误:

发现资源“脚本”的属性名称无效。 属性名称必须是简单的字符串,并且不能包含 变量或表达式。用一个简单的字符串替换 '$tools'。

如何共享此代码?

【问题讨论】:

    标签: powershell powershell-dsc


    【解决方案1】:

    脚本对象不允许定义任何额外的属性,但我能够在节点级别定义我的属性并在我的脚本资源中访问它们。

    注意:这些变量必须使用 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" } }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-12
      • 2022-01-13
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多