如何将PowerShell变量用作命令参数?

24

我试图将一个变量用作命令的参数,但无法完全弄清楚。假设MyCommand将接受两个参数:option1option2,它们接受布尔值。 我该如何使用$newVar替换选项1或2?例如:

$newVar = "option1"
MyCommand -$newVar:$true

我不断收到类似于'无法找到接受参数“-System.String option1”的位置参数'的消息。


更具体地:
这里,CSV文件是另一个策略的输出。循环遍历文件中的每个属性,并在我的策略 asdf 中设置该值;因此,-$_.name:$_.value 应替换为 -AllowBluetooth:true

Import-Csv $file | foreach-object {
    $_.psobject.properties | where-object {
    # for testing I'm limiting this to 'AllowBluetooth' option
    if($_.name -eq "AllowBluetooth"){
    Set-ActiveSyncMailboxPolicy -Identity "asdf" -$_.name:$_.value
    }}
}

2
你是指 newVar 但错误地放在 myVar 了吗? - manojlds
5个回答

32

通常情况下,要使用变量来填充 cmdlet 参数,你可以使用哈希表变量,并使用 @ 散列表操作符。

 $newVar = @{option1 = $true}
 mycommand @newVar

添加的示例:

$AS_policy1 = @{
Identity = "asdf"
AllowBluetooth = $true
}

Set-ActiveSyncMailboxPolicy @AS_policy1

1
谢谢您的帮助,但是它返回一个错误:“无法找到接受参数'System.Collections.Hashtable'的位置参数”。具体来说,我有一个循环从Csv获取属性并将它们运行到Set-ActiveSyncMailboxPolicy中。对于一个特定的实例,我会说$.name =“AllowBluetooth”,而$.value =$true(我写出这些变量以确认正确的值)。然而,我无法将它们组合在一起Set-ActiveSyncMailboxPolicy -Identity "asdf" @{$_.name = $_.value}或者-$_.name:$_.value。不过,它可以很好地接受$_.value。 - Gary
1
如果您使用散列参数,应将所有参数包含在散列表中。 - mjolinor
如果有人尝试使用这个答案,但是示例对您不起作用,可能是因为您犯了和我一样的错误,由于缺乏注意力而以通常的方式写入$AS_policy1变量,而应该写成带有“扩展”符号的@AS_policy1 - pgr

7
看看这个是否适合您:

请查看以下内容:

 iex "MyCommand -$($newVar):$true"

谢谢manojlds,这让我离成功又近了一步。$newVar实际上是$.name,而$true则是$.value(等于“允许”)。之前的方法可以接受$.value作为值,但不能接受$.name作为参数。使用你的方法可以接受$.name作为我的参数,但不能接受$.value作为值……报错信息是"无法将值“System.String”转换为类型[type]"。我会继续尝试其他方法。 - Gary
我已经让你的方法在-$($newVar)需要一个字符串时正常工作,但是它在布尔值上失败了,因为它认为它是一个字符串。我相信这是因为整个命令都在引号中。有什么建议吗? - Gary
@Fantabulum: 根据我在答案中解释的原因,iex "MyCommand -$($_.name):$($_.value)" 应该可以工作。+1 @manojlds。 - Emiliano Poggi

5

我曾经遇到过同样的问题,现在知道了如何解决。解决方法是使用Invoke-Expression:invoke-Expression $mycmd 这将使用$mycmd字符串,替换变量并将其作为带有给定参数的命令集执行


4

如今,如果您不介意将字符串评估为命令,您可以使用Invoke-Expression

$mycmd = "MyCommand -$($newVar):$true"
Invoke-Expression $mycmd

1
我会尝试使用以下代码:
$mycmd = "MyCommand -$($newVar):$true"
& $mycmd

结果

无法工作,因为&运算符只执行没有参数或脚本块的单个命令。


谢谢您的建议,empo,但这似乎和我的原始代码行为相同。如果有帮助的话,我可以发布我的实际脚本摘录,但它涉及多个循环和Exchange命令,所以我认为这只会引起混乱。 - Gary

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