有没有办法通过命令行将一个对象(如哈希表)传递给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允许的输入是:
这是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那里序列化参数吗?
通过TeamCity PowerShell构建步骤,您可以直接执行脚本文件,也可以执行输入到构建步骤定义编辑器中的PowerShell源代码。
从文件执行脚本时,哈希表参数未正确传递,但是在执行PowerShell源代码时,一切正常。
但是,如果要运行的脚本实际上在文件中,则可以通过输入到构建步骤定义中的PowerShell源代码执行脚本文件:
在Script字段中,选择Source
在该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目录的路径。
在&'和'周围的脚本用于确保片段有效,即使路径脚本文件包含空格。
一种选择可能是修改脚本以将该参数作为 [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)
| 归档时间: |
|
| 查看次数: |
5028 次 |
| 最近记录: |