2017-04-03 29 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.' –

相關問題