Aracılığıyla paylaş


about_Methods

Kısa açıklama

PowerShell'de nesneler üzerinde eylemler gerçekleştirmek için yöntemlerin nasıl kullanılacağını açıklar.

Uzun açıklama

PowerShell, veri depolarındaki öğeleri veya bilgisayarın durumunu göstermek için nesneleri kullanır. Örneğin, FileInfo nesneleri dosya sistemi sürücülerindeki dosyaları, ProcessInfo nesneleri ise bilgisayardaki işlemleri temsil eder.

Nesneler, nesneyle ilgili verileri depolayan özelliklere ve nesneyi değiştirmenize olanak tanıyan yöntemlere sahiptir.

"Yöntem", nesne üzerinde gerçekleştirebileceğiniz bir eylemi belirten bir yönerge kümesidir. Örneğin, FileInfo nesnesi, CopyTo nesnesinin temsil ettiği dosyayı kopyalayan FileInfo yöntemini içerir.

Herhangi bir nesnenin yöntemlerini almak için Get-Member cmdlet'ini kullanın. "Method" değeriyle MemberType özelliğini kullanın. Aşağıdaki komut, işlem nesnelerinin yöntemlerini alır.

Get-Process | Get-Member -MemberType Method
TypeName: System.Diagnostics.Process

