Powershell' Optimize-Volume'产量

时间:2016-06-18 23:10:26

标签: windows powershell

我编写了一个系统维护脚本,它执行从主机检索统计信息的基本函数,将输出写入新的PSObject,然后最终将结果组合并将其全部转换为HTML网页。

我似乎无法将Optimize-Volume的输出写入管道,我必须使用-verbose - 这是为什么?我想通过查找Optimize-Volume输出末尾生成的以下文本来检查-verbose cmdlet的结果,具体取决于结果: -

  • '建议您对此卷进行碎片整理。'
  • '您无需对此卷进行碎片整理。'

这是功能: -

    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 =@{‘Drive Letter’=$letter
              'Defrag Recommended?'='No'}
    }


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

  Write-Output $obj

  }
  }

如何捕获我需要的输出?

提前致谢。

3 个答案:

答案 0 :(得分:0)

如果我们Get-Help Optimize-Volume -full,我们会看到cmdlet没有输出。

有些搜索引导我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."}

将cmdlet管道传输到Get-Member以查看是否有可用选项很有帮助。在上面的示例中,我们可以将gwmi -Class win32_volume -Filter "DriveLetter = 'C:'"传递给Get-Member并找到DefragAnalysis方法,我们使用点符号来访问(将Get-WmiObject包装在()中然后使用。和方法名字后跟(),看起来很混乱,直到你试了几次!)

答案 1 :(得分: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
}

答案 2 :(得分:0)

谢谢,我选择了详细的重定向选项,它似乎运行良好。我的方法不是我理解的最干净的方法,但它适用于我。

我也喜欢第二个选项,一旦脚本完成并且功能得到验证,我将会考虑使用它。

再次感谢您的帮助。