这可能更像是一个' PowerShell如何处理变量和管道?#39;而不是一个特定的程序问题,但因为它似乎是奇怪的行为(对我来说),我以为我会在这里发布它。
我在使用PowerShell将变量导出为CSV时遇到了一些困难,并找到了this Stack question that helped me a lot。但是,当摆弄输出时,我得到了两个不同的结果,这取决于我调用Export-CSV
函数的方式。
我有一个大致如下的自定义PS对象:
Account Partner ProjectName ProjectPhase
1 A Test Start
2 B Test2 Start
3 A Test4 End
4 C Test3 Middle
....
当我使用以下行时,它会正确输出CSV文件:
$csvBody | Export-Csv -Path "$targetPath\$fileName" -Encoding Unicode -NoTypeInformation
但是,当我使用以下行时,它不会:
Export-Csv -InputObject $csvBody -Path "$targetPath\$fileName" -Encoding Unicode -NoTypeInformation
在这种情况下,输出如下所示: 算,"长度"" LongLength""秩"" SyncRoot上"" IsReadOnly"&#34 ; IsFixedSize"" IsSynchronized" 263," 263"" 263"" 1"" System.Object的[]""假&#34 ;,"真""假"
我从this other Stack post了解输出成为$ csvBody的属性,这是一个数组。我的问题是,当我没有将对象传输到Export-CSV时,为什么会发生这种情况,但当我使用管道时,它不会发生 ?
答案 0 :(得分:5)
我认为这是因为编写Export-CSV
的目的是它应该(并且会)通常通过管道来处理输入。
我认为您看到的行为是因为-InputObject
参数不接受数组输入。您可以从帮助页面看到:
Export-Csv [[-Path] <String>] [[-Delimiter] <Char>] [-Append] [-Confirm] [-Encoding <String> {Unicode | UTF7 |
UTF8 | ASCII | UTF32 | BigEndianUnicode | Default | OEM}] [-Force] -InputObject <PSObject> [-LiteralPath <String>]
[-NoClobber] [-NoTypeInformation] [-WhatIf] [<CommonParameters>]
它是<psobject>
而非<psobject[]>
,因此它需要一个<psobject>
作为输入。当它通过参数行提供时,它似乎不会展开该对象,而是为您提供一个包含该对象本身的默认属性的CSV(长度等)。
当您通过管道发送对象时,它使用接受管道输入的cmdlet PROCESS
功能来展开对象并单独处理集合中的每个项目。
有人可以比我上面更好地解释这一点,或者也许可以解释为什么Export-CSV不能按预期的方式工作(除了 - 我假设 - 按设计)。
答案 1 :(得分:3)
这里的一切都是设计而且编写得不好:
在第二种方式中,如果保留TypeInformation,则可以看到inputobject是#TYPE System.Object[]
。
使用管道调用Export-Csv时,集合的每个对象都将发送到Cmdlet的进程部分。
获取整数集合:
$a = 1..4
然后尝试:
$a | Get-Member
它给出:System.Int32
然后尝试:
Get-Member -InputObject $a
它给出:System.Object[]
因此,在您的情况下,导出的对象也是可用的数组。