2011-05-10 95 views
9

我想使用一个变量作为命令的参数,但不能完全弄明白。假设MyCommand将接受两个参数:option1option2,它们接受布尔值。我如何使用$ newVar替代选项1或2?例如:如何使用PowerShell变量作为命令参数?

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

我一直相处的东西线“位置参数无法找到接受的说法‘-System.String选项1’


更具体地:
这里,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 
    }} 
} 
+0

您的意思是'newVar',但是错误地放在'myVar'中? – manojlds 2011-05-10 21:49:07

+0

这是正确的,谢谢。 – Gary 2011-05-10 21:56:15

回答

19

通常使用一个变量来填充cmdlet的参数,你会使用一个哈希表变量,图示它,使用@

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

新增例如:

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

Set-ActiveSyncMailboxPolicy @AS_policy1 
+0

感谢您的帮助,但是返回错误“找不到接受参数的位置参数'System.Collections.Hashtable'。具体来说,我有一个循环从Csv获取属性属性并将它们运行到Set-ActiveSyncMailboxPolicy。一个特定的实例,我会说$ _。name =“AllowBluetooth”和$ _。value = $ true(我写这些变量来确认正确的值,但是我不能完全把它放在一起'Set-ActiveSyncMailboxPolicy - 标识“asdf”@ {$ _。name = $ _。value}'或' - $ _。name:$ _。value'。它只需要$ _。value – Gary 2011-05-11 13:17:55

+0

请参阅编辑。 ,你应该把所有这些包含在散列表中。 – mjolinor 2011-05-11 13:40:15

2

看看这对你的作品:

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

感谢manojlds,这让我更接近了一点。从字面上看,$ newVar是$ _。name,$ true是$ _。value(相当于“Allow”)。我这样做的方式,它接受$ _。value的值而不是$ _。name作为参数。使用你的方法接受$ _。name作为我的参数,但不是$ _。value作为值...说法不能将值“System.String”转换为键入[type]。我会继续尝试其他的东西。 – Gary 2011-05-11 13:38:26

+0

当$ - $($ newVar)想要一个字符串时,我得到了你的方法,但它在布尔值上失败,因为它认为它是一个字符串。我相信这是因为整个命令都在引号中。任何指针? – Gary 2011-05-11 14:02:02

+0

@Fantabulum:'iex“MyCommand - $($ _。name):$($ _。value)”'应该可以工作,因为我在我的答案中已经解释过。 +1 @manojlds。 – 2011-05-11 14:08:00

1

我会尝试:

 
$mycmd = "MyCommand -$($newVar):$true" 
& $mycmd 

结果

不能因为符号运营商的工作只是执行没有参数的单个命令,或者脚本块。

+0

谢谢empo的建议,但是这似乎与我原来的行为一样。我可以张贴我的实际脚本的摘录,如果这会有所帮助,但它涉及几个循环和Exchange命令,所以我认为这只会导致混淆。 – Gary 2011-05-11 13:23:29

+0

@Fantabulum:我认为@manojlds是正确的路要走。 – 2011-05-11 14:08:40

0

我有同样的问题,只是发现如何解决它。解决方法是使用invoke-Expression:invoke-Expression $ mycmd 这使用$ mycmd-string替换变量并以给定参数作为cmdlet执行它