将变量传递给函数

时间:2019-01-09 20:43:06

标签: powershell powercli

我有2个功能。函数需要传递一些这样的较早声明的变量:

Function variable1, variable2

现在,我尝试使用[ref]进行参数设置没有成功。

这是其中一个功能的代码。在这种情况下,先前声明的变量为$wincluster$vmhostwin

function deploytemplatewin {
    foreach ($image in $winimage) {
        $templatename =  $image, $wincluster -join "_"
        $vcdatastore = $vc + "_vm_template_01"
        try {
            Get-Template $templatename -ErrorAction Stop;
            $TemplateExists = $true
        } catch {
            $TemplateExists = $false
        }
        if ($TemplateExists -eq $false) {
            Write-Log -Message "$($templatename) template was copied to cluster $($wincluster) on vCenter $($vc)"
            New-VM -Name $templatename -VMHost $vmhostwin -Datastore $vcdatastore -Location (Get-Folder -Name WinTemplates) |
                Set-VM -ToTemplate -Confirm:$false
        } elseif ($TemplateExists -eq $true) {
            Write-Log -Message "Template $($templatename) already existed in cluster $($wincluster) on vCenter $($vc)"
        }
    }
}

最坏的情况是,我可以在函数中明确声明变量,并且可以正常工作。

1 个答案:

答案 0 :(得分:1)

如果要使用带有参数的function,则需要定义参数。您可能还希望对函数名称使用规范的动词名词形式(有关批准的动词列表,请参见here)。

简单方法:

function Deploy-WindowsTemplate($Cluster, $VMHost) {
    foreach ($image in $winimage) {
        $templatename = $image, $Cluster -join "_"
        ...
    }
}

更多advanced方法:

function Deploy-WindowsTemplate {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$true)]
        [string]$Cluster,
        [Parameter(Mandatory=$true)]
        [string]$VMHost
    )

    foreach ($image in $winimage) {
        $templatename = $image, $Cluster -join "_"
        ...
    }
}

如果您愿意,也可以不带参数而使用automatic variable $args,尽管我不建议这样做。

function Deploy-WindowsTemplate {
    foreach ($image in $winimage) {
        $templatename = $image, $args[0] -join "_"
        ...
    }
}

但是,请注意,在调用函数时,参数/参数的值由空格而不是逗号分隔。它们可以作为位置参数传递(默认情况下,按定义参数的顺序)

Deploy-WindowsTemplate $wincluster $vmhostwin

或命名参数

Deploy-WindowsTemplate -Cluster $wincluster -VMHost $vmhostwin

以逗号分隔的值作为单个数组参数传递。

Deploy-WindowsTemplate $wincluster, $vmhostwin
#                      ^^^^^^^^^^^^^^^^^^^^^^^
#                           one argument!