PSCustomObject不喜欢内联ifProPro中值

时间:2018-01-12 15:34:30

标签: powershell

不确定我是做傻事还是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不喜欢它。

2 个答案:

答案 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]之外没有elseelseif部分。