2013-07-29 2 views
2

У меня есть два CSV файла:как сравнить два CSV файлов в PowerShell без указания свойств

 
ipaddress,port 
10.140.11.1,80 
10.140.11.2,80 
 
ipaddress,port 
10.140.11.1,80 
10.140.11.2,8008 

Вопрос заключается в том, чтобы сравнить файлы в PowerShell. Я уже пробовал:

$file1 = import-csv "csvfile1.csv" 
$file2 = import-csv "csvfile2.csv" 
Compare-Object $file1 $file2 -IncludeEqual 

Результат: эти два файла были равны.

Это работает, как ожидалось, если я указать конкретное свойство, например:

Compare-Object $file1 $file2 -IncludeEqual -Property port 

Как сравнить файлы CSV без указания свойств. Предположим, что я хотел бы сравнить все свойства в файле csv.

ответ

4

Вы можете получить список свойств столбцов CSV через Get-Member -MemberType NoteProperty, а затем передать этот список Compare-Object.

# get list of CSV properties 
$props1 = $file1 | gm -MemberType NoteProperty | select -expand Name | sort | % {"$_"} 
$props2 = $file2 | gm -MemberType NoteProperty | select -expand Name | sort | % {"$_"} 

# first check that properties match (can omit this step if you know for sure they will be) 
if(Compare-Object $props1 $props2) 
{ 
    throw "Properties are not the same! [$props1] [$props2]" 
} 
# pass properties list to Compare-Object 
else 
{ 
    Compare-Object $file1 $file2 -Property $props1 
} 
0

Ответ latkin не будет работать. Вы получите следующее исключение:

Compare-Object: Невозможно преобразовать System.Management.Automation.PSObject в один из следующих типов {System.String, System.Management.Automation.ScriptBlock}. В строке: 8 знаков: 19 + Сравнить-объект < < < < $ $ file1 file2 -Property $ props1 + CategoryInfo: InvalidArgument: (:) [Сравнить-объекта], NotSupportedException + FullyQualifiedErrorId: DictionaryKeyUnknownType, Microsoft.PowerShell .Commands.CompareObjectCommand

Кажется, что нельзя передать переменную для -Property. Он должен быть разделенным запятыми списком NoteProperties, и он не может быть заключен в одинарные или двойные кавычки.

Я искал способ сделать это то же самое, и я до сих пор не нашли способ ...

+0

Оказывается, что эта ошибка происходит в PowerShell версии 2, но не в версии PowerShell 3 –

+0

Я отредактировал ответ latkin, чтобы исправить проблему. | % {"$ _"} преобразует список в список строк, а не PSObjects. Это была проблема. –

Смежные вопросы