这是我的代码:
$items = New-Object Collections.Generic.List[IO.FileInfo]
$loc1 = @(Get-ChildItem -Path "\\server\C$\Program Files (x86)\Data1\" -Recurse)
$loc2 = @(Get-ChildItem -Path "\\server\C$\Web\DataStorage\" -Recurse)
$items.Add($loc1) # This line fails (the next also fails)
$items.Add($loc2)
# Processing code is here
出现以下错误:
无法将类型为“System.Object[]”的参数“0”,值为“System.Object[]”转换为类型“System.IO.FileInfo”: “无法将类型为“System.Object[]”的值转换为类型“System.IO.FileInfo”。”
我主要想知道这种情况下的正确方法是什么。我意识到我的代码很像 C 的写法--如果有更多PowerShell的解决方案可以完成同样的任务,我十分赞成。重点是,$loc#
的数量可能会随着时间的推移而发生变化,因此在生成的代码中添加或删除一两个应该很容易。
@()
的作用? - Peter Mortensen(@(@('s','d')))[0].GetType()
是String,这意味着忽略了创建仅包含一个数组的数组的意图。 在示例中,如果第一行只产生一个项目并且未使用@(),则$items将是Object,并尝试将数组连接到对象将在第二行引起错误。 第二行上的@()不是必需的,因为您可以通过相同的+=
将对象连接到数组以及将数组连接到数组。 - papo如果输出仅包含一个项目,则Get-ChildItem不会输出数组
。 尽管如此,它可以正常工作(至少在我的系统上,PS v5.1.14393.3471)。 我可以毫无问题地执行以下操作:$Files = @(gci -Filter "$BuildName-$SemanticVersion*.nupkg"); $Files += @(gci -Filter "Setup.exe"); $Files
。 - InteXX$Files = @(gci -Path $ReleaseDirectory -Filter "$BuildName-$SemanticVersion*.nupkg"; gci -Path $ReleaseDirectory -Filter "Setup.exe" gci -Path $ReleaseDirectory -Filter "RELEASES"); $Files
简洁明了,而且运行得很好。 - InteXX