Aracılığıyla paylaş


Uzaktan Değişkenler Hakkında

Kısa açıklama

Uzak komutlarda yerel ve uzak değişkenlerin nasıl kullanılacağını açıklar.

Uzun açıklama

Uzak bilgisayarlarda çalıştırdığınız komutlarda değişkenleri kullanabilirsiniz. Değişkene bir değer atayın ve değerin yerine değişkenini kullanın.

Varsayılan olarak, uzak komutlardaki değişkenlerin komutu çalıştıran oturumda tanımlandığı varsayılır. Yerel oturumda tanımlanan değişkenler, komutta yerel değişkenler olarak tanımlanmalıdır.

Uzak değişkenleri kullanma

PowerShell, uzak komutlarda kullanılan değişkenlerin komutun çalıştığı oturumda tanımlandığını varsayar.

Bu örnekte $ps değişkeni, Get-WinEvent komutunun çalıştığı geçici oturumda tanımlanır.

Invoke-Command -ComputerName S1 -ScriptBlock {
  $ps = "*PowerShell*"; Get-WinEvent -LogName $ps
}

Komut kalıcı bir oturumda çalıştığında PSSession uzak değişkenin bu oturumda tanımlanması gerekir.

$s = New-PSSession -ComputerName S1
Invoke-Command -Session $s -ScriptBlock {$ps = "*PowerShell*"}
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $ps}

Yerel değişkenleri kullanma

Uzak komutlarda yerel değişkenleri kullanabilirsiniz, ancak değişkenin yerel oturumda tanımlanması gerekir.

PowerShell 3.0'da başlayarak, Using: kapsam değiştiricisini kullanarak uzak komuttaki bir yerel değişkeni tanımlayabilirsiniz.

Using: söz dizimi aşağıdaki gibidir:

$Using:<VariableName>

Aşağıdaki örnekte, $ps değişkeni yerel oturumda oluşturulur, ancak komutun çalıştığı oturumda kullanılır. Using: kapsam değiştiricisi $ps yerel değişken olarak tanımlar.

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  Get-WinEvent -LogName $Using:ps
}

Using: kapsam değiştiricisi bir PSSessioniçinde kullanılabilir.

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $Using:ps}

$Using:var gibi bir değişken başvurusu, çağıranın bağlamındaki değişken $var'in değerine genişletilir. Çağıranın değişken nesnesine erişemezsiniz. Using: kapsam değiştirici, PSSessioniçindeki bir yerel değişkeni değiştirmek için kullanılamaz. Örneğin, aşağıdaki kod çalışmaz:

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {$Using:ps = 'Cannot assign new value'}

Using:hakkında daha fazla bilgi için bkz. about_Scopes

Splatting yöntemini kullanma

PowerShell splatting komutuna parametre adları ve değerleri koleksiyonunu geçirir. Daha fazla bilgi için bkz. about_Splatting.

Bu örnekte, $Splat splatting değişkeni yerel bilgisayarda ayarlanmış bir karma tablodur. Invoke-Command uzaktan bilgisayar oturumuna bağlanır. ScriptBlock,Using:simgesi ile @ kapsam değiştiricisini kullanarak yayılmış değişkeni gösterir.

$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }

Using: kapsam değiştiricisinin gerekli olduğu diğer durumlar

Oturum dışında yürütülen herhangi bir betik veya komut için, çağıran oturum kapsamından değişken değerleri eklemek için Using: kapsam değiştiricisine ihtiyacınız vardır; böylece oturum dışı kod bunlara erişebilir. Using: kapsam değiştiricisi aşağıdaki bağlamlarda desteklenir:

  • Invoke-Command, HostName, SSHConnection veya Oturumu parametreleri (uzak oturum) kullanılarak ile başlatılan uzaktan yürütülen komutlar
  • Start-Job ile başlatılan arka plan işleri (işlem dışı oturum)
  • Start-ThreadJob veya ForEach-Object -Parallel aracılığıyla başlatılan iş parçacığı işleri (ayrı iş parçacığı oturumu)

Kontekste bağlı olarak, gömülü değişken değerleri, çağıranın kapsamındaki verilerin bağımsız kopyaları veya bunlara yapılan referanslar olabilir. Uzak ve işlem dışı oturumlarda bunlar her zaman bağımsız kopyalardır. İş parçacığı oturumlarında bunlar referansla geçirilir.

Değişken değerlerini serileştirme

Uzaktan yürütülen komutlar ve arka plan işleri işlem dışıdır. İşlem dışı oturumlarda, değişkenlerin değerlerini işlem sınırları boyunca kullanılabilir hale getirmek için XML tabanlı serileştirme ve seri durumdan çıkarma kullanılır. Serileştirme işlemi, nesneleri özgün nesne özelliklerini içeren ancak yöntemlerini içermeyen bir PSObject dönüştürür.

Sınırlı sayıda tür için, seri durumdan çıkarma nesneleri özgün türe geri döndürür. Yeniden doldurulan nesne, özgün nesne örneğinin bir kopyasıdır. Tür özelliklerine ve yöntemlerine sahiptir. System.Versiongibi basit türler için kopya birebir olur. Karmaşık türler için kopya kusurludur. Örneğin, yeniden oluşturulan sertifika nesneleri özel anahtarı içermez.

Diğer tüm türlerin örnekleri PSObject örnekleridir. pstypenames özelliği, Seri Durumdan Çıkarılmışön ekli özgün tür adını içerir; örneğin, Deserialized.System.Data.DataTable

ArgumentList parametresiyle yerel değişkenleri kullanma

Uzak komut için parametreler tanımlayarak ve yerel değişkeni parametre değeri olarak belirtmek üzere cmdlet'in Invoke-Command parametresini kullanarak uzak komuttaki yerel değişkenleri kullanabilirsiniz.

  • Uzak komutun parametrelerini tanımlamak için param anahtar sözcüğünü kullanın. Parametre adları, yerel değişkenin adıyla eşleşmesi gerekmeyen yer tutuculardır.

  • komutundaki param anahtar sözcüğü tarafından tanımlanan parametreleri kullanın.

  • Yerel değişkeni parametre değeri olarak belirtmek için cmdlet'in Invoke-Command parametresini kullanın.

Örneğin, aşağıdaki komutlar yerel oturumda $ps değişkenini tanımlar ve ardından bunu uzak bir komutta kullanır. Komut, parametre adı olarak $Log ve değeri olarak $psyerel değişkeni kullanır.

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  param($Log)
  Get-WinEvent -LogName $Log
} -ArgumentList $ps

Ayrıca bakınız