Kapsamlar PowerShell Komut Dosyalarını Nasıl Etkiler?
Toplu komut dosyalarında, ortam değişkenlerinde yapılan değişikliklerin varsayılan olarak geçerli oturuma küresel etkisi vardır. PowerShell için tam tersi doğrudur çünkü kapsamlar bir betiğin değişikliklerini izole etmek için kullanılır. Burada, kapsamların PowerShell scriptlerini nasıl etkilediğini ve bunların içinde ve çevresinde nasıl çalışacağını keşfedeceğiz..
Kapsam nedir?
PowerShell'de bir “kapsam”, bir komut dosyasının veya komut kabuğunun çalıştığı mevcut ortamı belirtir. Kapsamlar, ortamdaki belirli nesneleri istemeden komut dosyaları veya işlevler tarafından değiştirilmekten korumak için kullanılır. Özellikle, aşağıdaki şeyler, bu komutlardaki parametrelerle aksi belirtilmedikçe, başka bir kapsamdan çalıştırılan komutlarla yapılan değişikliklerden korunur:
- Değişkenler
- Takma adlar
- Fonksiyonlar
- PowerShell Sürücüler (PSDrives)
Bir komut dosyası veya işlev çalıştırdığınızda veya yeni bir oturum veya PowerShell örneği oluşturduğunuzda yeni kapsamlar oluşturulur. Komut dosyası ve fonksiyonların çalıştırılmasıyla oluşturulan kapsamlar, oluşturuldukları kapsamla “ebeveyn / çocuk” ilişkisine sahiptir. Özel anlamlara sahip olan ve adlarına göre erişilebilen birkaç kapsam vardır:
- global kapsam, PowerShell başladığında oluşturulan kapsamdır. PowerShell profilinizde bulunanların yanı sıra PowerShell'de yerleşik olan değişkenleri, takma adları, işlevleri ve PSDrives'i içerir.
- Yerel kapsamı, geçerli kapsamın ne olduğu anlamına gelir. PowerShell'i başlattığınızda, Global kapsamına, bir komut dosyasında Komut Dosyası kapsamı vb..
- Senaryo Bir komut dosyası çalıştırıldığında kapsam oluşturulur. Bu kapsamda çalışan tek komut, komut dosyasındaki komutlardır..
- Özel kapsamlar, diğer kapsamlardaki komutların aksi takdirde erişebilecekleri öğeleri okuyabilmelerini veya değiştirmelerini engellemek için mevcut kapsamda tanımlanabilir.
Kapsamlar ayrıca mevcut komutun sıfır olarak adlandırıldığı ve atalarına artan tamsayılarla referans verildiği belirli komutlarda sayı olarak da ifade edilebilir. Örneğin, Global kapsamından çalıştırılan bir komut dosyasında, Script kapsamı 0 olur ve Global kapsam 1 olur. Bir fonksiyon gibi, Script kapsamı içinde daha fazla bulunan bir kapsam, Global kapsamı 2 olarak gösterir. Olumsuz sayılar olsa çocuk kapsamlarına atıfta bulunmayacak - bunun nedeni kısa sürede belli olacak.
Kapsamlar Komutları Nasıl Etkiler?
Daha önce belirtildiği gibi, bir kapsamda yürütülen komutlar, özellikle belirtilmedikçe başka bir kapsamdaki olayları etkilemeyecektir. Örneğin, Global kapsamda $ MyVar varsa ve bir komut dosyası $ MyVar'ı farklı bir değere ayarlamak için bir komut çalıştırırsa, $ MyVar'ın Küresel sürümü $ MyVar'ın bir kopyası Yeni ile birlikte Script kapsamına yerleştirilir değer. Bir $ MyVar mevcut değilse, bir komut dosyası onu Genel olarak değil, varsayılan olarak Komut Dosyası kapsamı içinde oluşturur. Bu, kapsamlar arasındaki gerçek ebeveyn / çocuk ilişkisini öğrenirken hatırlamak önemlidir..
PowerShell'deki kapsamların ebeveyn / çocuk ilişkisi tek yönlüdür. Komutlar mevcut kapsamı, ebeveyni ve bunun üzerindeki kapsamları görebilir ve isteğe bağlı olarak değiştirebilir. Ancak, mevcut kapsamdaki herhangi bir çocuktaki şeyleri göremez veya değiştiremezler. Bunun temel nedeni, bir kez üst kapsama geçtiğinizde, alt kapsamı zaten amacını yerine getirdiği için yok edilmiştir. Örneğin, komut dosyası sonlandırıldıktan sonra, Kod kapsamındaki bir değişkeni Genel kapsamdan neden görmek zorundasınız? Bir betiğin veya fonksiyonun tamamlanmasının ötesine geçmesi için değişiklik yapması gereken birçok durum vardır, ancak betiğin veya fonksiyonun kapsamındaki nesnelerde çalıştırılmadan önce veya sonra değişiklikler yapmanız gerekeceği çok fazla değildir. (Genellikle, böyle şeyler betiğin bir parçası olarak ele alınacak veya işlevini yine de gerçekleştirecektir.)
Tabii ki, istisnasız kurallar nelerdir? Yukarıdakilerin bir istisnası Özel kapsamlardır. Özel kapsamlardaki nesnelere, yalnızca oluşturuldukları kapsamda çalıştırılan komutlara erişilebilir. Bir diğer önemli istisna, AllScope özelliğine sahip öğelerdir. Bunlar, herhangi bir kapsamdaki değişikliğin tüm kapsamları etkileyeceği özel değişkenler ve takma adlardır. Aşağıdaki komutlar, size hangi değişkenlerin ve diğer adların AllScope özelliğine sahip olduğunu gösterecektir:
Değişken Olsun | Where-Object $ _. Options -match 'AllScope' Al-Alias | Where-Object $ _. Options -match 'AllScope')
Eylem Kapsamı
Kapsamdaki eylemlere ilk bakışımız için, $ MyVar değişkeninin komut satırından 'Ben genel bir değişkenim!' Dizgesine ayarlanmış bir PowerShell oturumunda başlayacağız. Ardından, aşağıdaki komut Scope-Demo.ps1 adlı bir dosyadan çalıştırılır:
Function FunctionScope 'Bir işlevle $ MyVar'ı değiştirme.' $ MyVar = 'Bir işleve girdim!' "MyVar $ MyVar diyor" "" $ MyVar'ın şu anki değerini kontrol ediyorum. ' "MyVar $ MyVar diyor" "$ MyVar komut dosyasını değiştirerek. ' $ MyVar = 'Bir komut dosyası ayarladım!' "MyVar $ MyVar" diyor "FunctionScope" Komut dosyası çıkmadan önce MyVar'ın son değerini kontrol ediyorum. ' "MyVar $ MyVar diyor" "
PowerShell komut dosyaları toplu komut dosyalarıyla aynı şekilde çalışırsa, $ global değerim (veya toplu sözdiziminde% MyVar%) değerinin 'Ben bir global değişkenim!' Den 'Bir komut dosyası tarafından belirledim!' , ve son olarak 'Bir işleve girdim!' Açıkça tekrar değiştirilinceye veya oturum sonlandırılıncaya kadar nerede kalacaktı. Bununla birlikte, burada kapsamların her birinde ilerlerken gerçekte neler olduğunu görün - özellikle, FunctionScope işlevi çalışmasını tamamladıktan sonra ve değişkeni tekrar Script'ten ve daha sonra Genel, kapsamdan kontrol ettikten sonra.
Değişkeni komut dosyasında ilerlerken değiştiğini görebildiğiniz için, çünkü FunctionScope işlevi tamamlanana kadar, değişkeni en son değiştirildiği kapsamdan kontrol ettik. FunctionScope yapıldıktan sonra, $ MyVar'ın fonksiyona dokunmadan bırakıldığı Script kapsamına geri döndük. Sonra, senaryo sonlandırıldığında, hiç değiştirilmemiş olan Global kapsamına geri döndük..
Yerel Kapsamın Dışına Ulaşmak
Bu nedenle, yanlışlıkla komut dosyalarınızın ve işlevlerinizin ötesinde çevreye değişiklikler uygulamaktan kaçınmanıza yardımcı olmak için bu gayet iyi ve güzel, ama ya gerçekten böyle bir değişiklik yapmak istiyorsanız? Yerel kapsam dışında nesneler oluşturmak ve değiştirmek için özel ve oldukça basit bir sözdizimi var. Skop adını değişken isminin başına koymanız ve skop ile değişken isimleri arasında bir iki nokta koymanız yeterlidir. Bunun gibi:
$ global: MyVar $ script: MyVar $ yerel: MyVar
Bu değiştiricileri, değişkenleri görüntülerken ve ayarlarken kullanabilirsiniz. Bu gösteri betiğine ne olduğunu görelim:
Function FunctionScope "Yerel işlev kapsamındaki $ MyVar'ı değiştirme ... '$ local: MyVar =" Bu, işlevinin yerel kapsamındaki MyVar. "' Komut kapsamındaki $ MyVar'ı değiştirme ... '$ script: MyVar =' MyVar eskiden bir komut dosyası tarafından ayarlanır. Şimdi bir işlev tarafından ayarlanır. "Genel kapsamda $ MyVar değiştiriliyor ... '$ global: MyVar =' MyVar global kapsamda ayarlandı. Şimdi bir fonksiyonla ayarlayın. "Her kapsamda $ MyVar kontrol ediliyor ... '" Yerel: $ local: MyVar "" Script: $ script: MyVar "" Global: $ global: MyVar "" "$ MyVar'ın şu anki değerini alma.' "MyVar $ MyVar diyor" "$ MyVar komut dosyasını değiştirerek. ' $ MyVar = 'Bir komut dosyası ayarladım!' "MyVar $ MyVar diyor" FunctionScope 'Çıkmadan önce script kapsamından $ MyVar kontrol ediliyor.' "MyVar $ MyVar diyor" "
Daha önce olduğu gibi, değişkeni Genel kapsamda ayarlayarak başlayacağız ve son Genel kapsam sonucunu kontrol ederek sonlandıracağız.
Burada, FunctionScope'un Script kapsamındaki değişkeni değiştirebildiğini ve değişikliklerin tamamlandıktan sonra da sürdüğünü görebilirsiniz. Ayrıca, Global kapsamdaki değişkene yapılan değişiklik, senaryodan çıktıktan sonra bile devam etti. Bu, bir betiğin içinde veya Genel kapsam dahilinde, aynı kodu kullanarak değişkenleri art arda değiştirmek zorunda kalmanız durumunda özellikle yararlı olabilir - sadece değişkeni nerede ve nasıl yapmanız gerektiğini değiştirmek için yazılan bir işlevi veya betiği tanımlarsınız ve bu değişiklikler gerektiğinde bunu çağırın.
Daha önce de belirtildiği gibi, kapsam komut numaraları, değişkenleri Yerel kapsam ile ilgili olarak farklı seviyelerde değiştirmek için belirli komutlarda da kullanılabilir. İşte yukarıdaki ikinci örnekte kullanılan aynı komut dosyası, ancak değişkene adlandırılmış kapsamlarla doğrudan başvuru yapmak yerine Get Değişken ve Küme Değişken komutlarını kullanacak şekilde değiştirilmiş işlev:
Function FunctionScope "FunctionScope… 'e göre 0 kapsamındaki $ MyVar'ı değiştirme ...' Set-Variable MyVar" Fonksiyonun kapsamı 0 'da MyVar' dır. "-Scope 0 'FunctionScope…' a göre 1 kapsamındaki $ MyVar 'ı değiştirme ...' Set-Variable MyVar 'MyVar, bir işlevden 1. kapsamda değiştirildi.' -Scope 1 'Functioncope'a göre kapsam 2'de $ MyVar'ı değiştirme…' Set-Variable MyVar 'MyVar, bir işlevden kapsam 2'de değiştirildi.' -Scope 2 "Her kapsamda $ MyVar kontrol ediliyor ..." Kapsam 0: 'Get-Variable MyVar -Scope 0 -ValueOnly' Kapsam 1: 'Get-Variable MyVar -Scope 1 -ValueOnly' Kapsam 2: 'Get-Variable MyVar -Scope 1 -ValueOnly' Kapsam 2: 'Get-Variable MyVar -Scope 2 -ValueOnly "" $ MyVar'ın geçerli değerini alma. ' "MyVar $ MyVar diyor" "$ MyVar komut dosyasını değiştirerek. ' $ MyVar = 'Bir komut dosyası ayarladım!' "MyVar $ MyVar diyor" FunctionScope 'Çıkmadan önce script kapsamından $ MyVar kontrol ediliyor.' "MyVar $ MyVar diyor" "
Daha önce olduğu gibi, burada bir kapsamdaki komutların üst kapsamındaki nesneleri nasıl değiştirebileceğini görebiliriz..
ek bilgi
Hala, bu makaleye sığabilecek kadar kapsamlarla yapılabilecek daha çok şey var. Kapsamlar değişkenlerden daha fazlasını etkiler ve Özel kapsamlar ve AllScope değişkenleri hakkında hala öğrenilmesi gereken daha çok şey vardır. Daha yararlı bilgiler için, aşağıdaki komutu PowerShell içinden çalıştırabilirsiniz:
_Scopes hakkında Yardım Alın
Aynı yardım dosyası TechNet’te de mevcuttur.
Kapsam resim kredisi: openclipart üzerindeki spadassin