如何将输出从命令重定向到变量?

时间:2019-06-27 23:31:11

标签: powershell

如何将此命令的输出重定向到变量?

Restore-ASDatabase -Server $Server -RestoreFile $File -Name $CINPUT -Security:$Choice -AllowOverwrite -ErrorAction Stop

我尝试过:

Restore-ASDatabase -Server $Server -RestoreFile $File -Name $CINPUT -Security:$Choice -AllowOverwrite -ErrorAction Stop >$output

$output

不显示任何内容。命令iteslf实际上确实输出了一些东西。但我想将此输出存储到变量

  

数据库还原操作成功完成。

2 个答案:

答案 0 :(得分:2)

您将命令的输出另存为这样的变量:

$commandOutput = Restore-ASDatabase -Server $Server -RestoreFile $File -Name $CINPUT -Security:$Choice -AllowOverwrite -ErrorAction Stop

答案 1 :(得分:2)

D.J.'s helpful answer显示了通过直接分配来捕获变量中任何命令(成功)输出的最直接方法。


关于您尝试过的事情

  

>$output

>,输出重定向操作符仅支持重定向到由其名称/路径指定的 (还支持<使用>$null抑制输出(em)-您不能使用它将输出保存在变量中。

因此,$output的值将被解释为目标文件名/路径;如果从未创建变量$output,则等于> $null,即输出抑制

还请注意,>创建的文件总是纯文本文件,它们反映的是您在控制台(终端)中看到的相同输出格式,因此不适合程序化处理。


相比之下,您在注释中提到的常见-OutVariable-ov)参数确实允许您在中捕获命令的输出对象变量,而不会干扰命令的输出。

也就是说,命令的输出仍然(也)写入输出流,并且如果该输出没有被其他命令,变量赋值或重定向使用,它仍然会打印到控制台。 / p>

例如,-OutVariable output将cmdlet /高级函数的输出保存在变量$output中-请注意,$参数中没有-OutVariable

PS> Get-Date -OutVariable output; $output

Thursday, June 27, 2019 10:17:07 PM  # direct Get-Date output
Thursday, June 27, 2019 10:17:07 PM  # output from $output

因此,-OutVariable-ov)很有用:

  • 如果您想在控制台中查看命令的输出,同时又将其捕获到变量中以供以后分析。

  • ,如果要在管道内捕获 intermediate 命令的输出而不干扰管道。


轻微警告-OutVariable-ov),它是:

  • 不会创建常规的PowerShell数组([object[]]),而是创建[System.Collections.ArrayList]的实例。

  • 创建一个-单元素-[System.Collections.ArrayList],即使该命令仅输出单个对象(例如,Get-Date也是如此)。

this GitHub issue中讨论了这些令人惊讶的行为。

但是,考虑到PowerShell具有灵活的集合处理功能和member enumeration功能,在实际操作中行为不一定总是有问题的。