使用变量作为参数的Powershell调用运算符(&)

8

大家好,

我正在尝试使用PowerShell中的变量作为参数来执行函数。我不确定是否有可能按照我的想法进行,但也许有人知道如何操作。

$scriptPath = "C:\temp\Create-File.ps1"
$parameters = "-Path C:\temp\testfile.txt -DoSomethingSpecial"

& $scriptPath $parameters

类似这样的东西,我不知道参数的输入顺序,所以我不能使用 $args[n..m] 或按位置绑定。也许有其他我不知道的Cmdlet可以做到这一点?


2
你能否使用哈希表来处理这些参数? - Jelphy
是的,这可以通过一些字符串操作实现 - 我该如何传递它? - Fabian Fulde
2
使用splatting - iRon
4个回答

8
如@James C.在其回答中所建议的,将对象传递只允许以Powershell语法传递参数(例如-param1 value1 -param2 value2)。
当您需要更多控制传递的参数时,例如:
  • unix风格的双破折线语法 --param1 value1
  • Windows风格的斜杠语法 /param1 value1
  • 需要等号或冒号的-param1=value1-param1:value1
  • 无参数值时的参数-boolean_param1
  • 额外的动词(没有参数名的值)value1 value2
您可以使用数组而不是对象。
以"ipconfig"命令为例,使用以下命令更新所有名称中带有“con”的连接:
$cmd = "ipconfig"
$params = @('/renew', '*Con*');
& $cmd $params

针对给出的具体问题:

$params = @('-Path', 'C:\temp\testfile.txt', '-DoSomethingSpecial')
.\Create-File.ps1 @params

4
你可以使用哈希表和Splatting来完成这个操作。
只需像平常设置哈希表中的每个参数名和值一样,将其设置为变量,然后使用@params语法传递即可。
但是,开关参数需要一个$true值才能正常工作。
$params = @{
    Path               = 'C:\temp\testfile.txt'
    DoSomethingSpecial = $true
}

.\Create-File.ps1 @params

太棒了,这个方法我甚至不知道存在。谢谢! - Fabian Fulde
我该如何传递一个动词?例如 myfile.exe -named_param named_value verb1 verb2 - Tomer W
@TomerW 只需引用整个内容:@{ named_param = "named_value verb1 verb2" } - henrycarteruk
@JamesC. 那个参数 -named_param "named_value verb1 verb2"... 但是我发现使用数组而不是对象,如 @("-named_param", "named_value","verb1","verb2"),可以很好地工作,并且更适用于不同的参数语法约定。 - Tomer W

2
您可以使用Start-Process来运行它。
Start-Process powershell -ArgumentList "$scriptPath $parameters"

0
简单的解决方案,对原始内容进行最小的更改:
$scriptPath = "C:\temp\Create-File.ps1"
$parameters = "-Path C:\temp\testfile.txt -DoSomethingSpecial"

& $scriptPath $parameters.Split()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接