Powershell数组被解释为单个项目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Powershell数组被解释为单个项目相关的知识,希望对你有一定的参考价值。

我正在学习PowerShell,并遇到问题。

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

代码:

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

输出($ Path和Test-Path $ Path):

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

False

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

答案

这与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"
)

以上是关于Powershell数组被解释为单个项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在powershell中将嵌套的任意关联数组值设置为.psd1文件?

Powershell统计邮箱账户信息

PowerShell,从变量中提取多个数组以生成单个变量

将大型数据框导出到 Power BI 可以使用的单个文件的最佳方式

win10下,cmd,power shell设置默认编码为‘UTF-8

在 power shell 中安装 Az 模块时出现“PackageManagement\Install-Package:访问云文件被拒绝”错误