Помощь при разборе Powershell - Intermediate-sortaInmediate Вопрос - PullRequest
1 голос
/ 22 июня 2011

У меня есть текстовый файл в следующем формате:

Rtmp: 2a1234bzcde9 SL ID: 1549566 IP: 192.168.0.1
Rtmp: 45a1234b4erde9 SL ID: 1549566 IP: 192.168.0.1
Rtmp: a1254bcde9 SL ID: 1549566 IP: 192.168.0.1
Rtmp: 23a1ft4bcde9 SL ID: 1549566 IP: 192.168.0.1
Rtmp: a125egbcde9 SL ID: 1549566 IP: 192.168.0.1

У меня здесь несколько сотен записей.

Проблема в том, что мне нужно получить вторую запись в каждой строке текста (между rtmp и sl). Каждое из этих чисел имеет длину от 6 до 15 символов, все случайные символы.

Как бы я вытащил его в массив этих чисел? Я хочу использовать эти числа, чтобы сделать их именами учетных записей пользователей в 2008r2 (без использования AD), создать папки в inetpub / ftproot, создать там папки с псевдонимами и связать каждую учетную запись с соответствующей виртуальной папкой.

Последнее, что я могу сделать ... это манипулирование текстовыми файлами, которые я сосу !! Вот что у меня так далеко:

$items = Get-Content $HOME/desktop/info.txt

$splitItems = @()
$splitItems = foreach ($item in $items)
{
    $item.split(" ")
}

Это разделяет каждую строку, так что splitItems [0] - это первая строка текста, теперь разделенная на несколько строк текста из-за пробела.

Если бы я попытался взять массив SplitItems и использовать тот же тип foreach для дальнейшего его разделения. Это вернуло мне множество символов. ПОЛЕЗНАЯ LOL хаха. ну .. каждый раз, когда я пытаюсь, я продолжаю получать mumbo jumbo, или это не строковый тип (хотя, кажется, get type говорит, что это строка). Я думаю, что в процессе тип строки меняется на общий тип io.object?

Буду очень признателен за любые идеи или помощь. !!!

Ответы [ 4 ]

3 голосов
/ 22 июня 2011

Ответы регулярных выражений могут быть верным способом, но если ваш входной файл действительно так последовательно отформатирован, как вы предполагаете, вы, возможно, были на правильном пути для начала.Попробуйте что-то вроде этого:

$accounts = gc info.txt | % { ($_ -split ' ')[1] }
$accounts
2 голосов
/ 22 июня 2011

Учитывая, что ваш текстовый файл "c: \ temp \ t.txt", вы можете проверить это:

switch -regex -file "c:\temp\t.txt"
{
  "^Rtmp: (.*) SL.*$" {$matches[1]}  
}
1 голос
/ 22 июня 2011
$a = "Rtmp: 2a1234bzcde9 SL ID: 1549566 IP: 192.168.0.1 Rtmp: 45a1234b4erde9 SL ID: 1549566 IP: 192.168.0.1 Rtmp: a1254bcde9 SL ID: 1549566 IP: 192.168.0.1 Rtmp: 23a1ft4bcde9 SL ID: 1549566 IP: 192.168.0.1 Rtmp: a125egbcde9 SL ID: 1549566 IP: 192.168.0.1"

[regex]$regex = "Rtmp:\s(\S+)\sSL"
[regex]::matches($a,$regex) | foreach-object {$_.groups[1].value}

2a1234bzcde9
45a1234b4erde9
a1254bcde9
23a1ft4bcde9
a125egbcde9
0 голосов
/ 22 июня 2011

Если вы хотите извлечь одну часть из строки, и эта строка следует определенному шаблону, просто используйте '-replace' и регулярное выражение .

$numbers = ($items -replace '^Rtmp: (\S+) SL.*$','$1')

Эта строка будет перебирать каждый элемент, извлекать строку и выводить ее в новый массив.

Некоторые значения:

  • \ S + означает «Один или несколько символов, которые не являются пробелами»
  • $ 1 означает «Часть в первом наборе скобок»
...