我有一个PowerShell脚本 v space
"123 456"
v comma
"123,456"
v negative sign
"123-456"
,代码如下:
CSV2JSON.ps1
如果我将其称为param(
[String]$FieldSeparator=",",
[String[]]$Header
)
$input | ConvertFrom-Csv -Delimiter $FieldSeparator -Header $Header | ConvertTo-JSON
,则可以正常使用。但是,如果我删除可选参数.\CSV2JSON.ps1 -FieldSeparator "|" -Header "name|age"
,则Header
cmdlet会抱怨ConvertFrom-Csv
不能为空:
Header
如果没有提供,我根本不想传递ConvertFrom-Csv : Cannot validate argument on parameter 'Header'.
The argument is null. Supply a non-null argument and try the command again.
参数。是否有一种简洁的方法来传递可选参数而无需进入-Header
语句?
答案 0 :(得分:5)
我很惊讶没有人建议splatting $PSBoundParameters
自动变量。
$PSBoundParameters
是一个哈希表,包含传递给命令的所有参数参数。
只需将$FieldSeparator
参数重命名为$Delimiter
,即可开始使用。
如果需要,您可以提供FieldSeparator
名称作为参数别名:
param(
[Alias('FieldSeparator')]
[String]$Delimiter=",",
[String[]]$Header
)
$input | ConvertFrom-Csv @PSBoundParameters | ConvertTo-JSON
如果在执行调用函数/脚本时省略-Header
参数,则在调用ConvertFrom-Csv
答案 1 :(得分:2)
Martin Brandl是对的,您必须使用if
,但我建议将其与splatting合并,以便您只拨打一次电话:
param(
[String]$FieldSeparator=",",
[String[]]$Header
)
$params = @{
Delimeter = $FieldSeparator
}
if ($Header) {
$params.Header = $Header
}
$input | ConvertFrom-Csv @params | ConvertTo-JSON
答案 2 :(得分:1)
好的,根据Martin的反馈我还有其他选择。当参数名称匹配时,这很有效:
param(
$Path,
$Delimiter,
$Header
)
$params = @{}
$MyInvocation.BoundParameters.Keys | Where {$_} |
% {$params.Add($_, (Get-Variable $_).Value )}
Import-Csv @params
答案 3 :(得分:0)
不幸的是没有。您必须利用if
语句。这样可以用于布尔值或开关值,例如:
param(
[String]$FieldSeparator=",",
[String[]]$Header,
[switch]$Compress
)
$input | ConvertFrom-Csv -Delimiter $FieldSeparator | ConvertTo-JSON -Compress:$Compress
注意:您可以使用MyInvocation.BoundParameter
和splatting进行此操作,但我怀疑这会使您的脚本更具可读性。