使用可选的调用变量创建一个函数

时间:2012-12-03 16:29:16

标签: function powershell windows-7 parameters

有没有办法在PowerShell函数中创建一个参数,你必须调用它才能考虑它?

由命令行开关给出的示例(粗体是我想要做的):

Invoke-Command -computername Server01 -Scriptblock {...}

这是我想用函数

做的一个例子
Function DoStuff($computername, -arg2, -domain $domain)
    Test-parameter(-domain) if (-domain -eq $true) {
        use $domain
    }
    Else {
        $domain = "Domain1"
    }
    test-parameter($arg2) {
        if ($arg2 -eq $true) {
            Do something
        }
        else {
            Do the opposite
        }
    }

总结如下:

如果存在“-arg2”,我希望在脚本中发生一些事情。如果“-Domain”存在并且有一个参数,我希望使用它而不是set参数。

3 个答案:

答案 0 :(得分:28)

Powershell为常见参数场景提供了大量内置支持,包括强制参数,可选参数,“switch”(aka flag)参数和“参数集”。

默认情况下,所有参数都是可选的。最基本的方法是简单地检查每个$null,然后从那里实现你想要的任何逻辑。这基本上就是您在示例代码中显示的内容。

如果您想了解Powershell可以为您提供的所有特殊支持,请查看以下链接:

about_Functions

about_Functions_Advanced

about_Functions_Advanced_Parameters

答案 1 :(得分:16)

我认为你的问题不是很明确,这段代码假定如果你要包含-domain参数,它总是'命名'(即dostuff computername arg2 -domain domain);这也使得computername参数成为必需参数。

Function DoStuff(){
    param(
        [Parameter(Mandatory=$true)][string]$computername,
        [Parameter(Mandatory=$false)][string]$arg2,
        [Parameter(Mandatory=$false)][string]$domain
    )
    if(!($domain)){
        $domain = 'domain1'
    }
    write-host $domain
    if($arg2){
        write-host "arg2 present... executing script block"
    }
    else{
        write-host "arg2 missing... exiting or whatever"
    }
}

答案 2 :(得分:6)

我不确定我是否正确理解了这个问题。

从我收集的内容中,您希望能够为Domain分配值(如果它为null)以及检查是否提供了$ args2并根据该值执行特定代码?

我更改了代码以重新组合上面的假设。

Function DoStuff($computername, $arg2, $domain)
{
    if($domain -ne $null)
    {
        $domain = "Domain1"
    }

    if($arg2 -eq $null)
    {
    }
    else
    {
    }
}

DoStuff -computername "Test" -arg2 "" -domain "Domain2"
DoStuff -computername "Test" -arg2 "Test"  -domain ""
DoStuff -computername "Test" -domain "Domain2"
DoStuff -computername "Test" -arg2 "Domain2"

这有帮助吗?