Powershell脚本文件参数非字符串

时间:2014-02-09 01:06:11

标签: powershell

有没有办法通过命令行将hashtable等对象传递给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传递这个参数,teamcity只接受参数并将其传递给上面显示的命令行。

我可以对参数做些什么来告诉powershell它是hashtable类型的对象吗?

PS。

teamcity允许的输入是:

  1. 脚本文件
  2. 脚本执行模式[“将脚本放入PowerShell标准输入,使用”-Command - “arguments”和“执行.ps1脚本并使用”-File“参数”]。
  3. 其他命令行参数。
  4. 脚本参数(如果选择“执行带有-File参数的.ps1”,则启用)
  5. 这是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用于在-File模式下执行脚本的格式:

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

    因此当我使用脚本参数时:

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

    有没有办法解决teamcity正在使用的这种格式?例如。在脚本参数下,我可以做-Command那里序列化params吗?

3 个答案:

答案 0 :(得分:5)

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'}
    
  3. 上面的PowerShell代码段在构建期间从版本控制检出的脚本文件中执行脚本。为实现此目的,TeamCity变量system.teamcity.build.checkoutDir用于构造相对于checkout目录的路径。

    脚本周围的&''用于确保代码段有效,即使脚本文件的路径包含空格。

答案 1 :(得分:3)

一个选项可能是修改脚本以将该参数作为[string []],在参数中赋予它键值对,然后使用脚本中的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 :(得分: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.