Bagikan melalui


about_Methods

Deskripsi singkat

Menjelaskan cara menggunakan metode untuk melakukan tindakan pada objek di PowerShell.

Deskripsi panjang

PowerShell menggunakan objek untuk mewakili item di penyimpanan data atau status komputer. Misalnya, objek FileInfo mewakili file dalam drive sistem file dan objek ProcessInfo mewakili proses di komputer.

Objek memiliki properti, yang menyimpan data tentang objek, dan metode yang memungkinkan Anda mengubah objek.

"Metode" adalah serangkaian instruksi yang menentukan tindakan yang dapat Anda lakukan pada objek. Misalnya, objek FileInfo menyertakan metode CopyTo yang menyalin file yang diwakili objek FileInfo.

Untuk mendapatkan metode objek apa pun, gunakan cmdlet Get-Member. Gunakan properti MemberType dengan nilai "Metode". Perintah berikut mendapatkan metode objek proses.

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...

Untuk melakukan atau "memanggil" metode objek, ketik titik (.), nama metode, dan sekumpulan tanda kurung "()". Jika metode memiliki argumen, tempatkan nilai argumen di dalam tanda kurung. Tanda kurung diperlukan untuk setiap panggilan metode, bahkan ketika tidak ada argumen. Jika metode mengambil beberapa argumen, mereka harus dipisahkan oleh koma.

Misalnya, perintah berikut memanggil metode Kill proses untuk mengakhiri proses Notepad di komputer.

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

Contoh ini dapat dipersingkat dengan menggabungkan pernyataan di atas.

(Get-Process Notepad).Kill()

Perintah Get-Process diapit dalam tanda kurung untuk memastikan bahwa perintah berjalan sebelum metode Kill dipanggil. Metode Kill kemudian dipanggil pada objek Process yang dikembalikan.

Metode lain yang sangat berguna adalah metode Replace string. Metode Replace, menggantikan teks dalam string. Dalam contoh di bawah ini, titik (.) dapat ditempatkan segera setelah kutipan akhir string.

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

Seperti yang ditunjukkan pada contoh sebelumnya, Anda dapat memanggil metode pada objek yang Anda dapatkan dengan menggunakan perintah, objek dalam variabel, atau apa pun yang menghasilkan objek (seperti string dalam tanda kutip).

Dimulai di PowerShell 4.0, pemanggilan metode dengan menggunakan nama metode dinamis didukung.

Mempelajari tentang metode

Untuk menemukan definisi metode objek, buka topik bantuan untuk jenis objek dan cari halaman metodenya. Misalnya, halaman berikut menjelaskan metode objek proses System.Diagnostics.Process.

Untuk menentukan argumen metode, tinjau definisi metode, yang seperti diagram sintaks cmdlet PowerShell.

Definisi metode mungkin memiliki satu atau beberapa tanda tangan metode, yang seperti set parameter cmdlet PowerShell. Tanda tangan menunjukkan semua format perintah yang valid untuk memanggil metode .

Misalnya, metode CopyTo kelas FileInfo berisi dua tanda tangan metode berikut:

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

Tanda tangan metode pertama mengambil nama file tujuan (dan jalur). Contoh berikut menggunakan metode CopyTo pertama untuk menyalin file Final.txt ke direktori C:\Bin.

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

Nota

Tidak seperti mode argumen PowerShell, metode objek dijalankan dalam mode ekspresi, yang merupakan pass-through ke kerangka kerja .NET yang dibangun PowerShell. Dalam mode ekspresiargumen bareword (string yang tidak dikutip) tidak diperbolehkan. Anda dapat melihat perbedaan ini saat menggunakan jalur sebagai parameter, versus jalur sebagai argumen. Anda dapat membaca lebih lanjut tentang mode penguraian di about_Parsing

Tanda tangan metode kedua mengambil nama file tujuan dan nilai Boolean yang menentukan apakah file tujuan harus ditimpa, jika sudah ada.

Contoh berikut menggunakan metode CopyTo kedua untuk menyalin file Final.txt ke direktori C:\Bin, dan untuk menimpa file yang ada.

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

Enumerasi akses anggota

Dimulai di PowerShell 3.0, saat Anda menggunakan operator akses anggota (.) untuk mengakses metode yang tidak ada di kumpulan daftar, PowerShell secara otomatis menghitung item dalam koleksi dan memanggil metode pada setiap item. Untuk informasi selengkapnya, lihat about_Member-Access_Enumeration.

Contoh

Contoh berikut menjalankan metode Kill objek proses individual dalam kumpulan objek.

Perintah pertama memulai tiga instans proses Notepad. Get-Process mendapatkan ketiga instans proses Notepad dan menyimpannya dalam variabel $p.

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

Perintah berikutnya menjalankan metode Kill pada ketiga proses dalam variabel $p. Perintah ini berfungsi meskipun kumpulan proses tidak memiliki metode Kill.

$p.Kill()
Get-Process Notepad

Perintah Get-Process mengonfirmasi bahwa metode Kill berfungsi.

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

Contoh ini secara fungsional setara dengan menggunakan cmdlet ForEach-Object untuk menjalankan metode pada setiap objek dalam koleksi.

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

Metode ForEach dan Where

Dimulai di PowerShell 4.0, pemfilteran koleksi menggunakan sintaks metode didukung. Ini memungkinkan penggunaan dua metode baru saat berhadapan dengan koleksi ForEach dan Where.

Anda dapat membaca selengkapnya tentang metode ini di about_Arrays

Memanggil metode tertentu ketika ada beberapa kelebihan beban

Pertimbangkan skenario berikut saat memanggil metode .NET. Jika metode mengambil objek tetapi memiliki kelebihan beban melalui antarmuka yang mengambil jenis yang lebih spesifik, PowerShell memilih metode yang menerima objek kecuali Anda secara eksplisit melemparkannya ke antarmuka tersebut.

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}";
   }

}
'@

Dalam contoh ini object kelebihan beban yang kurang spesifik dari metode Bilah dipilih.

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

Dalam contoh ini kami mentransmisian metode ke antarmuka IFoo untuk memilih kelebihan beban yang lebih spesifik dari metode Bilah.

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

Menemukan kelebihan beban mana yang digunakan

Dimulai di PowerShell 7.6, Anda dapat melihat metode mana yang dipilih PowerShell kelebihan beban dengan menggunakan MethodInvocation pelacakan.

Contoh berikut menggunakan Trace-Command untuk menampilkan kelebihan beban yang dipilih saat memanggil metode String.Split.

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

Dalam contoh pertama, bilangan bulat 1 dikonversi menjadi [char] alih-alih [string], yang menghasilkan string yang dipisahkan oleh [char]1 alih-alih string "1".

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

Dalam contoh kedua, metode dipanggil Split() dengan string "1".

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

PowerShell memilih kelebihan beban yang mengambil [string] pemisah.

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

a
 b
 c
 d

Menggunakan metode .NET yang mengambil jalur sistem file

PowerShell mendukung beberapa runspace per proses. Setiap runspace memiliki direktori sendiri saat ini. Ini tidak sama dengan direktori kerja proses saat ini: [System.Environment]::CurrentDirectory.

Metode .NET menggunakan direktori kerja proses. Cmdlet PowerShell menggunakan lokasi Runspace. Selain itu, metode .NET hanya berfungsi dengan jalur sistem file asli, bukan objek Jalur PowerShell. Untuk menggunakan jalur PowerShell dengan metode .NET, Anda harus menyelesaikan jalur ke jalur filesystem-native sebelum meneruskannya ke metode .NET.

Lihat juga