2015-04-14 5 views
0

Я использую Powershell, и у меня возникают проблемы с командлетом Where-Object. Я сейчас select *, а затем хочу только выводить, когда поле равно Alabama. Это поле может быть под любым столбцом, а не только одним.Powershell using where-object

Это то, что у меня есть:

select * | where {$_.state_name -eq 'Alabama'} . 

Это работает для state_name, но я не могу получить все столбцы, не делая их по отдельности. Я пробовал where{$_ -eq....}, но это не работает.

+0

С чего же вы 'select'ing? Вместо этого вы попробовали '$ _. State_name'? Обратите внимание на период '.' после' $ _' – arco444

+0

Это была типология. Я имел в виду $ _. Я пытаюсь выбрать все где propertyname = 'Alabama' – user3071909

+0

Это похоже на http://stackoverflow.com/questions/29529154/powershell-counting-same-values-from-csv/29537226#29537226, а также – Matt

ответ

3

Вид хака, но:

select * | where {($_ | ConvertTo-Csv -NoTypeInformation)[1] -like '*"Alabama"*'} 
+0

Нах, не так много взломать ИМО. Единственный вариант - как-то объединить все поля вместе, а затем проверить конкатенированное значение для строки. CSV - достойный способ сделать это. – EBGreen

+0

Я могу думать о одном краевом случае, который может вызвать проблему. Если есть имя свойства, которое соответствует строке поиска, которая будет проблемой. – EBGreen

+0

@ EBGreen. Я подумал об этом и добавил [1], чтобы отрезать только строку данных. – mjolinor

3

Вы должны перебрать свойства всего объекта и проверить, если он содержит слово «Алабама».

Пример:

# Import CSV file and feed it to the pipeline 
Import-Csv -Path .\My.csv | 
    # For each object 
    ForEach-Object { 
     # Psobject.Properties returns all object properties 
     # (Psobject.Properties).Value returns only properties' values 
     # -contains operator checks if array of values contains exact string 'Alabama' 
     # You can also use -like operator with wildcards, i.e. -like '*labama' 
     if(($_.PSObject.Properties).Value -contains 'Alabama') 
     { 
      # If any of the object properties contain word 'Alabama', 
      # write it to the pipeline, else do nothing. 
      $_ 
     } 
    } 
+1

Это можно просто свести к 'Import-Csv C: \ Temp \ data.csv | Where-Object {($ _. PSObject.Properties) .Value -contains 'Alabama'} ' – Matt

+0

Я думаю, что это верный ответ на вопрос, поскольку он изначально извлекает нужные свойства/значения из объекта в полете, а не эффективно реимпортируя значения, как это делает другой ответ. – FoxDeploy

+0

@Matt +1, я пропустил это. – beatcracker

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