2014-04-10 2 views
2

У меня есть файл, как это:Powershell Get-Content с Where-Object

line one email1 
line two email1 
line three email2 
line four email1 

Если я хочу, чтобы извлечь только те строки, которые содержат "EMAIL1", я делаю это:

$text = Get-Content -Path $path | Where-Object { $_ -like *email1* } 

$ текст теперь массив с 3-х элементов, содержащих эти строки, и я перебирать это так:

for ($i = 0; $i -lt $text.Length; $i++) 
{ 
#do stuff here 
} 

Однако, если я хочу, чтобы получить линии CON «email2».

$text = Get-Content -Path $path | Where-Object { $_ -like *email2* } 

возвращает строку, а не массив одного элемента. И когда я повторяю его, он выполняет итерацию через каждый символ в строке.

Как я могу создать массив с одним элементом, а не с строкой?

ответ

2

Выполнено.

Мне нужно объявить $ text как тип [String[]].

[String[]]$logText = Get-Content -Path $path | Where-Object { $_ -like *email1* } 
+0

Хорошо. См. Также «более общий» подход в моем ответе. –

3

Вместо того, чтобы метод Length для лечения одного оператора элемент как массив, я думаю, что лучшим решением было бы использовать foreach петлю вместо for цикла для перебора:

foreach ($element in $text) { 
    #stuff happens 
} 

всегда разобрать через каждый элемент в $text, даже если это один элемент.

+0

моя проблема заключается в том, что $ текст иногда Strin g, иногда массив String. Foreach на строке будет просто перебирать каждый символ, не так ли? –

+0

Нет - если вы 'foreach' строку, цикл будет выполняться только один раз, поскольку строка содержит только один элемент (сама строка). Количество символов не имеет к этому никакого отношения. – Kohlbrr

+0

ах, да, ты прав. Спасибо за Ваш ответ. –

6

Для того, чтобы получить массив всегда, даже с 1 (т.е. не строка) или 0 (т.е. не $null) элементы, используйте оператор @():

$text = @(Get-Content -Path $path | Where-Object { $_ -like *email1* }) 
1

Вы также можете использовать Select-String Cmdlet, он работал для меня, даже только с одним результатом в выборе:

$text1 = Get-Content -Path $path | Select-String "email1" 
$text1 | % { 
    # Do some stuff here 
} 

$text2 = Get-Content -Path $path | Select-String "email2" 
$text2 | % { 
    # Do some stuff here 
} 
+1

Это потому, что '%' является псевдонимом для 'foreach', поэтому вы действительно просто полагаетесь на то, что @Kohlbrr сказал:' foreach' или '%' будут работать с одной строкой или массивом. – Duncan

+0

@gruntzy thanks - нашел, где использование строки выбора с регулярным выражением вернет массив объектов, в котором я нуждался! – mbourgon

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