不确定我是做傻事还是PowerShell的“功能”。 采用以下示例代码段:
[array]$Strings = @(
"This is an example string"
"This another example string test"
"This is something else fun"
"Not in list"
)
$oData = @()
Foreach($string in $strings)
{
$split = if($string.substring(0,4) -eq "This"){$String.Split(" ")}
$oData += [pscustomobject]@{
Part1 = $Split[0]
Part2 = $Split[1]
Part3 = $Split[2]
Part4 = $split[3]
Part5 = $split[4]
}
}
$oData
这会抛出错误Cannot index into a null array
,这是错误的,因为数组的第四个成员“Strings”不在列表中,因此无法编入索引。很公平。为了缓解这种情况,我做了以下修改:
$oData = @()
Foreach($string in $strings)
{
$split = if($string.substring(0,4) -eq "This"){$String.Split(" ")}
$oData += [pscustomobject]@{
Part1 = if($Split){$split[0]}
}
}
哪个有效,直到我将Part2添加到对象:
$oData = @()
Foreach($string in $strings)
{
$split = if($string.substring(0,4) -eq "This"){$String.Split(" ")}
$oData += [pscustomobject]@{
Part1 = if($Split){$split[0]}
Part2 = if($Split){$split[1]}
}
}
ISE使用消息Unexpected token 'Part2' in expression or statement
强调“Part2”,并且“Part1”的最后一个大括号带有消息The hash literal was incomplete
的下划线。
当我运行脚本时,错误是:
At line:13 char:38
+ Part1 = if($Split){$split[0]}
+ ~
The hash literal was incomplete.
At line:14 char:9
+ Part2 = if($Split){$split[1]}
+ ~~~~~
Unexpected token 'Part2' in expression or statement.
At line:16 char:1
+ }
+ ~
Unexpected token '}' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : IncompleteHashLiteral
对我来说,这似乎是处理null数组的有效方法,我确信我之前在PSCustomObject值中使用了if语句。
我可以解决这个问题,因为我以前遇到过这个问题,但是我想知道是否有人可以解释为什么PowerShell不喜欢它。
答案 0 :(得分:1)
我不完全确定原因,但是如果你用分号;
结束你的行(除了最后一行所以只是第一个),它就可以了。您当然可以在;
中结束所有这些内容以保持一致性。
我推测它与解析器处理这些问题的方式有关,它只是不知道表达式是否已经结束,无论它是否应该知道。
$oData += [pscustomobject]@{
Part1 = if($Split){$split[0]};
Part2 = if($Split){$split[1]}
}
答案 1 :(得分:1)
简单的答案似乎是添加else
。如:
$oData = @()
Foreach($string in $strings)
{
$split = if($string.substring(0,4) -eq "This"){$String.Split(" ")}
$oData += [pscustomobject]@{
Part1 = if($Split){$split[0]}else{$null}
Part2 = if($Split){$split[1]}else{$null}
Part3 = if($Split){$split[2]}else{$null}
Part4 = if($Split){$split[3]}else{$null}
Part5 = if($Split){$split[4]}else{$null}
}
}
奇怪PS很满意:
if($something -eq $true)
{
"Hello"
}
在[pscustomobject]之外没有else
或elseif
部分。