如何制作资源级变量

时间:2017-02-15 15:03:34

标签: powershell powershell-dsc

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

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 个答案:

答案 0 :(得分:2)

Script对象不允许定义任何额外的属性,但我能够在Node级别定义我的属性并在我的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" } }
        }
    }
}