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

3

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

Original Answer 翻译成“最初的回答”。

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

最初的回答:未显示任何内容。命令本身确实有输出结果,但我想将此输出结果存储到一个变量中。

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


-outvariable (-ov)可以使用。Restore-ASDatabase -Server $Server -RestoreFile $File -Name $CINPUT -Security:$Choice -AllowOverwrite -ErrorAction Stop -ov $output。 (注意:我的PSVersion为5.1.14393.2969,其他早期版本报告-ov创建一个集合https://dev59.com/1Zzha4cB1Zd3GeqPHZjv#40666568) - undefined
你可能没有注意到,无论命令输出了一个对象还是多个对象,-OutVariable 始终会创建一个 [System.Collections.ArrayList] 实例,这一点可能并不明显,但它确实发生了,而且不太可能改变。可以参考GitHub上的讨论 - undefined
2个回答

5

您可以将命令的输出保存为变量,如下所示:

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

5

D.J.'s helpful answer提供了捕获任何命令(成功)输出到变量的最直接的方法 - 直接赋值。


至于你尝试过的内容:

>$output

>,输出重定向运算符只支持将输出重定向到由其名称/路径指定的文件 (它还支持使用>$null抑制输出),您无法将其用于保存输出到变量

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

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


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

也就是说,命令的输出仍然(也)被写入输出流,如果该输出没有被消耗(由另一个命令、变量赋值或重定向消耗),它仍然会打印到控制台上。

例如,-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)很有用:
  • 如果您想在控制台中查看命令的输出,同时还要捕获该输出以供以后分析。

  • 如果您想在管道内捕获中间的命令输出,而不会干扰管道。


关于 -OutVariable-ov)的一个小问题是:
  • 它不创建常规的PowerShell数组([object[]]),而是[System.Collections.ArrayList]的实例。

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

这些令人惊讶的行为在GitHub问题#3154中进行了讨论。
然而,考虑到PowerShell的灵活集合处理和其成员访问枚举功能,这些行为在实践中可能并不总是有问题的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接