使用包含标志的值数组(splatting)调用cmdlet

时间:2015-03-18 23:57:17

标签: arrays powershell

我正在调用 start-process 命令传递一组值...

$args = @{
    FilePath = "c:\myapp.exe"
    RedirectStandardOutput = "c:\output.txt"
};

start-process @args;

...这很好用,但我现在想将等待标志添加到 start-process 的参数中,但是如何将其添加到$ args当数组不需要赋值给它时...

$args = @{
    Wait = ?
    FilePath = "c:\myapp.exe"
    RedirectStandardOutput = "c:\output.txt"
};

我想坚持将参数作为数组传递,因为它们可以传递给一个例程,这个参数非常适合参数化我的过程。

2 个答案:

答案 0 :(得分:5)

不是最佳参考,但如果您查看TechNet的Start-Process,您会看到-Wait的默认值为False。这支持开关或"标志" 可以被视为布尔值。

对于使用-Wait参数的splat,您只需提供一个布尔值。这与您可以选择使用-Wait:$true在cmdlet中调用交换机的方式类似。

$args = @{
    Wait = $true
    FilePath = "c:\myapp.exe"
    RedirectStandardOutput = "c:\output.txt"
};

答案 1 :(得分:4)

免责声明:这不是答案;相反,这是对@Matt答案中某一点的修正,但我的内容不符合允许的评论格式。

虽然Matt的解决方案适用于所提出的问题,但有一个不准确:通常,不应考虑开关"只是"布尔即可。

考虑这个功能:

function f([switch]$sw) { "switch is $sw" }

这些哈希:

$argTrue = @{ sw = $true }
$argFalse = @{ sw = $false }

现在查看结果:

| Call           | Result           | Valid? |
+----------------+------------------+--------+
| f -sw          | switch is True   | Yes    |
| f -sw:$true    | switch is True   | Yes    |
| f -sw:$false   | switch is False  | Yes    |
| f @argTrue     | switch is True   | Yes    |
| f @argFalse    | switch is False  | Yes    |
| f -sw $true    | switch is True   | Yes    |
| f -sw $false   | switch is True   | No!!   |

那就是将开关视为"只是"一个普通的布尔参数,如在最后两个测试用例中所做的那样,对于false情况产生无效结果,对于真实情况产生意外有效的结果。但PowerShell正在做它应该做的事情:switch不接受参数,因此-sw之后的$ true或$ false 或任何对{{1}的值没有任何影响切换。

实际上:

  • 使用sw
  • 调用布尔参数
  • 使用-<paramname> <Boolean value>
  • 调用布尔开关

但同样,Matt的回答对于提出的问题是正确的,正如我上面的测试案例所证实的那样。使用splatted参数 对布尔值开关和布尔参数都是相同的。