我正在调用 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"
};
我想坚持将参数作为数组传递,因为它们可以传递给一个例程,这个参数非常适合参数化我的过程。
答案 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参数 对布尔值开关和布尔参数都是相同的。