none
Фильтрация результата сравнения Compare-Object через Where-Object RRS feed

  • Вопрос

  • Привет народ.
    Помогите победить проблему:

    пишу скрипт (в будущем - для заббикса), который должен определить: что в комп засунули по 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


    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","=>"

    Подскажите, пожалуйста, как?

  • Добрый день.
    Простите что с огромным запозданием но все же то о чем вы спрашивали выглядит приблизительно так:

    # У вас нет 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