有没有办法通过命令行将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允许的输入是:
这是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吗?
答案 0 :(得分:5)
TeamCity PowerShell构建步骤允许您直接执行脚本文件或执行在构建步骤定义编辑器中输入的PowerShell源代码。
从文件执行脚本时,哈希表参数未正确传递,但在执行PowerShell源代码时,一切都按预期工作。
但是,如果要运行的脚本实际位于文件中,则可以通过在构建步骤定义中输入的PowerShell源代码执行脚本文件:
在Script
字段中,选择Source
输入最小的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
用于构造相对于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.