【问题标题】:Powershell 'Optimize-Volume' OutputPowershell“优化音量”输出
【发布时间】:2016-06-20 06:26:02
【问题描述】:

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

我似乎无法将Optimize-Volume 的输出写入管道,我必须使用-verbose - 这是为什么呢?我想通过查找在-verbose 输出末尾生成的以下文本来检查Optimize-Volume 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

  }
  }

如何捕获我需要的输出?

提前致谢。

【问题讨论】:

    标签: windows powershell


    【解决方案1】:

    在 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】:

      如果我们 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 包装在() 中,然后使用. 和方法名称后跟( ),在您尝试几次之前,它看起来很混乱!)

      【讨论】:

        【解决方案3】:

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

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

        再次感谢您的帮助。

        【讨论】:

          猜你喜欢
          • 2022-07-20
          • 1970-01-01
          • 2017-06-15
          • 2016-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-24
          • 2020-04-12
          相关资源
          最近更新 更多