Powershell中Export-Csv中使用和不使用管道的区别

时间:2017-05-02 12:06:20

标签: powershell csv

这可能更像是一个' 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时,为什么会发生这种情况,但当使用管道时,它不会发生

2 个答案:

答案 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[]

因此,在您的情况下,导出的对象也是可用的数组。