Name                      MemberType Definition
----                      ---------- ----------
BeginErrorReadLine        Method     System.Void BeginErrorReadLine()
BeginOutputReadLine       Method     System.Void BeginOutputReadLine()
...
Kill                      Method     System.Void Kill()
Refresh                   Method     System.Void Refresh()
Start                     Method     bool Start()
ToString                  Method     string ToString()
WaitForExit               Method     bool WaitForExit(int milliseconds), ...
WaitForInputIdle          Method     bool WaitForInputIdle(int millisecon...

Bir nesnenin yöntemini gerçekleştirmek veya "çağırmak" için bir nokta (.), yöntem adı ve "()" parantez kümesi yazın. Yöntemin bağımsız değişkenleri varsa, bağımsız değişken değerlerini parantez içine yerleştirin. Bağımsız değişken olmadığında bile her yöntem çağrısı için parantezler gereklidir. Yöntemi birden çok bağımsız değişken alırsa, bunlar virgülle ayrılmalıdır.

Örneğin, aşağıdaki komut bilgisayardaki Not Defteri işlemini sonlandırmak için işlemlerin Kill yöntemini çağırır.

$notepad = Get-Process notepad
$notepad.Kill()

Bu örnek, yukarıdaki deyimler birleştirilerek kısaltılabilir.

(Get-Process Notepad).Kill()

Get-Process komutu, Kill yöntemi çağrılmadan önce çalıştığından emin olmak için parantez içine alınır. Kill yöntemi daha sonra döndürülen Process nesnesinde çağrılır.

Bir diğer kullanışlı yöntem de dizelerin Replace yöntemidir. Replace yöntemi, bir dize içindeki metnin yerini alır. Aşağıdaki örnekte nokta (.) dizenin bitiş tırnak işaretinden hemen sonra yerleştirilebilir.

'this is rocket science'.Replace('rocket', 'rock')
this is rock science

Önceki örneklerde gösterildiği gibi, komutu, değişkendeki bir nesneyi veya nesneyle sonuçlanabilecek herhangi bir şeyi (tırnak içindeki bir dize gibi) kullanarak aldığınız nesne üzerinde bir yöntem çağırabilirsiniz.

PowerShell 4.0'dan başlayarak, dinamik yöntem adları kullanılarak yöntem çağırma desteklenir.

Yöntemler hakkında bilgi edinme

Bir nesnenin yöntemlerinin tanımlarını bulmak için, nesne türü için yardım konusuna gidin ve yöntemler sayfasını arayın. Örneğin, aşağıdaki sayfada System.Diagnostics.Process işlem nesnelerinin yöntemleri açıklanmaktadır.

Bir yöntemin bağımsız değişkenlerini belirlemek için, PowerShell cmdlet'inin söz dizimi diyagramına benzeyen yöntem tanımını gözden geçirin.

Yöntem tanımında, PowerShell cmdlet'lerinin parametre kümeleri gibi bir veya daha fazla yöntem imzası olabilir. İmzalar, yöntemini çağırmak için geçerli tüm komut biçimlerini gösterir.

Örneğin, CopyTo sınıfının FileInfo yöntemi aşağıdaki iki yöntem imzasını içerir:

    CopyTo(String destFileName)
    CopyTo(String destFileName, Boolean overwrite)

İlk yöntem imzası hedef dosya adını (ve bir yolu) alır. Aşağıdaki örnek, CopyTo dosyasını Final.txt dizinine kopyalamak için ilk C:\Bin yöntemini kullanır.

(Get-ChildItem C:\final.txt).CopyTo("C:\bin\final.txt")

Not

PowerShell'in bağımsız değişkeni modundan farklı olarak nesne yöntemleri, PowerShell'in üzerinde oluşturulduğu .NET çerçevesine geçiş olan ifade modunda yürütülür. ifadede modunda bağımsız değişkenlerine (tırnaksız dizeler) izin verilmez. Bu farkı, yolu parametre olarak kullanırken ve yolu bağımsız değişken olarak kullanırken görebilirsiniz. about_Parsing'de ayrıştırma modları hakkında daha fazla bilgi edinebilirsiniz

İkinci yöntem imzası bir hedef dosya adı ve zaten varsa hedef dosyanın üzerine yazılıp yazılmayacağını belirleyen bir Boole değeri alır.

Aşağıdaki örnek, CopyTo dosyasını Final.txt dizinine kopyalamak ve var olan dosyaların üzerine yazmak için ikinci C:\Bin yöntemini kullanır.

(Get-ChildItem C:\final.txt).CopyTo("C:\bin\final.txt", $true)

Üye erişim sabit listesi

PowerShell 3.0'dan başlayarak, bir liste koleksiyonunda bulunmayan bir yönteme erişmek için üye erişim işlecini (.) kullandığınızda, PowerShell koleksiyondaki öğeleri otomatik olarak numaralandırır ve her öğede yöntemini çağırır. Daha fazla bilgi için bkz. about_Member-Access_Enumeration.

Örnekler

Aşağıdaki örnek, bir nesne koleksiyonundaki tek tek işlem nesnelerinin Kill yöntemini çalıştırır.

İlk komut, Not Defteri işleminin üç örneğini başlatır. Get-Process, Not Defteri işleminin üç örneğini de alır ve bunları $p değişkenine kaydeder.

Notepad; Notepad; Notepad
$p = Get-Process Notepad
$p.Count
3

Sonraki komut, değişkenindeki üç işlemde de $p yöntemini çalıştırır. Bu komut, bir işlem koleksiyonunun Kill yöntemi olmasa bile çalışır.

$p.Kill()
Get-Process Notepad

Get-Process komutu, Kill yönteminin çalıştığını onaylar.

Get-Process : Cannot find a process with the name "notepad". Verify the proc
ess name and call the cmdlet again.
At line:1 char:12
+ Get-Process <<<<  notepad
    + CategoryInfo          : ObjectNotFound: (notepad:String) [Get-Process]
, ProcessCommandException
    + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShel
l.Commands.GetProcessCommand

Bu örnek, yöntemini koleksiyondaki her nesnede çalıştırmak için ForEach-Object cmdlet'ini kullanmaya işlevsel olarak eşdeğerdir.

$p | ForEach-Object {$_.Kill()}

ForEach ve Where yöntemleri

PowerShell 4.0'da başlayarak, yöntem söz dizimi kullanılarak koleksiyon filtrelemesi desteklenir. Bu, ForEach ve Wherekoleksiyonlarla ilgilenirken iki yeni yöntemin kullanılmasına izin verir.

Bu yöntemler hakkında daha fazla bilgiyi about_Arrays

Birden çok aşırı yükleme olduğunda belirli bir yöntemi çağırma

.NET yöntemlerini çağırırken aşağıdaki senaryoyu göz önünde bulundurun. Bir yöntem bir nesneyi alır ancak daha belirli bir tür alan bir arabirim aracılığıyla aşırı yüklenmişse, PowerShell nesneyi açıkça bu arabirime atamadığınız sürece nesneyi kabul eden yöntemi seçer.

Add-Type -TypeDefinition @'

   // Interface
   public interface IFoo {
     string Bar(int p);
   }

   // Type that implements the interface
   public class Foo : IFoo {

   // Direct member method named 'Bar'
   public string Bar(object p) { return $"object: {p}"; }

   // *Explicit* implementation of IFoo's 'Bar' method().
   string IFoo.Bar(int p) {
       return $"int: {p}";
   }

}
'@

Bu örnekte, object yönteminin daha az özel aşırı yüklemesi seçilmişti.

[Foo]::new().Bar(1)
object: 1

Bu örnekte, Bar yönteminin daha belirgin aşırı yüklemesini seçmek için yöntemini IFoo arabirimine dönüştüreceğiz.

([IFoo] [Foo]::new()).Bar(1)
int: 1

Hangi aşırı yüklemenin kullanıldığını bulma

PowerShell 7.6'da başlayarak, izlemeyi kullanarak MethodInvocation PowerShell'in hangi yöntem aşırı yüklemesini seçtiğini görebilirsiniz.

Aşağıdaki örnekler, String.Split yöntemi çağrılırken seçilen aşırı yüklemeyi görüntülemek için kullanılırTrace-Command.

Trace-Command -PSHost -Name MethodInvocation -Expression {
    "a 1 b 1 c 1 d".Split(1)
}

İlk örnekte, tamsayı 1 yerine bir [char][string]öğesine dönüştürüldü ve bu da dizenin dizesi "1"yerine tarafından [char]1 bölünmesine neden oldu.

DEBUG: ... MethodInvocation Information: 0 : Invoking method: string[] Spli
t(char separator, System.StringSplitOptions options = System.StringSplitOpt
ions.None)

a 1 b 1 c 1 d

İkinci örnekte, Split() yöntemi dizesiyle "1"çağrılır.

Trace-Command -PSHost -Name MethodInvocation -Expression {
    "a 1 b 1 c 1 d".Split("1")
}

PowerShell, ayırıcı alan [string] aşırı yüklemeyi seçti.

DEBUG: ... MethodInvocation Information: 0 : Invoking method: string[] Spli
t(string separator, System.StringSplitOptions options = System.StringSplitO
ptions.None)

a
 b
 c
 d

Dosya sistemi yollarını kullanan .NET yöntemlerini kullanma

PowerShell, işlem başına birden çok çalışma alanı destekler. Her çalışma alanının kendi geçerli dizinivardır. Bu, geçerli işlemin çalışma diziniyle aynı değildir: [System.Environment]::CurrentDirectory.

.NET yöntemleri işlem çalışma dizinini kullanır. PowerShell cmdlet'leri Runspace konumunu kullanır. Ayrıca. .NET yöntemleri PowerShell Yolu nesneleriyle değil yalnızca yerel dosya sistemi yollarıyla çalışır. PowerShell yollarını .NET yöntemleriyle kullanmak için, .NET yöntemine geçirmeden önce dosya sistemi yerel yolunu çözümlemeniz gerekir.

Ayrıca bakınız