【问题标题】:Powershell array interpreted as single itemPowershell 数组解释为单个项目
【发布时间】:2020-04-30 10:30:59
【问题描述】:

我刚刚学习 PowerShell,遇到了一个问题。

我正在尝试使用数组来定义文件夹/文件paths 的集合,然后在foreach 循环中使用该集合。执行循环时,它似乎将集合连接到单个路径中,而不是单独处理数组中的每个项目。这会导致找不到路径错误。

代码:

        $SourcePathRoot = "C:\Temp\"
        #$SourcePaths = @($SourcePathRoot + "File1.dat", $SourcePathRoot + "File2.txt")
        foreach ($Path in $SourcePaths) {
            Write-Host $Path
            Test-Path $Path }

输出($Path 和测试路径 $Path):

C:\Temp\File1.dat C:\Temp\File2.txt

错误

我知道这可能很简单——我做错了什么?!?谢谢。

【问题讨论】:

    标签: arrays powershell foreach


    【解决方案1】:

    这与 operator precedence 和 PowerShell 中依赖于类型的运算符行为有关。

    评估表达式时,, 优先于 +

    在您的示例中,数组表达式中间的, 运算符因此在+ 运算符之前被评估

    让我们一步一步来:

    # Okay, this is the raw expression
    @($SourcePathRoot + "File1.dat", $SourcePathRoot + "File2.txt")
    
    # , takes precedence and is evaluated first, leaving us with
    @("C:\Temp\" + @("File1.data", "C:\Temp\") + "File2.txt") 
    

    + 的行为取决于左侧操作数的类型(即字符串),因此 PowerShell 将尝试将中间数组的字符串连接到第一个字符串,结果是:

    @("C:\Temp\File1.data C:\Temp\" + "File2.txt") 
    

    这就是为什么结果是一个由 1 个字符串组成的数组,其值为 C:\Temp\File1.dat C:\Temp\File2.txt


    解决方法很简单,只需将数组表达式拆分成两个单独的语句即可:

    $SourcePaths = @($SourcePathRoot + "File1.dat"; $SourcePathRoot + "File2.txt")
    # or 
    $SourcePaths = @(
      $SourcePathRoot + "File1.dat"
      $SourcePathRoot + "File2.txt"
    )
    

    【讨论】:

    • 谢谢马蒂亚斯。你的解决方案就像一个魅力!另一方面,ISE 似乎有点不稳定。当我第一次尝试半决赛时,它似乎不起作用。同样,当我将表达式拆分为多行时,ISE 将结尾“)”标记为缺少起始“(”。一旦我关闭 ISE 并返回,就没有问题了。
    猜你喜欢
    • 1970-01-01
    • 2011-02-22
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    相关资源
    最近更新 更多