2016-06-18 3 views
0

Я написал сценарий обслуживания системы, который выполняет основные функции, которые извлекают статистику с хоста, записывает вывод в новый PSObject, а затем, наконец, объединяет результаты и преобразует все это на веб-страницу HTML ,Вывод «Оптимизация объема» Powershell

Я, похоже, не могу написать вывод Optimize-Volume на конвейер, я должен использовать -verbose - почему это? Я хотел бы, чтобы проверить результаты Optimize-Volume командлета ищет следующий текст, который генерируется в конце -verbose вывода, в зависимости от результата: -

  • «рекомендуются дефрагментировать этот объем. '
  • «Вам не нужно дефрагментировать этот том».

Вот функция: -

function Get-DefragInfo { 

    $getwmi = Get-WmiObject -Class Win32_volume -Filter "DriveType = 3" | Where-Object {$_.DriveLetter -cne $null} -ErrorAction SilentlyContinue 
    $letter = $getwmi.DriveLetter -replace ':' 

    foreach ($drive in $getwmi) 
    { 
    $analysis = Optimize-Volume -DriveLetter $letter -Analyze 
    if ($analysis -like 'It is recommended that you defragment this volume.') 
    { 
    $props =[ordered]@{‘Drive Letter’=$letter 
       'Defrag Recommended?'='Yes'} 
    } 
    elseif ($analysis -like 'You do not need to defragment this volume.') 
    { 
    $props [email protected]{‘Drive Letter’=$letter 
       'Defrag Recommended?'='No'} 
    } 


    $obj = New-Object -TypeName PSObject -Property $props 

    Write-Output $obj 

    } 
    } 

Как перехватывать вывод, что нужно?

Заранее спасибо.

ответ

0

в PowerShell 3.0 и выше, вы можете использовать оператор перенаправления потока > захватить Verbose вывода переменный:

# Merge stream 4 (Verbose) into standard Output stream 
$analysis = &{Optimize-Volume -DriveLetter $letter -Analyze -Verbose} 4>&1 
# Check the "Message" property of the very last VerboseRecord in the output 
if($analysis[-1].Message -like "*It is recommended*") 
{ 
    # defrag 
} 
else 
{ 
    # don't defrag 
} 
0

Если мы Get-Help Optimize-Volume -full, мы увидим, что командлет не имеет выхода.

Некоторые поисковые запросы приводят меня к this Microsoft Scripting Guys article, который указал, используя следующие, чтобы проверить, требуется ли Defrag.

(gwmi -Class win32_volume -Filter "DriveLetter = 'C:'").DefragAnalysis() 

Зная это, мы с легкостью можем сделать заявление IF.

$DefragCheck = (gwmi -Class win32_volume -Filter "DriveLetter = 'C:'").DefragAnalysis() | 
Select DefragRecommended 

IF($DefragCheck){"Defrag recommended"}ELSE{"Defrag is not needed."} 

Это полезно для труб командлетов в Get-Member, чтобы увидеть, если есть какие-либо доступные варианты. В приведенном выше примере мы можем отправить gwmi -Class win32_volume -Filter "DriveLetter = 'C:'" в Get-Member и найти метод DefragAnalysis, для которого мы используем точечную нотацию для доступа (оберните Get-WmiObject in(), затем используйте имя a и метод, за которым следует(), он выглядит ! запутанные, пока вы не попробуете пару раз)

0

Спасибо, я пошел к verbose redirection и, похоже, работает хорошо. Мой метод не самый чистый способ сделать это, я понимаю, но он работает для меня.

Мне также нравится второй вариант, я собираюсь использовать его после завершения сценария и проверки функциональности.

Спасибо за вашу помощь еще раз.

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