我编写了一个系统维护脚本,它执行从主机检索统计信息的基本函数,将输出写入新的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
}
}
如何捕获我需要的输出?
提前致谢。
答案 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)
谢谢,我选择了详细的重定向选项,它似乎运行良好。我的方法不是我理解的最干净的方法,但它适用于我。
我也喜欢第二个选项,一旦脚本完成并且功能得到验证,我将会考虑使用它。
再次感谢您的帮助。