1

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

例如:

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
}

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

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

4

2 回答 2

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)}}}

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

于 2017-08-09T11:44:23.840 回答
0

您可以使用高级参数,这是一个示例,我将法语参数名称命名为 "file" :

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

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

看看about_functions_advanced_pa​​rameters (get-help)

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

于 2013-03-01T04:25:14.743 回答