首页 > 解决方案 > 在 powershell 中比较两个 CSV 文件并创建输出

问题描述

我目前正在编写一个脚本来导入 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

标签: powershell

解决方案


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

不要使用Out-String除非你想要一个for-display多行字符串表示。

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


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


要重现问题:

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

推荐阅读