Powershell将变量中的参数输出为字符串

时间:2014-04-25 08:05:00

标签: powershell

$mycolorparams = "-foregroundcolor red -backgroundcolor black"

write-host "I want this foreground in Red and background in black" $mycolorparams

大家好,

这让我疯了。当我使用write-host时,cmdlet将所有内容返回为字符串:

“我希望这个前景为红色,背景为黑色 - 前景色红色 - 背景色黑色”。

不是带有红色文字和黑色背景的实际字符串。

最糟糕的是,这对我有用,直到我在代码中更改了var名称。我不知道自那以后改变了什么。我怀疑它与引号有关,因为单引号吐出字符串,双引号读取var。但是在对文本和var进行单重和双重变换后,结果只是一个字符串输出。

过去一小时我一直在网上搜寻没有运气,有很多例子,但我找不到具体问题。任何帮助表示感谢,谢谢。

2 个答案:

答案 0 :(得分:4)

嗯..我在包装函数的形状方面有一些解决方法:

$mycolorparams = " -foregroundcolor red -backgroundcolor black"
function redBlack($text){
    invoke-expression ("write-host " + $text + $mycolorparams)
}

然后执行

redBlack "I want this foreground in Red and background in black"

将产生正确的彩色结果。

答案 1 :(得分:4)

使用参数splatting(虽然我认为它不是旧版本,因此您可能需要升级到Powershell版本3或更高版本。)

PS C:\> $opts = @{ForegroundColor="red"; BackgroundColor="black"; object="Hello world"}
PS C:\> write-host @opts
Hello world

或:

PS C:\> $opts = @{ForegroundColor="red"; BackgroundColor="black"}
PS C:\> write-host @opts -object "Hello world"
Hello world

您需要将选项字符串转换为哈希表或数组。事实上,如果您运行help about_Splatting,您会发现其中一个示例完全涵盖了您的问题:

  

此示例显示如何在不同的情况下重复使用splatted值   命令。       此示例中的命令使用Write-Host cmdlet编写消息       到主机程序控制台。它使用splatting指定前景       和背景颜色。

To change the colors of all commands, just change the value of the $Colors
variable.

The first command creates a hash table of parameter names and values and 
stores the hash table in the $Colors variable.

           $Colors = @{ForegroundColor = "black"
                       BackgroundColor = "white"}

The second and third commands use the $Colors variable for splatting in a
Write-Host command. To use the $Colors variable, replace the dollar sign 
($Colors) with an At symbol (@Colors).

           # Write a message with the colors in $Colors
           Write-Host "This is a test." @Colors

           # Write second message with same colors. 
           # The position of splatted hash table does not matter.
           Write-Host @Colors "This is another test."