在Powershell中比较两个CSV文件并创建输出

时间:2018-11-10 18:28:39

标签: powershell

我目前正在处理一个脚本,用于导入2个csv文件,比较fqdn列并将结果输出到文件中。

问题是经过多个小时的测试,我看来我的脚本正在运行,直到获得需要导入的每个文件的路径为止,但我似乎无法获得import-csv命令执行我需要做的事情。

感谢您提供的任何指导。

到目前为止,我的脚本和出现的错误如下:

$CMDB_Installed = Get-ChildItem -Path C:\Users\nha1\Desktop\Reports\CMDBInstall | Sort CreationTime -Descending | Select -expa FullName -First 1 | Out-String

$SCOM_AgentList = Get-ChildItem -Path C:\Users\nha1\Desktop\Reports\SCOMUAT | Sort CreationTime -Descending | Select -expa FullName -First 1 | Out-String



$SL = Import-Csv $SCOM_AgentList

$CL = Import-Csv $CMDB_Installed



Compare-Object -ReferenceObject $CL -DifferenceObject $SL -Property fqdn |

Export-Csv -NoTypeInformation -Path = C:\Users\nha1\Desktop\Reports\AuditOutput\UATNeedsAgent+SCOM\UATHosts-NotinSCOM$(get-date -format yyyy-MM-dd).csv

错误消息:

import-csv : Illegal characters in path.

At line:4 char:7

+ $SL = import-csv $SCOM_AgentList

+       ~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : OpenError: (:) [Import-Csv], ArgumentException

    + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.ImportCsvCommand


import-csv : Illegal characters in path.

At line:5 char:7

+ $CL = import-csv $CMDB_Installed

+       ~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : OpenError: (:) [Import-Csv], ArgumentException

    + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.ImportCsvCommand

1 个答案:

答案 0 :(得分:1)

$CMDB_Installed = ... | Select -expa FullName -First 1 | Out-String 

请勿使用Out-String ,除非您需要用于展示的多行,否则 em>字符串表示形式。

您的文件路径变量因此包含换行符 (换行符),Import-Csv对此抱怨,因为NTFS中文件名中的换行符是非法的(在Windows上)。


只需忽略 Out-String调用,因为根据定义,Select -expa FullName -First 1已经输出了一个字符串(假设.FullName输出的对象具有Get-ChildItem属性1}}是[string]类型。


要重新创建问题:

PS> Import-Csv "foo`n"  # illegal line break in file path
Import-Csv : Illegal characters in path.

为了证明Out-String甚至在输入单行字符串的情况下也会产生多行字符串:

PS> ('foo' | Out-String).EndsWith("`n")
True