我有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)"
}
}
}
最坏的情况是,我可以在函数中明确声明变量,并且可以正常工作。
答案 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!