Powershell脚本文件参数非字符串

Sha*_*ean 7 powershell

有没有办法通过命令行将一个对象(如哈希表)传递给powershell脚本文件?

这是我的代码:

Param(
    [hashtable]$lookupTable = @{}
)
Run Code Online (Sandbox Code Playgroud)

我试过这个:

powershell.exe -NonInteractive -ExecutionPolicy ByPass -File D:\script.ps1  @{APIKey="Uz9tkNhB9KJJnOB-LUuVIA"}
Run Code Online (Sandbox Code Playgroud)

@{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
Run Code Online (Sandbox Code Playgroud)

根据错误,它将参数解释为字符串.我也通过teamcity传递这个参数,teamcity只接受参数并将其传递给上面显示的命令行.

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

PS.

teamcity允许的输入是:

  1. 脚本文件
  2. 脚本执行模式["将脚本放入PowerShell stdin中,使用"-Command - "arguments"和"Execute .ps1 script with"-File"argument"].
  3. 其他命令行参数.
  4. 脚本参数(如果选择"执行带有-File参数的.ps1",则启用)

这是teamcity用于在-Command模式下执行脚本的格式:

powershell.exe -NonInteractive [commandline params] -ExecutionPolicy ByPass -Command - < [script file]
Run Code Online (Sandbox Code Playgroud)

因此:

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

这是teamcity用于在-File模式下执行脚本的格式:

powershell.exe -NonInteractive [commandline params] -ExecutionPolicy ByPass -File [script file] [script arguments]
Run Code Online (Sandbox Code Playgroud)

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

powershell.exe -NonInteractive -ExecutionPolicy ByPass -File D:\BuildAgent-02\work\2204bf4ff5f01dd3\scripts\script.ps1 @{ APIKey = 'Uz9tkNhB9KJJnOB-LUuVIA'}
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ebo 5

通过TeamCity PowerShell构建步骤,您可以直接执行脚本文件,也可以执行输入到构建步骤定义编辑器中的PowerShell源代码。

从文件执行脚本时,哈希表参数未正确传递,但是在执行PowerShell源代码时,一切正常。

但是,如果要运行的脚本实际上在文件中,则可以通过输入到构建步骤定义中的PowerShell源代码执行脚本文件:

  1. Script字段中,选择Source

  2. 在该Script source字段中输入最小的PowerShell脚本以执行脚本文件,例如:

    &'%system.teamcity.build.checkoutDir%\BuildScripts\SomeScript.ps1' -MyArrayOfHashTablesParameter @{SomeParam1='val1';SomeParam2='val2'},@{SomeParam1='val1';SomeParam2='val2'}
    
    Run Code Online (Sandbox Code Playgroud)

上面的PowerShell代码段从构建过程中从版本控制中检出的脚本文件中执行脚本。为此,使用TeamCity变量system.teamcity.build.checkoutDir构造相对于checkout目录的路径。

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


mjo*_*nor 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 
Run Code Online (Sandbox Code Playgroud)