2017-04-03 60 views
0

我有一个我正在测试的脚本“Deploy.PS1”。在这里面我通过几个参数:通过PowerShell脚本在.xml文档中传递不同的参数

param(
    [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $param1, 
    [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $param2, 
    [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $param3, 
    [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $param4, 
    [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $param5 
) 

目前,当我运行该脚本,我必须运行脚本并传递参数”。\ Deploy.PS1 P1 P2 P3 P4 P5" ,并运行良好。我正在尝试创建一个已经包含参数的.xml文档。为此,我找到了一条帮助我的线索。现在该.xml文件看起来像这样:

<Deploy_Params> 
<param> 
    <param1>p1</param1> 
    <param2>p2</param2> 
    <param3>p3</param3> 
    <param4>p4</param4> 
    <param5>p5</param5> 
</param> 
<param> 
    <param1>a1</param1> 
    <param2>a2</param2> 
    <param3>a3</param3> 
    <param4>a4</param4> 
    <param5>a5</param5> 
</param> 
<param> 
    <param1>b1</param1> 
    <param2>b2</param2> 
    <param3>b3</param3> 
    <param4>b4</param4> 
    <param5>b5</param5> 
</param> 
</Deploy_Params> 

我需要什么是传递取决于我要部署到不同的环境参数的更多帮助。

例如: 我想用参数“p1 p2 p3 p4 p5”,“a1 a2 a3 a4 a5”或“b1 b2 b3 b4 b5”运行Deploy.PS1。我将如何在Deploy.PS1脚本或.xml文件中指定我想仅传递p,a或b参数,具体取决于是否要使用p,a或b环境?我注意到这里有几个类似于我的问题的其他线程,但仍然无法解决我的问题,请耐心等待,我可以提供额外的补充信息或代码,如果需要。谢谢)

回答

1

如果这是我,我会做一点不同。我会用描述环境的键和包含为这些环境设置参数的值创建散列表。喜欢的东西:

$ParamSets = @{ 
    'PreProduction' = [PSCustomObject]@{ 
     'param1' = 'p1' 
     'param2' = 'p2' 
     'param3' = 'p3' 
     'param4' = 'p4' 
     'param5' = 'p5' 
    } 
    'Production' = [PSCustomObject]@{ 
     'param1' = 'a1' 
     'param2' = 'a2' 
     'param3' = 'a3' 
     'param4' = 'a4' 
     'param5' = 'a5' 
    } 
    'Failover' = [PSCustomObject]@{ 
     'param1' = 'b1' 
     'param2' = 'b2' 
     'param3' = 'b3' 
     'param4' = 'b4' 
     'param5' = 'b5' 
    } 
} 

然后如果你想,作为一个XML文件,你可以使用Export-CliXml到保存为XML文件。

$ParamSets | Export-CliXml .\MyParams.xml 

现在,您已经定义的那些你Deploy.ps1脚本可以有它的参数改变只是一点点接受一个对象,并更改属性参数,例如:

param(
    [Parameter(Mandatory = $True,valueFromPipelinebyPropertyName=$true)][String] $param1, 
    [Parameter(Mandatory = $True,valueFromPipelinebyPropertyName=$true)][String] $param2, 
    [Parameter(Mandatory = $True,valueFromPipelinebyPropertyName=$true)][String] $param3, 
    [Parameter(Mandatory = $True,valueFromPipelinebyPropertyName=$true)][String] $param4, 
    [Parameter(Mandatory = $True,valueFromPipelinebyPropertyName=$true)][String] $param5 
) 

然后你就可以只是通过你想要的任何脚本环境:

$ParamSets['Failover'] | .\Deploy.ps1 

编辑:既然你有麻烦,这里就是我所做的到t美东时间。我开始创建哈希表,并将其导出到文件中,完全按照上面的描述。然后我导入该文件,并将其另存为新变量。

$MyConfig = Import-CliXml .\MyParams.xml 

然后我做了一个简单的脚本来进行测试:

param(
    [Parameter(Mandatory = $True,valueFromPipelinebyPropertyName=$true)][String] $param1, 
    [Parameter(Mandatory = $True,valueFromPipelinebyPropertyName=$true)][String] $param2, 
    [Parameter(Mandatory = $True,valueFromPipelinebyPropertyName=$true)][String] $param3, 
    [Parameter(Mandatory = $True,valueFromPipelinebyPropertyName=$true)][String] $param4, 
    [Parameter(Mandatory = $True,valueFromPipelinebyPropertyName=$true)][String] $param5 
) 

"Param1: $param1" 
"Param2: $param2" 
"Param3: $param3" 
"Param4: $param4" 
"Param5: $param5" 

我保存的当前文件夹(C:\ TEMP,但不应该的问题)作为test.ps1。然后,我通过了“故障切换”设置为脚本这样:

$MyConfig['Failover'] | .\test.ps1 

结果是:

Param1: b1 
Param2: b2 
Param3: b3 
Param4: b4 
Param5: b5 
+0

感谢伟大的反应!我相信你的回答正是我所期待的。然而,我做了你建议的改变,试图通过暂时从Deploy.PS1中删除代码来仅测试param(... $ param1 ... $ param2 ...等等),然后我写了写主机$ param1,写主机$ param2..etc只是为了打印变量来检查脚本是否可以读取xml文件。我敢肯定,这不是正确的方法来检查,因为它返回“无法索引到一个空数组。行:1 char:1”,当我输入$ ParamSets ['Failover'] | \ Deploy.ps1。我应该如何正确测试? –

+0

我更新了答案,尝试更好地解释使用情况。 – TheMadTechnician

+0

使用参数溅射的替代方案。我可以把它写成答案 - 评论格式很差。 '$ ParamSets = @ { “A”= @ {Object =“AAA”}; “B”= @ {Object =“BBB”}; “C”= @ {Object =“CCC”}; }; $ args = $ ParamSets [“A”]; Write-Host @args; #写主机只是一个例子。可以是你的deploy.ps1.' –