困惑参数

时间:2013-10-09 20:07:16

标签: powershell

需要一些帮助!

我有一个相当困难的问题,我想解决。 我有一个数组:

@array = string, string, string

在我的例子中:

yellow, red, blabla

我想从数组中使用这些字符串并将它们放在带有额外if子句的命令行开关中(很难解释,我会更好地显示它)并在将它们添加到命令行开关之前检查它们是否存在。

$array = @()
$array += "red"
$array += "blabla"
$command = write-host
if ($array[0]) {$command = $command + " -foregroundcolor $array[0]"}
if ($array[1]) {$command = $command + " -object $array[1]"}
&$command

这显然不起作用。问题是,如何将字符串的单个命令行开关的某些参数与令人费解放在一起?

Error tells me more or less, that this no commandlet or executable script.

我有另一个想法,但我想避免,因为它不会保持简单:

If (!$array[0]) {
              (if (!$array[1]) {write-host "nodata"} else {write-host -object $array[1]})
else
                   (if (!$array[1]) {write-host -foregroundcolor $array[0]}
                   else {write-host -forgroundcolor $array[0] -object $array[1]})
                }

已经出现错误。

2 个答案:

答案 0 :(得分:4)

我认为你要找的是splatting。您创建一个表示参数的名称/值对的哈希,并将其传递给cmdlet。这使得有条件地为cmdlet设置参数非常简单,无需复制/粘贴在switch或嵌套if / else块中调用cmdlet的各种排列。

$MyParms = @{};    
$array = @()
$array += "red"
$array += "blabla"
if ($array[0]) {$MyParms.Add("foregroundcolor",$array[0])};
if ($array[1]) {$MyParms.Add("object",$array[1])};

Write-Host @MyParms;

答案 1 :(得分:2)

这是一个常见问题 - “我想调用一个cmdlet,但根据各种编程条件,某些参数存在/丢失。”

标准解决方案是将您的参数放在哈希表中,并使用splatting传递它们。

$array = @()
$array += "red"
$array += "blabla"

$params = @{}
if ($array[0]) { $params['foregroundcolor'] = $array[0] }
if ($array[1]) { $params['object'] = $array[1] }

write-host @params