如果内联PowerShell命令,如何运行

时间:2014-12-18 21:53:32

标签: powershell

假设我有这个功能;

Function SomeCommand{
    param(
        [string]$Var1,
        [string]$Var2
    )

    # Do Something
}

我可以像这样设置它;

Function SomeCommand{
    param(
        [string]$Var1,
        [string]$Var2
    )

    if ($Var2){
        Do-SomeOtherCommand -SomeParam1 $Var1 -SomeParam2 $Var2
    } else {
        Do-SomeOtherCommand -SomeParam1 $Var1
}

如果我只有一个可选参数,这样可以正常工作,但如果我有两个可选参数,那么它会变得很难。我想做这样的事情;

Function SomeCommand{
    param(
        [string]$Var1,
        [string]$Var2,
        [string]$Var3
    )

    Do-SomeOtherCommand -SomeParam1 $Var1 (if($Var2){-SomeParam2 $Var2}) (if($Var3){-SomeParam3 $Var3})
}

有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:3)

您可能正在寻找splatting。您可以使用您希望传递的参数(及其值)构建哈希表,然后一次性指定整个事物:

function FuncB($param1, $param2)
{
   "FuncB -- param1:[$param1] param2:[$param2]"
}

function FuncA($paramA, $paramB)
{
   $args = @{}
   if ($paramA){ $args['param1'] = $paramA }
   if ($paramB){ $args['param2'] = $paramB }

   FuncB @args
}

测试

FuncA 'first' 'second'
FuncA 'OnlyFirst'
FuncA -paramB 'OnlySecond'

# results
# FuncB -- param1:[first] param2:[second]
# FuncB -- param1:[OnlyFirst] param2:[]
# FuncB -- param1:[] param2:[OnlySecond]

答案 1 :(得分:0)

分号。 PowerShell允许您使用分号作为行终止符。

Write-Output 1;Write-Output 2;Write-Output 3;

我个人认为这应该是强制性的。

答案 2 :(得分:0)

另请注意,您可以将任意表达式构建为简单字符串,然后使用Invoke-Expression(别名iex)来内联调用它。

function FuncB($param1, $param2)
{
   "FuncB -- param1:[$param1] param2:[$param2]"
}

function FuncA($paramA, $paramB)
{
  $funcBCall = "FuncB $(if($paramA){ "-param1 '$paramA'" }) $(if($paramB){ "-param2 '$paramB'" })"
  iex $funcBCall
}

但这种方法非常简陋和脆弱,所以我不推荐它。