Передать переменные в функцию - PullRequest
0 голосов
/ 09 января 2019

У меня есть 2 функции. Функции должны передать несколько ранее объявленных переменных, например:

Function variable1, variable2

Теперь я попытался использовать param с [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 голосов
/ 10 января 2019

Если вы хотите функцию с параметрами, вам нужно определить параметры. Вы также можете использовать каноническую форму «Глагол-Существительное» для названия своей функции (список утвержденных глаголов см. здесь ).

Простой подход:

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

Подробнее Продвинутый Подход:

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

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

Если вы хотите, вы также можете обойтись без параметров и использовать автоматическую переменную $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!
...