2016-12-07 4 views
1

мне нужно взять под выход из dirquota au l команды на сервере 2008 R2, перебирать каждую строку, добавьте соответствующие данные для каждого пути авто квот на свой собственный уникальный объект, а затем добавить все объектов к массиву. Смотрите пример ниже:Перебор пунктов, создавать отдельные объекты

Auto Apply Quota Path: E:\Dir\SubDir 
Share Path:    \\SERVER\SubDir 
         \\SERVER\E\Dir\SubDir 
         \\SERVER\Dir\SubDir 
Source Template:  Template (Matches template) 
Limit:     500.00 MB (Hard) 
Thresholds: 
    Warning (80%):  Event Log 
    Limit (100%):  Event Log 

Auto Apply Quota Path: E:\Dir\SubDir 
Share Path:    \\SERVER\SubDir 
         \\SERVER\E\Dir\SubDir 
         \\SERVER\Dir\SubDir 
Source Template:  Template (Matches template) 
Limit:     500.00 MB (Hard) 
Thresholds: 
    Warning (80%):  Event Log 
    Limit (100%):  Event Log 

Auto Apply Quota Path: E:\Dir\SubDir 
Share Path:    \\SERVER\SubDir 
         \\SERVER\E\Dir\SubDir 
         \\SERVER\Dir\SubDir 
Source Template:  Template (Matches template) 
Limit:     500.00 MB (Hard) 
Thresholds: 
    Warning (80%):  Event Log 
    Limit (100%):  Event Log 

Auto Apply Quota Path: E:\Dir\SubDir 
Share Path:    \\SERVER\SubDir 
         \\SERVER\E\Dir\SubDir 
         \\SERVER\Dir\SubDir 
Source Template:  Template (Matches template) 
Limit:     500.00 MB (Hard) 
Thresholds: 
    Warning (80%):  Event Log 
    Limit (100%):  Event Log 

Auto Apply Quota Path: E:\Dir\SubDir 
Share Path:    \\SERVER\E\Dir\SubDir 
         \\SERVER\SubDir 
         \\SERVER\Dir\SubDir 
Source Template:  Template (Matches template) 
Limit:     500.00 MB (Hard) 
Thresholds: 
    Warning (80%):  Event Log 
    Limit (100%):  Event Log

Например, возьмем любую автоматическую квоту, и я хочу, чтобы изолировать «Auto Apply Квота Путь:» часть, которую я знаю, что я могу сделать с RegEx и Select-String, добавить, что к объекту под свойством «Имя», затем выделите часть «E: \ Dir \ Subdir» и добавьте это к тому же объекту в свойстве «Значение». Затем я хочу собрать данные из Source Template and Limit, добавив их к одному и тому же объекту. Затем, как только он попадет в пустую строку, добавьте объект, только что созданный в массив, пустую переменную объекта и начните повторение через следующий раздел автоматической квоты, пройдя тот же процесс.

Вот код, я работаю с до сих пор:

$AutoQuota = @() 
$AutoQuota = dirquota au l 
$AutoQuota = $AutoQuota[2..$AutoQuota.Count] 
$obj = New-Object PSObject 
$objArr = @() 

$AutoQuota | % { 
    switch -regex ($_) { 
     "^Auto.*" { 
      $Name = $_ | Select-String -Pattern "^Auto*: " | 
        %{$_.Matches} | %{$_.Value} 
      $Value = $_ | Select-String -Pattern "\w:*" | 
        %{$_.Matches} | %{$_.Value} 
      $obj | Add-Member -MemberType NoteProperty -Name $Name -Value $Value 
     } 
     "^\s*$" { 
      $objArr += $obj 
      $obj = @() 
     } 
    } 
} 

Там будет больше на switch заявление, очевидно, я просто хочу, чтобы получить первую линию, чтобы работать, как ожидалось, то я добавлю отдых. Если есть более простой/лучший способ сделать это, я открыт для предложений.

ответ

0

Преобразовать вывод команды в одну строку, и разделить эту строку на два последовательных переносах (Windows кодирует переносы строк, как CR-LF, так что вам нужно \r\n для каждого LineBreak)

(dirquota au l | Out-String) -split '\r\n\r\n' 

Тогда фильтрация по регулярное выражение, которое группирует значения вы хотите извлечь из подстрок, и строительство объектов непосредственно из спичек:

$re = 'Auto Apply Quota Path:\s+(.*)[\s\S]*?' + 
     'Source Template:\s+(.*)\s+' + 
     'Limit:\s+(.*)' 

... | Where-Object { $_ -match $re } | ForEach-Object { 
    New-Object -Type PSObject -Property @{ 
    Path  = $matches[1] 
    Template = $matches[2] 
    Limit = $matches[3] 
    } 
} 
+0

Похоже, это ставит меня на правильном пути. Единственная проблема - я получаю результат только от первого блока данных. Я пишу в '(dirquota au l | Out-String) -split '\ n \ n'' в' Where-Object', это правильно? –

+0

@ AshHousewares Да. Разломы строк могут быть закодированы как CR-LF, однако, так что проверьте '-split '\ r \ n \ r \ n''. Также проверьте, сохранены ли пустые строки в захваченном командном выходе и что пустые строки не содержат других пробелов. –

+0

Итак, '-split \ n \ n' на самом деле не разделяет строку, так как вывод содержит только 1 элемент, поэтому он соответствует первой группе и все. Если я разделился на одну новую строку, я получаю 53 элемента, как ожидалось, потому что есть 53 строки вывода. Я подозреваю, что разделение на 2 новые строки не работает по какой-то причине, возможно, из-за формата вывода строки? –

0

попробовать что-то вроде этого

[email protected]" 
{Groupement*:Auto Apply Quota Path: {QuotaPath:c:\Tmp\tmp2} 
Share Path:    {SharePaths:\\Server\ 
         Yy2 
         Zz3} 
Source Template:  {SourceTemplate:Template xxx (Matches template)} 
Limit:     {Limit:600.00 MB (Hard)} 
Thresholds: 
    Warning (80%):  {TWarning:Event0 Log0} 
    Limit (100%):  {LWarning:Event0 Log0}} 

{Groupement*:Auto Apply Quota Path: {QuotaPath:Zxx} 
Share Path:    {SharePaths:Xx3 
         Yy4 
         Zz5} 
Source Template:  {SourceTemplate:Template (Matches template)} 
Limit:     {Limit:500.00 MB} 
Thresholds: 
    Warning (100%):  {TWarning:Event1 Log1} 
    Limit (100%):  {LWarning:Event1 Log1}} 
"@ 

$result=$AutoQuota | ConvertFrom-String -TemplateContent $template 
$result.groupement | select QuotaPath, SharePaths, SourceTemplate, Limit, TWarning, LWarning