2011-07-29 16 views
10

AşağıdakiPowershell'de [alias ("db")] olan parametreli bir komut dosyası oluşturabilir miyim?

[parameter(Mandatory = $true)] 
[alias("db")] 
[string]$database, 

tanımlanırsa bir hata alıyorum

Parameter alias cannot be specified because an alias with the name 'db' 
was defined multiple times for the command. 

db zaten -Debug parametresi için bir takma ad olduğundan, bu doğrudur.
Bu takma ismi değiştirilmeden tanımlanabilir mi?

+2

Powershell bu hatayı verecektir çünkü ayrı bir parametreyi [string]$db define (veya $db için $database adlandırmak) olamaz. Aynı takma adla iki (veya daha fazla) parametreniz var gibi görünüyor. – Richard

cevap

9

Üzgünüz, yapamazsınız. -Debug ortak bir parametredir, bu nedenle -Debug ve -db, yazdığınız işlevler de dahil olmak üzere hemen hemen her şeyde kullanılabilen anahtarlardır. Hata size söylediği gibi, zaten tanımlanmış.

o undefining dolaşmak mümkün olsa bile yerleşik takma adları, o unexpectantly sık -db yerine -Debug kullanan başkası için test-db -db gibi bir çağrının anlamını değiştirir. Hata ayıklama çıktısını etkinleştirmeyi beklerler, farklı bir parametre belirtmezler.

function test-db{ 
    param(
    [parameter(mandatory=$true)] 
    [string]$database) 
    write-host 'database' $database 
    write-debug 'debugging output' 
} 

Şimdi test-db server, test-db -db server ve test-db server -db ile çağrı:

bu işlevi göz önünde bulundurun. İlki, write-debug'u, diğer 2'si ise -db nerede olursa olsun yapmaz. MSDN başına, bu konuda

Parameter 'db' cannot be specified because it conflicts with the parameter alias of the same name for parameter 'Debug'.

için bilgiler Bu çalışması gerekir

In addition to using the AliasAttribute attribute, the Windows PowerShell runtime performs partial name matching, even if no aliases are specified. For example, if your cmdlet has a FileName parameter and that is the only parameter that starts with F, the user could enter Filename, Filenam, File, Fi, or F and still recognize the entry as the FileName parameter.

+1

Teşekkürler, mantıklı (ancak talihsiz). –

+0

Powershell'in her zaman kısmi ad eşleşmeleri yapmasının tam nedeni için, hemen hemen her zaman tam parametre adlarını kullanan komut dosyaları yazarız. Yerleşik parametrelerin kullanımı hakkında daha fazla bilgi için cmdletbinding() özniteliğine bakın. http://blogs.technet.com/b/heyscriptingguy/archive/2012/07/07/weekend-scripter-cmdletbinding-attribute-simplifies-powershell-functions.aspx –

+0

Vay canına, ne kadar aptalca -DB almalı -debug - çünkü, bir -DB parametresi _database_ demek istemez? – fourpastmidnight

-2
function test-db { 
    param(
    [parameter(Mandatory = $true)] 
    [string]$database=[string]$db 
) 
    $PSBoundParameters["database"] 
} 

PS> test-db -database srv 
PS> test-db -db srv 
+1

Bu neden çalışıyor? Belli bir şeyi özlemediğim sürece, belgelenmemiş bir şeye benziyor. –

+1

Bu ayrıca 'test-db srv -db' işlevini de yerine getirir. Burada bir şey yanlış ... –

+1

'$ db' ve' $ database' basımını eklediğinizde, $ db’nin bu şekilde atanmadığını göreceksiniz. '-Debug' için hala kısaydı, bu yüzden -db srv ve srv -db '' srv' hala ilk konumsal parametredir. –

İlgili konular