2016-06-18 19 views
0

ホストから統計情報を取得し、新しいPSObjectに出力し、結果を結合してHTML Webページに変換する基本機能を実行するシステム保守スクリプトを作成しました。 。Powershellの「最適化ボリューム」出力

Optimize-Volumeの出力をパイプラインに書き込むことができないようですが、私は-verboseを使用する必要があります - これはなぜですか?私は、その結果に応じて、-verbose出力の最後に生成された次のテキストを検索することによってOptimize-Volumeコマンドレットの結果を確認したいと思います: -

  • 「あなたがこのボリュームをデフラグすることをお勧めします。 '
  • 'このボリュームをデフラグする必要はありません。'ここで

機能である: -

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では

以降は、あなたが変数に冗長出力に含まをキャプチャするために、ストリームのリダイレクト演算子>を使用することができます。

# 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に私を導いてくれます。

(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()をラップし、次に。とメソッド名の後に()を使用すると、 !混乱あなたはそれを試してまで数回)

0

おかげで、私がのために行ってきました冗長なリダイレクトオプションを使用するとうまくいくように見えます。私の方法は、私が理解している最もクリーンな方法ではありませんが、それは私のために働くものです。

私は2番目のオプションも好きです。スクリプトが完成し、機能が証明されたら、これを使用してみます。

もう一度お返事ありがとうございます。

関連する問題