2014-02-09 45 views
5

有沒有辦法通過命令行將對象(如哈希表)傳遞到PowerShell腳本文件?Powershell腳本文件參數非字符串

這是我的代碼:

Param(
    [hashtable]$lookupTable = @{} 
) 

我嘗試這樣做:

powershell.exe -NonInteractive -ExecutionPolicy ByPass -File D:\script.ps1 @{APIKey="Uz9tkNhB9KJJnOB-LUuVIA"} 

@{APIKey="Uz9tkNhB9KJJnOB-LUuVIA"}是哈希表的參數。

錯誤:

D:\script.ps1 : Cannot process argument transformation on parameter 'lookupTable'. 
Cannot convert the "@{APIKey=Uz9tkNhB9KJJnOB-LUuVIA}" value of type "System.String" to type "System.Collections.Hashtable". 
+ CategoryInfo : InvalidData: (:) [script.ps1], ParentContainsErrorRecordException 
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,script.ps1 

基於該誤差,其解釋所述參數爲字符串。我也通過teamcity傳遞這個參數,它只直接接受參數並將它傳遞給上面顯示的命令行。

有什麼我可以做的參數來告訴powershell它是一個哈希表類型的對象?

PS。

通過TeamCity的允許的輸入是:

  1. 腳本文件
  2. 腳本執行模式[「把腳本到PowerShell的標準輸入與‘指令 - ’論據」和「執行與腳本名爲.psl」 - 文件「論點」]。
  3. 其他命令行參數。
  4. 腳本參數(如果啓用 「與-File參數執行的.ps1」 被選擇)

這是格式TeamCity的使用以執行-Command模式的腳本:

powershell.exe -NonInteractive [commandline params] -ExecutionPolicy ByPass -Command - < [script file] 

因此:

powershell.exe -NonInteractive @{ APIKey = 'Uz9tkNhB9KJJnOB-LUuVIA'} -ExecutionPolicy ByPass -Command - < D:\BuildAgent-02\work\2204bf4ff5f01dd3\scripts\script.ps1 

這是格式TeamCity的使用以執行 - 文件模式下運行腳本:

powershell.exe -NonInteractive [commandline params] -ExecutionPolicy ByPass -File [script file] [script arguments] 

因此,當我使用腳本PARAMS:

powershell.exe -NonInteractive -ExecutionPolicy ByPass -File D:\BuildAgent-02\work\2204bf4ff5f01dd3\scripts\script.ps1 @{ APIKey = 'Uz9tkNhB9KJJnOB-LUuVIA'} 

反正是有解決這個格式TeamCity的使用?例如。在腳本參數下,我可以做 - 命令序列化參數嗎?

回答

3

一種選擇可能是修改腳本以採取這樣的說法爲[字串[],給它的參數鍵值對,然後把它轉換成使用ConvertFrom-StringData是一個哈希表在腳本:

$script = { 
param ([string[]]$lookuplist) 
$lookupTable = ConvertFrom-StringData ($lookuplist | out-string) 
$lookupTable 
} 

&$script 'APIKey=Uz9tkNhB9KJJnOB-LUuVIA','APIKey2=Uz9tkNhB9KJJnOB-LUuVIA' 


Name       Value               
----       -----               
APIKey       Uz9tkNhB9KJJnOB-LUuVIA           
APIKey2      Uz9tkNhB9KJJnOB-LUuVIA 
2

切換到使用-Command參數:

powershell.exe -NonInteractive -ExecutionPolicy ByPass -Command "& {D:\script.ps1 @{APIKey='Uz9tkNhB9KJJnOB-LUuVIA'}}" 

從PowerShell中的關鍵位。EXE用法:

-Command 
    Executes the specified commands (and any parameters) as though they were 
    typed at the Windows PowerShell command prompt, and then exits, unless 
    NoExit is specified. The value of Command can be "-", a string. or a 
    script block. 
+0

感謝您的回覆,我試過了,但不幸的是,該命令的構建和執行格式有一些限制,我更新了我的問題。 –

4

的TeamCity的PowerShell的構建步驟,您可以直接執行腳本文件或執行PowerShell的源代碼輸入到構建步驟定義編輯器。

從文件執行腳本時,散列表參數傳遞不正確,但執行PowerShell源代碼時,一切都按預期工作。

但是,如果要運行該腳本實際上是在一個文件中,你可以通過PowerShell的源代碼中輸入到構建步驟定義執行腳本文件:

  1. Script字段中,選擇Source

  2. 輸入最少的PowerShell腳本執行腳本文件到Script source領域,例如:

    &'%system.teamcity.build.checkoutDir%\BuildScripts\SomeScript.ps1' -MyArrayOfHashTablesParameter @{SomeParam1='val1';SomeParam2='val2'},@{SomeParam1='val1';SomeParam2='val2'} 
    

上面的PowerShell代碼片段在構建期間從版本控制簽出的腳本文件中執行腳本。爲了達到這個目的,TeamCity變量system.teamcity.build.checkoutDir被用來構建相對於結賬目錄的路徑。

圍繞腳本的&''用於確保代碼段工作,即使腳本文件的路徑包含空格。

相關問題