首页 > 解决方案 > Powershell 垂直输出

问题描述

错误截图

我只想运行一个简单的命令,例如echo @profile,但输出是垂直的。我理论上可以阅读和理解输出,但这是一个很大的不便。我该如何解决?

标签: powershell

解决方案


您通常不会使用@符号来引用变量,您几乎总是使用$来通过变量名来引用变量的值。您也可以使用Variable:提供程序 或Get-Variable,但我不会在这里讨论。

如果您省略echo,您实际上会收到以下错误消息:

The splatting operator '@' cannot be used to reference variables in an expression.
'@var' can be used only as an argument to a command. To reference variables
in an expression use '$var'.

这是因为 using@var是一种称为Splatting的技术,它是使用数组或哈希表为命令、函数或 cmdlet 提供参数的做法。请注意,您目前不能将参数传递给方法。查看我上面链接的答案,以获取有关如何在多个用例中实际表达参数的更多信息。

至于为什么要获得垂直输出,请注意它echo实际上是Write-Output. Write-Output接受位置参数,为此它将在自己的行中输出传入的每个对象。当您将字符串作为参数数组传递给函数时,它会将字符串转换为字符数组,因此有效地将@profileto的每个字符Write-Output作为其自己的参数传递,然后将数组的每个元素吐出。当 PowerShell 直接向控制台显示一个数组时,它会在自己的行上显示每个元素。

注意:在不同的Write-cmdlet 中,Write-Output它的独特之处在于它会在自己的行上输出每个位置参数,因为它会为您传入的每个参数返回一个数组。其他Write-cmdlet 会将数组的每个元素连接成一个以空格分隔的细绳。在 PowerShell 中使用不同的输出流时,Write-cmdlet 会发挥作用。这是我的另一个答案,它解释了不同输出流的含义以及如何写入它们。

此外,要向最终用户显示不需要在脚本或会话中进行额外编程处理的纯信息文本,请使用Write-Host.

这就是为什么你得到垂直输出的原因,因为@profile它被转换为一个数组,然后作为一个字符数组转换成Write-Output一个字符数组,并将一个数组的Write-Output所有参数写回一个新数组的单个元素。然后 PowerShell 将显示新数组,其中每个元素在其自己的行上。


我怀疑你真正想做的是输出$profile。您可以使用以下技术之一(请注意,echo/Write-Output这些技术通常是多余的):

# Use the alias
echo $profile

# Use Write-Output
Write-Output $profile

# Omit Write-Output entirely
$profile

# View one of the alternative profiles by name
# CurrentUserCurrentHost is the default
# and is most often the one you are looking for
$profile.CurrentUserCurrentHost
$profile.CurrentUserAllHosts
$profile.AllUsersCurrentHost
$profile.AllUsersAllHosts

推荐阅读