Лучший отвечающий
Фильтрация результата сравнения Compare-Object через Where-Object

Вопрос
-
Привет народ.
Помогите победить проблему:пишу скрипт (в будущем - для заббикса), который должен определить: что в комп засунули по USB.
Делаю так:
$usbfile1="c:\Projects\Zabbix_USB\usb1.txt" $usbfile2="c:\Projects\Zabbix_USB\usb2.txt" $Diff $isfile = Test-Path $usbfile1 if ($isfile -eq "true"){ Write-Host "Файл существует" $data2=Invoke-Expression -Command "c:\Projects\Zabbix_USB\devcon.exe find *usb* > c:\Projects\Zabbix_USB\usb2.txt" $USB1_CSV = Import-Csv "c:\Projects\Zabbix_USB\usb1.txt" -Delimiter ';' -Encoding Default $USB2_CSV = Import-Csv "c:\Projects\Zabbix_USB\usb2.txt" -Delimiter ';' -Encoding Default $Diff1=Compare-Object $USB1_CSV $USB2_CSV -Property $USB1_CSV[0].PSObject.Properties.Name | Where-Object {$_.InputObject -notcontains "matching" } | export-csv "c:\Projects\Zabbix_USB\diff1.csv" $Diff } else { Write-Host "Файл не существует, создаётся первый раз" Invoke-Expression -Command "c:\Projects\Zabbix_USB\devcon.exe find *usb* > c:\Projects\Zabbix_USB\usb1.txt" }
Запускаю первый раз, делается будто эталонный (исходный) файл, содержащий текущий список устройств, затем при повторных запусках - делается еще один и их разница (если она есть) меня и интересует.
На выходе получается:
#TYPE System.Management.Automation.PSCustomObject
"USB\VID_046D&PID_C31C&MI_01\6&65A76BF&0&0001 : USB- ","SideIndicator"
"USBSTOR\DISK&VEN_KINGSTON&PROD_DATATRAVELER_2.0&REV_1.00\60A44C3FB03BF010F98F24A9&0: Kingston DataTraveler 2.0 USB Device","=>"
"USB\VID_0951&PID_1665\60A44C3FB03BF010F98F24A9 : USB","=>"
"11 matching device(s) found.","=>"
"9 matching device(s) found.","<="
Вот эти две последние строки мне не нужны, пытаюсь от них как раз избавиться в Where-Object, но он их как будто игнорирует. Или они не относятся к результату сравнения, и их надо парсить уже в результирующем файле?
Как победить?
- Изменено Vector BCOModerator 1 июля 2019 г. 15:09 оформление кодблока
27 июня 2019 г. 13:32
Ответы
-
Добрый день.
Простите что с огромным запозданием но все же то о чем вы спрашивали выглядит приблизительно так:# У вас нет CSV поэтому парсить файл при помощи Import-CSV вам не нужно $content1 = Get-Content C:\TMP\test1.txt $content2 = Get-Content C:\TMP\test2.txt # Считаем сколько строк в каждом файле $x1= $($content1 | Measure-Object).Count-2 $x2= $($content2 | Measure-Object).Count-2 # Выбираем все строки кроме последней для сравнения (Compare-Object $content1[0..$x1] $content2[0..$x2]).InputObject
Второй вариант через Where
Compare-Object $content1 $content2 | Where {$_.InputObject -notmatch 'matching device'}
The opinion expressed by me is not an official position of Microsoft
- Предложено в качестве ответа Vector BCOModerator 29 июля 2019 г. 22:45
- Помечено в качестве ответа Vector BCOModerator 31 июля 2019 г. 20:35
29 июля 2019 г. 21:39Модератор
Все ответы
-
пользуйтесь пожалуйста кодблоками и отступами. когда текст идет сплошной простыней его никто не хочет читать.
дайте пример 2х файлов для сравнения
$t = '' | select @{ n = 'tst'; e = {'tst'}}, @{ n = 'asd'; e = {'asd'}} $a = '' | select @{n = 'tst'; e = {'qwe'}}, @{ n = 'asd'; e = {'ert'}} Compare-Object $t $a -Property tst, asd #> tst asd SideIndicator #> --- --- ------------- #> qwe ert => #> tst asd <= Compare-Object $t $a -Property tst, asd | select tst, asd #> tst asd #> --- --- #> qwe ert #> tst asd
The opinion expressed by me is not an official position of Microsoft
- Изменено Vector BCOModerator 1 июля 2019 г. 15:47
1 июля 2019 г. 15:11Модератор -
Ок.
Файл 1:
USB\VID_046D&PID_C31C&MI_01\6&65A76BF&0&0001 : USB-
USB\VID_046D&PID_C31C&MI_00\6&65A76BF&0&0000 : USB-
USB\ROOT_HUB20\4&78CD1A&0 : USB-
USB\VID_046D&PID_C31C\5&15C311E1&0&2 : USB
USB\ROOT_HUB20\4&5854A60&0 : USB-
USB\VID_8087&PID_8000\5&18088FC2&0&1 : Generic USB Hub
USB\VID_046D&PID_C077\5&15C311E1&0&3 : USB-
USB\ROOT_HUB30\4&1ED8C4AE&0&0 : USB- (xHCI)
USB\VID_8087&PID_8008\5&49593B2&0&1 : Generic USB Hub
9 matching device(s) found.
Файл :
USB\VID_046D&PID_C31C&MI_01\6&65A76BF&0&0001 : USB-
USBSTOR\DISK&VEN_KINGSTON&PROD_DATATRAVELER_2.0&REV_1.00\60A44C3FB03BF010F98F24A9&0: Kingston DataTraveler 2.0 USB Device
USB\VID_046D&PID_C31C&MI_00\6&65A76BF&0&0000 : USB-
USB\ROOT_HUB20\4&78CD1A&0 : USB-
USB\VID_046D&PID_C31C\5&15C311E1&0&2 : USB
USB\ROOT_HUB20\4&5854A60&0 : USB-
USB\VID_8087&PID_8000\5&18088FC2&0&1 : Generic USB Hub
USB\VID_0951&PID_1665\60A44C3FB03BF010F98F24A9 : USB
USB\VID_046D&PID_C077\5&15C311E1&0&3 : USB-
USB\ROOT_HUB30\4&1ED8C4AE&0&0 : USB- (xHCI)
USB\VID_8087&PID_8008\5&49593B2&0&1 : Generic USB Hub
11 matching device(s) found.
Файл разницы по сейчашнему скрипту:
#TYPE System.Management.Automation.PSCustomObject
"USB\VID_046D&PID_C31C&MI_01\6&65A76BF&0&0001 : USB- ","SideIndicator"
"USBSTOR\DISK&VEN_KINGSTON&PROD_DATATRAVELER_2.0&REV_1.00\60A44C3FB03BF010F98F24A9&0: Kingston DataTraveler 2.0 USB Device","=>"
"USB\VID_0951&PID_1665\60A44C3FB03BF010F98F24A9 : USB","=>"
"11 matching device(s) found.","=>"
"9 matching device(s) found.","<="
А хочется получить файл разницы:
"USB\VID_046D&PID_C31C&MI_01\6&65A76BF&0&0001 : USB- ","SideIndicator"
"USBSTOR\DISK&VEN_KINGSTON&PROD_DATATRAVELER_2.0&REV_1.00\60A44C3FB03BF010F98F24A9&0: Kingston DataTraveler 2.0 USB Device","=>"
"USB\VID_0951&PID_1665\60A44C3FB03BF010F98F24A9 : USB","=>"Подскажите, пожалуйста, как?
3 июля 2019 г. 6:13 -
Добрый день.
Простите что с огромным запозданием но все же то о чем вы спрашивали выглядит приблизительно так:# У вас нет CSV поэтому парсить файл при помощи Import-CSV вам не нужно $content1 = Get-Content C:\TMP\test1.txt $content2 = Get-Content C:\TMP\test2.txt # Считаем сколько строк в каждом файле $x1= $($content1 | Measure-Object).Count-2 $x2= $($content2 | Measure-Object).Count-2 # Выбираем все строки кроме последней для сравнения (Compare-Object $content1[0..$x1] $content2[0..$x2]).InputObject
Второй вариант через Where
Compare-Object $content1 $content2 | Where {$_.InputObject -notmatch 'matching device'}
The opinion expressed by me is not an official position of Microsoft
- Предложено в качестве ответа Vector BCOModerator 29 июля 2019 г. 22:45
- Помечено в качестве ответа Vector BCOModerator 31 июля 2019 г. 20:35
29 июля 2019 г. 21:39Модератор -
Спасибо большое, в точности то, что мне было нужно.31 июля 2019 г. 19:17