2014-10-17 142 views
1

当管道对象到Export-Csv Cmdlet始终创建一个文件,即使管道的输出为空。这是正常的行为吗?PowerShell导出CSV创建空文件

代码:

'1' | where {$_ -ne '1'} | Export-Csv -Path $file -NoTypeInformation 

我试图通过增加where{$_},以避免这一点,但也创造了一个空文件:

'1' | where {$_ -ne '1'} | where {$_} | Export-Csv -Path $file -NoTypeInformation 

一种解决方法是:

'1' | where {$_ -ne '1'} | Foreach { 
    if ($_) { 
     Export-Csv -Path $file -NoTypeInformation -Encoding UTF8 -Delimiter ';' -Append 
    } 
} 

但是使用一个foreach an d if似乎有点矫枉过正。没有任何信息被传送给它时,没有一个更简单的方法可以避免空文件结束?看起来很奇怪Export-Csv只是创建一个文件,即使它没有收到任何东西..

回答

0

好吧,如果你管道到Export-CSV你已经决定写入磁盘。 你自己的自定义过滤器呢?

$File = 'C:\ByteTheDisk.csv' 
Filter MaybeExport-CSV { 
    if ($_) 
    { 
     Export-CSV -InputObject $_ -Path $File -NoTypeInformation -Append -Verbose } 
    } 

'1' | where {$_ -ne '1'} | MaybeExport-CSV  # No file created 
'2','1' | where {$_ -ne '1'} | MaybeExport-CSV # File created for '2' 
+0

这是唯一没有添加额外'foreach'的解决方案。提出的另一种解决方案在PS 4.0上确实不起作用。感谢您的帮助kamikatze。我发现奇怪的是'Export-Csv'没有收到任何文件时就创建了一个文件。 – DarkLite1 2014-10-20 09:39:12

+0

请注意,这将会愉快地覆盖该文件的次数,因为有来自管道的对象,而只会保留包含最后一个对象的CSV文件。一个更好的选择可能就像'function MaybeExport-Csv {end {if($ input){Export-Csv ...}}'''''''' – Joey 2014-10-20 09:49:05

+0

好点。编辑并添加 - 添加。 – evilSnobu 2014-10-20 09:53:13

0

我认为这将有助于你:

('1' | ?{$_ -ne '1'}) | Export-Csv -Path $file -NoTypeInformation 

注意额外brakets。

你会发现你需要补充选择,对象为我刚查了CSV的内容和它包含的对象的属性,而不是值:

('1' | ?{$_ -ne '1'}) | Select-Object @{Name='Value';Expression={$_}} | Export-Csv -Path $file -NoTypeInformation 

这是创建一个行文件:

(@('1','2') | ?{$_ -ne '1'}) | Select-Object @{Name='Value';Expression={$_}} | Export-Csv -Path $file -NoTypeInformation 
+0

你知道为什么管道数据反应的方式吗? OP也试图理解我的行为。不知道它是否与Export-CSV需要为来自“Where-Object”的输入创建文件有关。由于它没有得到文件没有被填充。没有传递$ null,因为这会触发'ParameterArgumentValidationErrorNullNotAllowed'异常。 – Matt 2014-10-17 13:40:30

+0

我相信这是因为$ nulls将被处理至少一次,我认为它已在更高版本的PowerShell中进行了更改 – 2014-10-17 13:42:13

+2

在PowerShell v4中,这不起作用。 '('1'|?{$ _ -ne'1'})| Export-Csv -Path d:\ tmp \ file -NoTypeInformation --verbose VERBOSE:在目标“d:\ tmp \ file”执行“Export-Csv”操作。 – evilSnobu 2014-10-17 13:45:26