你能声明一个参数,为一个具有不同名称的变量赋值吗?

时间:2013-02-28 21:58:11

标签: powershell

声明参数时,提供变量的名称,该名称将用作命令行上参数的名称。但是,我并不总是希望对脚本变量使用与命令行参数名称相同的命名约定。

例如:

function Some-Function {
  param (
    $some_variable
  )
  ...
}

调用Some-Function -some_variable <value>分配给$ some_variable。如果我想在调用函数时使用的参数名称与我在函数体中使用的变量名称不同,该怎么办?例如,调用Some-Function -ElegantName <value>会分配给一个名为$ some_variable的变量吗?

当然,我可以这样做:

Some-Function {
  param (
    $ElegantName
  )
  $some_variable = $ElegantName
}

但这似乎是一个丑陋的kludge,在参数声明中声明一组变量,然后将它们重新分配给新变量,因此脚本中的变量不必与参数具有相同的名称。有没有办法在声明中做到这一点?

请注意,[alias('ElegantName')]$some_variable不是一个好的解决方案,因为“some_variable”仍然是标签完成中显示的名称。

2 个答案:

答案 0 :(得分:1)

好的,我决定用其别名替换实际变量名,不要触及现有代码。例如,它是:

[Parameter(Mandatory=$false)][alias("ServiceAccount")][string]$svc_user='somedata'

它变成了:

[Parameter(Mandatory=$false)][alias("svc_user")][string]$ServiceAccount='somedata'

UPD。 不幸的是,这不起作用 - 代码中无法识别别名。我不得不添加更多代码来自动创建带别名的变量并为其分配原始值:

$standardparameters = @("Verbose", "Debug", "ErrorAction", "WarningAction", "ErrorVariable", "WarningVariable","OutVariable","OutBuffer","PipelineVariable")
$allparameters = ((Get-Command -Name $MyInvocation.InvocationName).Parameters).values  
$customparameters = @()
 ForEach ($par in $allparameters) { if ($par.name -notin $standardparameters) {$customparameters += $par}}
ForEach ($par in $customparameters) { foreach ($al in $par.Aliases) {try{Set-Variable -Name $al -Value $(Get-Variable $par.Name -ValueOnly) -ErrorAction stop} Catch {new-Variable -Name $al -Value $(Get-Variable $par.Name -ValueOnly)}}}

请注意,代码只能在启动脚本或函数本身时执行。如果您尝试选择代码并启动选择,则会收到错误。

答案 1 :(得分:0)

您可以使用高级参数,这是一个例子,其中我为“file”的法语参数名称别名:

Function TestAdvParam
{
  Param ([Alias("Fichier")]
         [string]
         [ValidateNotNullOrEmpty()]
         $file)
  Write-Host $file
}

TestAdvParam -file "coucou 1"
TestAdvParam -fichier "coucou 2"

查看about_functions_advanced_parameters(获取帮助)

注意:别名的目标是给出一个易于记忆或用于开发者的名称,因此它们不会出现在自动完成中并不奇怪。