2017-02-15 4 views
2

の作り方、のは、私はスクリプトリソースを持っているとしましょう:例えばリソースレベル変数

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をスクリプトリソースに追加して、2度定義することなく、これらの2つの機能の間で共有することができれば幸いです。

しかし、それを実行しようとすると、私にエラーを与える:

An attribute name for resource 'Script' was found that is not valid. An attribute name must be a simple string, and cannot contain variables or expressions. Replace '$tools' with a simple string.

どのように私はこのコードを共有することができますか?

答えて

2

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" } } 
     } 
    } 
}