Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Kısa açıklama
PowerShell'deki komutlara parametre geçirmek için splatting'in nasıl kullanılacağını açıklar.
Uzun açıklama
Splatting, bir parametre değerleri koleksiyonunu bir bütün olarak bir komuta geçirme yöntemidir. PowerShell koleksiyondaki her değeri bir komut parametresiyle ilişkilendirir. Splatted parametre değerleri, standart değişkenler gibi görünen ancak dolar işareti (@) yerine At simgesi ($) ile başlayan adlandırılmış splatting değişkenlerinde depolanır. At simgesi PowerShell'e tek bir değer yerine bir değer koleksiyonu geçirdiğiniz bildirir.
Splatting, komutlarınızın daha kısa ve okunup anlaşılmasını kolaylaştırır. Splatting değerlerini farklı komut çağrılarında yeniden kullanabilir ve parametre değerlerini $PSBoundParameters otomatik değişkenden diğer betiklere ve işlevlere geçirmek için splatting kullanabilirsiniz.
Windows PowerShell 3.0'da başlayarak, bir komutun tüm parametrelerini göstermek için splatting de kullanabilirsiniz.
Sözdizimi
<CommandName> <optional parameters> @<HashTable> <optional parameters>
<CommandName> <optional parameters> @<Array> <optional parameters>
Parametre adlarının gerekli olmadığı konumsal parametreler için parametre değerleri sağlamak için dizi söz dizimini kullanın. Parametre adı ve değer çiftlerini belirtmek için karma tablo söz dizimini kullanın. Sıçramış değer parametre listesinin herhangi bir yerinde görünebilir.
Splatting yaparken, parametrelerin tamamını geçirmek için bir karma tablo veya dizi kullanmanız gerekmez. Splatting kullanarak bazı parametreleri aktarabilir ve diğerlerini konum ya da parametre adına göre aktarabilirsiniz. Ayrıca, her parametre için birden fazla değer geçirmemek amacıyla tek bir komutla birden fazla nesneyi birlikte kullanabilirsiniz.
PowerShell 7.1 itibarıyla, komutta açık bir şekilde bir parametre tanımlayarak splat edilmiş bir parametreyi geçersiz kılabilirsiniz.
Karma tablolarla sıçrama
Parametre adı ve değer çiftlerini yaymak için bir karma tablo kullanın. Konumsal ve anahtar parametreleri de dahil olmak üzere tüm parametre türleri için bu biçimi kullanabilirsiniz. Konumsal parametreler isimle atanmalıdır.
Aşağıdaki örnekler, Test.txt dosyasını aynı dizindeki Test2.txt dosyasına kopyalayan iki Copy-Item komutu karşılaştırır.
İlk örnek, parametre adlarının eklendiği geleneksel biçimi kullanır.
Copy-Item -Path "test.txt" -Destination "test2.txt" -WhatIf
İkinci örnek, karma tablo `splatting` tekniğini kullanır. İlk komut parametre-adı ve parametre-değer çiftlerinden oluşan bir karma tablo oluşturur ve bunu $HashArguments değişkeninde depolar. İkinci komut, splatting tekniğini kullanarak bir komutta $HashArguments değişkenini kullanır. At simgesi (@HashArguments) komutundaki dolar işaretinin ($HashArguments) yerini alır.
WhatIf anahtar parametresi için bir değer sağlamak için $true veya $falsekullanın.
$HashArguments = @{
Path = "test.txt"
Destination = "test2.txt"
WhatIf = $true
}
Copy-Item @HashArguments
Not
İlk komutta, At simgesi (@) bir karma tabloyu gösterir, açılmış bir değeri değil. PowerShell'de karma tabloların söz dizimi şöyledir: @{<name>=<value>; <name>=<value>; ...}
Dizilerle sıçrama
Parametre adları gerektirmeyen konumsal parametrelerin değerlerini splatmak için bir dizi kullanın. Değerler dizideki konum-sayı sırasına göre olmalıdır.
Aşağıdaki örnekler, Test.txt dosyasını aynı dizindeki Test2.txt dosyasına kopyalayan iki Copy-Item komutu karşılaştırır.
İlk örnek, parametre adlarının atlandığı geleneksel biçimi kullanır. Parametre değerleri, komutunda konum sırasına göre görüntülenir.
Copy-Item "test.txt" "test2.txt" -WhatIf
İkinci örnekte dizi yayılımı kullanılır. İlk komut parametre değerlerinin bir dizisini oluşturur ve $ArrayArguments değişkeninde depolar. Değerler dizideki konum sırasına göredir. İkinci komut, splatting komutunda $ArrayArguments değişkenini kullanır. At simgesi (@ArrayArguments) komutundaki dolar işaretinin ($ArrayArguments) yerini alır.
$ArrayArguments = "test.txt", "test2.txt"
Copy-Item @ArrayArguments -WhatIf
ArgumentList parametresini kullanma
Çeşitli cmdlet'ler, parametre değerlerini cmdlet tarafından yürütülen bir betik bloğuna geçirmek için kullanılan bir ArgumentList parametresine sahiptir. ArgumentList parametresi betik bloğuna geçirilen bir değer dizisi alır. PowerShell, değerleri betik bloğunun parametrelerine bağlamak için dizi sıçramasını etkili bir şekilde kullanıyor. ArgumentListkullanırken, bir diziyi tek bir parametreye bağlı tek bir nesne olarak geçirmeniz gerekiyorsa, diziyi başka bir dizinin tek öğesi olarak sarmalamanız gerekir.
Aşağıdaki örnekte, dize dizisi olan tek bir parametreyi alan bir betik bloğu vardır.
$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
param([string[]]$Words) $Words -join ' '
} -ArgumentList $array
Bu örnekte, betik bloğuna yalnızca içindeki $array ilk öğe geçirilir.
Hello
$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
param([string[]]$Words) $Words -join ' '
} -ArgumentList (,$array)
Bu örnekte, $array dizinin tamamı betik bloğuna tek bir nesne olarak geçirilecek şekilde bir diziye sarmalanmıştır.
Hello World!
Örnekler
Örnek 1: Farklı komutlarda 'splatted' parametreleri yeniden kullanma
Bu örnek, farklı komutlarda sıçratılmış değerlerin nasıl tekrar kullanılacağını göstermektedir. Bu örnekteki komutlar, konak program konsoluna ileti yazmak için Write-Host cmdlet'ini kullanır. Ön plan ve arka plan renklerini belirtmek için splatting tekniğini kullanır.
Tüm komutların renklerini değiştirmek için $Colors değişkeninin değerini değiştirmeniz gerekir.
İlk komut parametre adları ve değerlerinden oluşan bir karma tablo oluşturur ve karma tablosunu $Colors değişkeninde depolar.
$Colors = @{ForegroundColor = "black"; BackgroundColor = "white"}
İkinci ve üçüncü komutlar, $Colors komutunda kullanılmak üzere Write-Host değişkenini yaymak için kullanır.
$Colors variablekullanmak için dolar işaretini ($Colors) At simgesi (@Colors) ile değiştirin.
#Write a message with the colors in $Colors
Write-Host "This is a test." @Colors
#Write second message with same colors. The position of splatted
#hash table does not matter.
Write-Host @Colors "This is another test."
Örnek 2: $PSBoundParameters kullanarak parametreleri iletme
Bu örnekte, splatting ve $PSBoundParameters otomatik değişkeni kullanarak parametrelerini diğer komutlara nasıl iletecekleri gösterilmektedir.
$PSBoundParameters otomatik değişkeni, bir betik veya işlev çalıştırıldığında kullanılan tüm parametre adlarını ve değerlerini içeren bir sözlük nesnesidir (System.Collections.Generic.Dictionary).
Aşağıdaki örnekte, bir betik veya işleve geçirilen parametre değerlerini $PSBoundParameters işlevden Test2 işlevine iletmek için Test1 değişkenini kullanırız.
Test1'den Test2 işlevine yapılan her iki çağrı da splatting kullanır.
function Test1
{
param($a, $b, $c)
"a = $a"
"b = $b"
"c = $c"
}
function Test2
{
param($a, $b, $c)
#Call the Test1 function with $a, $b, and $c.
Test1 @PSBoundParameters
#Call the Test1 function with $b and $c, but not with $a
Test1 -b $PSBoundParameters.b -c $PSBoundParameters.c
}
Test2 -a 1 -b 2 -c 3
a = 1
b = 2
c = 3
a =
b = 2
c = 3
Örnek 3: Açıkça tanımlanmış parametrelerle sıçramış parametreleri geçersiz kılma
Bu örnek, açıkça tanımlanmış parametreler kullanılarak bir "splatted" (dağılmış) parametrenin nasıl değiştirilebileceğini göstermektedir. Bu, yeni bir karma tablo oluşturmak veya genişletmek için kullandığınız karma tablodaki bir değeri değiştirmek istemediğinizde kullanışlıdır.
$commonParams değişkeni, East US konumunda sanal makine oluşturmak için parametreleri depolar.
$allVms değişkeni oluşturulacak sanal makinelerin listesidir. Listede döngü yapıyoruz ve $commonParams kullanarak parametreleri splatlayarak her sanal makineyi oluşturuyoruz. Ancak, myVM2 diğer sanal makinelerden farklı bir bölgede oluşturulmasını istiyoruz.
$commonParams hashtable'ını ayarlamak yerine, içindeki New-AzVm anahtarının değerinin üzerine yazarak Location'te $commonParams parametresini açıkça tanımlayabilirsiniz.
$commonParams = @{
ResourceGroupName = "myResourceGroup"
Location = "East US"
VirtualNetworkName = "myVnet"
SubnetName = "mySubnet"
SecurityGroupName = "myNetworkSecurityGroup"
PublicIpAddressName = "myPublicIpAddress"
}
$allVms = @('myVM1','myVM2','myVM3',)
foreach ($vm in $allVms)
{
if ($vm -eq 'myVM2')
{
New-AzVm @commonParams -Name $vm -Location "West US"
}
else
{
New-AzVm @commonParams -Name $vm
}
}
Örnek 4: Tek bir komutta birden çok dağıtılmış nesne kullanma
Tek bir komutta birden çok sıçramış nesne kullanabilirsiniz. Bu örnekte, farklı parametreler ayrı karma tablolarda tanımlanır. Karma tablolar tek bir Write-Host komutunda birleştirilmiştir.
$a = @{
Message = 'Hello', 'World!'
}
$b = @{
Separator = '|'
}
$c = @{
BackgroundColor = 'Cyan'
ForegroundColor = 'Black'
}
Write-Host @a @b @c
Komut parametrelerinin sıçraması
Bir komutun parametrelerini temsil etmek için 'splatting' (parametre yayma tekniği) kullanabilirsiniz. Bu teknik, başka bir komutu çağıran bir proxy işlevi, yani bir işlev oluştururken kullanışlıdır. Bu özellik Windows PowerShell 3.0'da kullanıma sunulmuştur.
Bir komutun parametrelerini genişletmek için, komut parametrelerini temsil etmek amacıyla @args kullanın. Bu teknik, komut parametrelerini numaralandırmaktan daha kolaydır ve çağrılan komutun parametreleri değişse bile düzeltme olmadan çalışır.
Özellik, atanmamış tüm parametre değerlerini içeren $args otomatik değişkenini kullanır.
Örneğin, aşağıdaki işlev Get-Process cmdlet'ini çağırır. Bu işlevde, @argsGet-Process cmdlet'in tüm parametrelerini temsil eder.
function Get-MyProcess { Get-Process @args }
Get-MyProcess işlevini kullandığınızda, atanmamış tüm parametreler ve parametre değerleri, aşağıdaki komutlarda gösterildiği gibi @args'a geçirilir.
Get-MyProcess -Name powershell
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
463 46 225484 237196 719 15.86 3228 powershell
Get-MyProcess -Name powershell_ise -FileVersionInfo
ProductVersion FileVersion FileName
-------------- ----------- --------
6.2.9200.16384 6.2.9200.1638... C:\Windows\system32\WindowsPowerShell\...
@args açıkça parametreler bildirmiş bir işlevde kullanabilirsiniz. İşlevde birden çok kez kullanabilirsiniz, ancak girdiğiniz tüm parametreler, aşağıdaki örnekte gösterildiği gibi tüm @argsörneklerine geçirilir.
function Get-MyCommand
{
param ([switch]$P, [switch]$C)
if ($P) { Get-Process @args }
if ($C) { Get-Command @args }
}
Get-MyCommand -P -C -Name powershell
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
50 112.76 78.52 16.64 6880 1 powershell
Path : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Extension : .exe
Definition : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Source : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Version : 10.0.22621.3085
Visibility : Public
OutputType : {System.String}
Name : powershell.exe
CommandType : Application
ModuleName :
Module :
RemotingCapability : PowerShell
Parameters :
ParameterSets :
HelpUri :
FileVersionInfo : File: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
InternalName: POWERSHELL
OriginalFilename: PowerShell.EXE.MUI
FileVersion: 10.0.22621.1 (WinBuild.160101.0800)
FileDescription: Windows PowerShell
Product: Microsoft® Windows® Operating System
ProductVersion: 10.0.22621.1
Debug: False
Patched: False
PreRelease: False
PrivateBuild: False
SpecialBuild: False
Language: English (United States)
Notes
CmdletBinding veya Parameter özniteliklerini kullanarak bir işlevi gelişmiş bir işleve dönüştürürseniz, $args otomatik değişkeni artık işlevde kullanılamaz. Gelişmiş işlevler için açık parametre tanımı gerekir.
PowerShell İstenen Durum Yapılandırması (DSC), 'splatting' kullanacak şekilde tasarlanmamıştır. Splatting kullanarak değerleri bir DSC kaynağına aktaramazsınız. Daha fazla bilgi için DSC Resources Pseudo-Splatting Gael Colas'ın makalesine bakın.
Ayrıca bakınız
PowerShell