需要一些帮助!
我有一个相当困难的问题,我想解决。 我有一个数组:
@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]})
}
已经出现错误。
答案 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