如何在powershell脚本中使用属性值

时间:2015-05-12 18:04:19

标签: powershell chef chef-recipe powershell-v4.0

我在chef中使用powershell_script资源在sqlserver 2012中创建数据库。

我在脚本中使用了硬编码的test1数据库名称。现在我想从属性文件中提供数据库名称。

如何将属性文件中引用的值提供给脚本。

powershell_script "create database" do
  code <<-EOH
    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null

    $serverName = "localhost"

    $server = new-object ('Microsoft.SqlServer.Management.Smo.Server') $serverName

    #Create a new database
    $db = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Database -argumentlist $server, "test1"
    $db.Create()

    #Reference the database and display the date when it was created. 
    $db = $server.Databases["Test_SMO_Database"]
    $db.CreateDate
  EOH
end

4 个答案:

答案 0 :(得分:2)

现在修改过的脚本看起来像这样

powershell_script "create database" do
  code <<-EOH
  [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null
  $serverName = "localhost"
  $server = new-object ('Microsoft.SqlServer.Management.Smo.Server') $serverName
  #Create a new database
  $db = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Database -argumentlist $server, "#{node['sqlserver']['dbname']}"
  $db.Create()
  EOH
end

<强>属性/ default.rb

default['sqlserver']['dbname'] = 'testing database'

现在我可以使用属性文件中的值创建数据库。

感谢您帮助 IsabelHM

答案 1 :(得分:1)

花了一点时间来确定将 数组 定义为节点属性的语法,然后将其成功传递给powershell_script。显然将其定义为字符串是有效的。

属性:

default['cookbook-name']['attribute-name'] = "'value1', 'value2', 'value3'"

和食谱:

powershell_script 'my script' do
  code <<-EOH
  $array = #{node['cookbook-name']['attribute-name']}
  ...
  EOH
  action :run
  guard_interpreter :powershell_script
  not_if "..."
end

答案 2 :(得分:0)

尝试使用属性环境传递变量(在此示例中为dbname),然后在脚本中将其称为$dbname

设置属性有两种方法。

方法1

在attributes / default.rb中,添加此行

default['yourCookbookNameHere']['dbname'] = 'test1'

在recipes / default.rb

powershell_script "create database" do
  environment ({'dbname' => "#{node['yourCookbookNameHere']['dbname']}"})
  code <<-EOH
    $db = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Database -argumentlist $server, $dbname
  EOH
end

方法2

在你的食谱中,将它设置为像这样的局部变量

localDbName = 'test1'

powershell_script "create database" do
  environment ({'dbname' => localDbName})
  code <<-EOH
    $db = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Database -argumentlist $server, $dbname
  EOH
end

答案 3 :(得分:0)

此处使用environment powershell_script属性的当前答案在如何引用代码块中的变量方面不正确。 environment属性中指定的变量可用作环境变量,而不是脚本变量,必须作为环境变量引用,如下所示:

powershell_script 'Passed-In Variable Example' do
  environment({ myVar: 'myvalue' })
  code <<-EOH
    Write-Output $env:myVar
  EOH
end

基本上,使用environment属性将值传递到代码块的任何其他答案都几乎正确,只需确保使用{{1}添加变量名称在Powershell代码中。