Фильтр CSV, где столбец больше или равен числу - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть следующий CSV-файл:

"Count";"Computername";"Files and paths"
"3";"Computer1";"%OSDRIVE%\USERS\0000008\APPDATA\LOCAL\TEMP\__PSSCRIPT.PS1"
"1";"Computer1";"%OSDRIVE%\USERS\0000008\APPDATA\LOCAL\TEMP\__PSSCRIPT.PS1"
"5";"Computer3";"\\SRV\TOTO$\HELLO.BAT"
"8";"Computer4";"\\192.168.8.18\TOTO\DNS.BAT"
"10";"Computer15";"%OSDRIVE%\Hello.exe"
"12";"Computer6";"\\SRV\SCRIPTS\REBOOT.BAT"
"88";"Computer7";"%OSDRIVE%\Winword.exe"
"154";"Computer2";"%OSDRIVE%\excel.exe"

Я хочу сохранить всю строку, где "Count" больше или равен 8.

Я пробовал следующеекоманда:

Import-Csv -Path MyFile.csv -Delimiter ";" | Where-Object {$_.Count -ge 8}

Но он возвращает мне только строки с 8, 88 или 18 ... но не все старшие строки до 8 (например, 10, 12, 154 ...).

Почему?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Если информация о типе не внедрена ( см. Документацию ), каждое значение становится строкой.Это приводит к алфавитному сравнению вместо целого.См. Следующее:

$csv = ConvertFrom-Csv @'
"Count";"Computername";"Files and paths"
"3";"Computer1";"%OSDRIVE%\USERS\0000008\APPDATA\LOCAL\TEMP\__PSSCRIPT.PS1"
"1";"Computer1";"%OSDRIVE%\USERS\0000008\APPDATA\LOCAL\TEMP\__PSSCRIPT.PS1"
"5";"Computer3";"\\SRV\TOTO$\HELLO.BAT"
"8";"Computer4";"\\192.168.8.18\TOTO\DNS.BAT"
"10";"Computer15";"%OSDRIVE%\Hello.exe"
"12";"Computer6";"\\SRV\SCRIPTS\REBOOT.BAT"
"88";"Computer7";"%OSDRIVE%\Winword.exe"
"154";"Computer2";"%OSDRIVE%\excel.exe"
'@ -Delimiter ';'

$csv | gm

Все свойства являются строками:

   TypeName: System.Management.Automation.PSCustomObject

Name            MemberType   Definition                                                                      
----            ----------   ----------                                                                      
Equals          Method       bool Equals(System.Object obj)                                                  
GetHashCode     Method       int GetHashCode()                                                               
GetType         Method       type GetType()                                                                  
ToString        Method       string ToString()                                                               
Computername    NoteProperty string Computername=Computer1                                                   
Count           NoteProperty string Count=3                                                                  
Files and paths NoteProperty string Files and paths=%OSDRIVE%\USERS\0000008\APPDATA\LOCAL\TEMP\__PSSCRIPT.PS1

Самое простое решение - использовать приведение:

$csv | Where-Object {[int]$_.Count -ge 8}
0 голосов
/ 25 сентября 2018

Count считывает строку, поэтому вам нужно изменить ее на целое число, чтобы сравнение работало.

Один из способов - изменить выражение Where-Object на

where {($_.Count -as [int]) -ge 8}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...