PowerShell untuk Sysadmin

gambarHalo, Penduduk! PowerShell adalah bahasa skrip dan shell perintah yang memungkinkan Anda mengelola dan mengotomatiskan hampir semua tugas. Di PowerShell untuk Sysadmins, pemilik Microsoft MVP Adam Bertram alias "the Automator" menunjukkan kepada Anda bagaimana menggunakan PowerShell sehingga pembaca akhirnya punya waktu untuk mainan, yoga, dan kucing. Anda akan belajar untuk: -Menggabungkan perintah, mengontrol aliran eksekusi, menangani kesalahan, menulis skrip, menjalankannya dari jarak jauh dan mengujinya menggunakan kerangka pengujian Pester. -Analisis data terstruktur seperti XML dan JSON, bekerja dengan layanan populer (seperti Active Directory, Azure, dan Amazon Web Services), buat sistem pemantauan server. -Buat dan desain modul PowerShell. -Gunakan PowerShell untuk kenyamanan,penginstalan Windows otomatis sepenuhnya. -Membuat hutan Direktori Aktif hanya dengan host Hyper-V dan beberapa file ISO. -Buat server web dan SQL yang tak terhitung jumlahnya hanya dengan beberapa baris kode! Contoh kehidupan nyata membantu menjembatani kesenjangan antara teori dan karya dalam sistem nyata, dan humor ringan penulis membuat membaca lebih mudah. Berhentilah mengandalkan perangkat lunak mahal dan saran tidak jelas dari web!



Untuk siapa buku ini
- , . DevOps, , / (CI/CD).



, PowerShell . PowerShell « Windows» — Microsoft, PowerShell . , , .



Aliran kontrol



Mari ulangi sedikit. Di Bab 3, kita mempelajari bagaimana Anda dapat menggabungkan perintah menggunakan pipeline dan skrip eksternal. Bab 2 membahas variabel dan cara menggunakannya untuk menyimpan nilai. Salah satu keuntungan utama bekerja dengan variabel adalah kemampuan untuk menggunakannya untuk menulis kode yang tidak bekerja dengan nilai, tetapi dengan "makna". Sebagai contoh, alih-alih menggunakan angka 3, Anda akan bekerja dengan konsep umum $ serverCount. Ini memungkinkan Anda untuk menulis kode yang berfungsi sama baik Anda memiliki satu, dua, atau seribu server. Gabungkan kemampuan ini dengan kemampuan untuk menyimpan kode Anda dalam skrip yang dapat dijalankan di komputer yang berbeda, dan Anda dapat mulai menyelesaikan masalah dalam skala yang jauh lebih besar.



Namun, dalam hidup, terkadang penting apakah Anda bekerja dengan satu server, dengan dua, atau dengan seribu. Sejauh ini, Anda tidak memiliki cara yang sesuai untuk menjelaskan hal ini, dan skrip Anda berjalan dari atas ke bawah, tidak dapat beradaptasi berdasarkan nilai-nilai tertentu. Dalam bab ini, kita akan menggunakan aliran kontrol dan logika kondisional untuk menulis skrip yang akan menjalankan perintah yang berbeda tergantung pada nilai yang dioperasikannya. Di akhir bab, Anda akan mempelajari cara menggunakan if / then dan pernyataan switch, serta berbagai loop, untuk memberikan kode Anda fleksibilitas yang sangat dibutuhkan.



Sedikit tentang aliran kendali



Kami akan menulis skrip yang membaca konten file yang disimpan di beberapa komputer jarak jauh. Untuk melanjutkan, unduh file bernama App_configuration.txt dari materi buku di github.com/adbertram/PowerShellForSysadmins/ dan letakkan di root drive C: \ pada beberapa komputer jarak jauh. Jika Anda tidak memiliki komputer jarak jauh, teruslah membaca untuk saat ini. Untuk contoh ini, saya akan menggunakan server bernama SRV1, SRV2, SRV3, SRV4, dan SRV5.



Untuk mengakses konten file, gunakan perintah Get-Content dan tentukan jalur ke file dalam nilai argumen parameter Path, seperti yang ditunjukkan di bawah ini:



Get-Content -Path "\\ namaserver \ c $ \ App_configuration.txt "



Pertama, mari simpan semua nama server kita dalam array dan jalankan perintah ini untuk setiap server. Buka file .ps1 baru dan masukkan kode dari Listing 4.1 ke dalamnya.



Daftar 4.1. Mengekstrak konten file dari beberapa server



$servers = @('SRV1','SRV2','SRV3','SRV4','SRV5')
Get-Content -Path "\\$($servers[0])\c$\App_configuration.txt"
Get-Content -Path "\\$($servers[1])\c$\App_configuration.txt"
Get-Content -Path "\\$($servers[2])\c$\App_configuration.txt"
Get-Content -Path "\\$($servers[3])\c$\App_configuration.txt"
Get-Content -Path "\\$($servers[4])\c$\App_configuration.txt"
      
      





Secara teori, kode ini harus bekerja tanpa masalah. Tetapi contoh ini mengasumsikan bahwa ada sesuatu yang tidak beres untuk Anda. Bagaimana jika server SRV2 sedang down? Bagaimana jika seseorang lupa meletakkan App_configuration.txt di SRV4? Atau mungkin seseorang mengubah jalur file? Anda dapat menulis skrip terpisah untuk setiap server, tetapi solusi ini tidak akan diskalakan, terutama saat Anda mulai menambahkan lebih banyak server. Anda memerlukan kode yang berfungsi tergantung pada situasinya.



Ide di balik aliran kontrol adalah memungkinkan Anda untuk menjalankan rangkaian instruksi yang berbeda berdasarkan logika yang telah ditentukan sebelumnya. Bayangkan skrip Anda dieksekusi di sepanjang jalur tertentu. Sejauh ini, jalur Anda sederhana - dari baris kode pertama hingga terakhir. Namun, Anda dapat menambahkan pertigaan di sepanjang jalan, kembali ke tempat-tempat yang pernah Anda kunjungi, atau melompati mereka. Dengan membagi jalur eksekusi skrip Anda, Anda memberinya lebih banyak fleksibilitas, memungkinkan Anda menangani banyak situasi dengan satu skrip.



Kita akan mulai dengan melihat jenis aliran kontrol yang paling sederhana, pernyataan bersyarat.



Menggunakan pernyataan bersyarat



Di Bab 2, kita belajar bahwa ada nilai logika: benar dan salah. Boolean memungkinkan Anda membuat pernyataan bersyarat yang memberi tahu PowerShell untuk mengeksekusi blok kode tertentu bergantung pada apakah ekspresi (disebut kondisi) mengevaluasi ke True atau False. Suatu kondisi adalah pertanyaan ya / tidak. Apakah Anda memiliki lebih dari lima server? Apakah server 3 berjalan? Apakah jalur file ada? Untuk mulai menggunakan pernyataan bersyarat, mari kita lihat bagaimana mengubah pertanyaan seperti itu menjadi ekspresi.



Membangun Ekspresi dengan Operator Anda



dapat menulis ekspresi logika menggunakan operator perbandingan yang membandingkan nilai. Untuk menggunakan operator perbandingan, Anda perlu menempatkannya di antara dua nilai, misalnya:



PS> 1 –eq 1
True
      
      





Dalam kasus ini, operator –eq memungkinkan Anda menentukan ekivalensi dua nilai.

Di bawah ini adalah daftar operator perbandingan paling umum yang akan kita gunakan:



-eq membandingkan dua nilai dan mengembalikan True jika sama.



-ne membandingkan dua nilai dan mengembalikan True jika tidak sama.



-gt membandingkan dua nilai dan mengembalikan True jika yang pertama lebih besar dari yang kedua.



-ge membandingkan dua nilai dan mengembalikan True jika yang pertama lebih besar dari atau sama dengan yang kedua.



-lt membandingkan dua nilai dan mengembalikan True jika yang pertama kurang dari yang kedua.



-le membandingkan dua nilai dan mengembalikan True jika yang pertama kurang dari atau sama dengan yang kedua.



-berisi mengembalikan True jika nilai kedua adalah bagian dari yang pertama. Misalnya, operator ini memungkinkan Anda untuk menentukan apakah suatu nilai ada di dalam larik.



PowerShell juga memiliki operator perbandingan yang lebih canggih. Kami tidak akan membahasnya di sini, tetapi saya menyarankan Anda untuk membacanya di dokumentasi Microsoft di docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comparison_operators atau di bagian Bantuan PowerShell (lihat bab 1).



Anda dapat menggunakan operator di atas untuk membandingkan variabel dan nilai. Tetapi ungkapan itu tidak harus menjadi perbandingan. Terkadang perintah PowerShell dapat digunakan sebagai kondisi. Pada contoh sebelumnya, kami ingin mengetahui ketersediaan server. Anda dapat menggunakan cmdlet Test-Connection untuk menguji koneksi ke server. Biasanya, output cmdlet Test-Connection berisi banyak informasi berbeda, tetapi dengan parameter Quiet Anda dapat memaksa perintah untuk mengembalikan True atau False, dan parameter Count dapat membatasi pengujian menjadi satu percobaan.



PS> Test-Connection -ComputerName offlineserver -Quiet -Count 1
False
      
      





PS> Test-Connection -ComputerName onlineserver -Quiet -Count 1
True
      
      





Untuk mengetahui apakah server sedang down, Anda dapat menggunakan operator –not untuk membalikkan ekspresi:



PS> -not (Test-Connection -ComputerName offlineserver -Quiet -Count 1)
True
      
      





Sekarang setelah Anda terbiasa dengan ekspresi dasar, mari kita lihat operator bersyarat yang paling sederhana.



Pernyataan if Pernyataan



if berfungsi dengan sederhana: jika X benar, maka lakukan Y. Itu saja!



Untuk menggunakan pernyataan dalam ekspresi, tulis kata kunci if diikuti dengan tanda kurung yang berisi kondisi. Ekspresi tersebut diikuti dengan blok kode yang diapit oleh tanda kurung kurawal. PowerShell hanya akan mengeksekusi blok kode ini jika ekspresi bernilai True. Jika ekspresi if bernilai False atau tidak mengembalikan apa pun, blok kode tidak akan dieksekusi. Sintaks untuk pernyataan if / then ditunjukkan pada Listing 4.2.



Daftar 4.2. Jika pernyataan sintaks



if () {
   #  ,   
}
      
      





Contoh ini memiliki sintaks baru: karakter hash (#) menunjukkan komentar - ini adalah teks yang diabaikan PowerShell. Anda dapat menggunakan komentar untuk meninggalkan catatan dan deskripsi yang berguna untuk Anda sendiri atau orang lain yang nantinya akan membaca kode Anda.



Sekarang, mari kita lihat kembali kode yang ditunjukkan pada Listing 4.1. Saya akan menunjukkan kepada Anda bagaimana menggunakan pernyataan if untuk menghindari mencoba menjangkau server yang mati. Kita sudah melihat di bagian sebelumnya bahwa perintah Test-Connection dapat digunakan sebagai ekspresi yang mengembalikan True atau False, jadi untuk saat ini mari kita bungkus Test-Connection dalam pernyataan if dan kemudian gunakan perintah Get-Content untuk menghindari mencoba mengakses server mati. ... Untuk saat ini, kami hanya akan mengubah kode untuk server pertama, seperti yang ditunjukkan pada Listing 4.3.



Daftar 4.3. Menggunakan pernyataan if untuk mengakses secara selektif



$servers = @('SRV1','SRV2','SRV3','SRV4','SRV5')
if (Test-Connection -ComputerName $servers[0] -Quiet -Count 1) {
   Get-Content -Path "\\$($servers[0])\c$\App_configuration.txt"
}
Get-Content -Path "\\$($servers[1])\c$\App_configuration.txt"
----
      
      





Karena Anda memiliki Get-Content dalam pernyataan if Anda, Anda tidak akan mengalami kesalahan jika Anda mencoba mengakses server yang rusak; jika pengujian gagal, skrip Anda tahu untuk tidak mencoba membaca file. Kode akan mencoba mengakses server hanya jika sudah tahu bahwa itu diaktifkan. Namun perhatikan bahwa kode ini hanya aktif jika kondisinya benar. Cukup sering, Anda perlu menentukan satu perilaku skrip untuk kondisi yang benar dan yang lainnya untuk yang salah. Di bagian selanjutnya, Anda akan melihat cara mendefinisikan perilaku untuk kondisi palsu menggunakan pernyataan else.



Pernyataan lain



Untuk memberikan pernyataan if Anda dengan alternatif, Anda dapat menggunakan kata kunci else setelah tanda kurung tutup dari blok if, diikuti dengan sepasang tanda kurung kurawal yang berisi blok kode. Seperti yang ditunjukkan pada Listing 4.4, kami akan menggunakan pernyataan lain untuk mengembalikan kesalahan ke konsol jika server pertama tidak merespons.



Daftar 4.4. Menggunakan klausa else untuk menjalankan kode jika kondisinya

tidak benar



if (Test-Connection -ComputerName $servers[0] -Quiet -Count 1) {
   Get-Content -Path "\\$($servers[0])\c$\App_configuration.txt"
} else {
   Write-Error -Message "The server $($servers[0]) is not responding!"
}
      
      





Pernyataan if / else berfungsi dengan baik saat Anda memiliki dua situasi yang saling eksklusif. Dalam hal ini, server terhubung atau tidak, artinya, kita hanya memerlukan dua cabang kode. Mari kita lihat bagaimana menghadapi situasi yang lebih kompleks.



Pernyataan Elseif



Pernyataan else mencakup situasi yang berlawanan: jika tidak berhasil, lakukan saja. Pendekatan ini berfungsi untuk kondisi biner, yaitu, saat server sedang berjalan atau tidak. Tetapi terkadang Anda harus berurusan dengan sejumlah besar opsi. Misalnya, Anda memiliki server yang tidak memiliki file yang Anda inginkan, dan Anda telah menyimpan nama server tersebut di variabel $ problemServer (tambahkan baris kode ini ke skrip Anda!). Ini berarti Anda memerlukan pemeriksaan tambahan untuk melihat apakah server yang sedang Anda polling adalah server yang bermasalah. Ini dapat dilakukan dengan pernyataan if bersarang, seperti yang ditunjukkan pada kode di bawah ini:



if (Test-Connection -ComputerName $servers[0] -Quiet -Count 1) {
   if ($servers[0] –eq $problemServer) {
      Write-Error -Message "The server $servers[0] does not have the right
         file!"
   } else {
      Get-Content -Path "\\$servers[0]\c$\App_configuration.txt"
   }
} else {
   Write-Error -Message "The server $servers[0] is not responding!"
}
----
      
      





Tetapi ada cara yang lebih baik untuk mengimplementasikan logika yang sama, dengan pernyataan elseif, yang memungkinkan Anda memeriksa kondisi tambahan sebelum kembali ke blok else. Sintaks untuk blok elseif identik dengan sintaks untuk blok if. Jadi, untuk menguji server masalah dengan pernyataan elseif, jalankan kode pada Listing 4.5.



Daftar 4.5. Menggunakan blok elseif



if (-not (Test-Connection -ComputerName $servers[0] -Quiet -Count 1)) { 
   Write-Error -Message "The server $servers[0] is not responding!"
} elseif ($servers[0] –eq $problemServer) 
   Write-Error -Message "The server $servers[0] does not have the right file!"
} else {
   Get-Content -Path "\\$servers[0]\c$\App_configuration.txt"
}
----
      
      





Harap dicatat bahwa kami tidak hanya menambahkan pernyataan elseif, tetapi pada saat yang sama mengubah logika kode. Sekarang kita dapat memeriksa apakah server sedang offline menggunakan –bukan operator. Kemudian, setelah kami menentukan status jaringan server, kami memeriksa untuk melihat apakah itu bermasalah. Jika tidak, kami menggunakan pernyataan else untuk memicu perilaku checkout file default. Seperti yang Anda lihat, ada beberapa cara untuk menyusun kode Anda dengan cara ini. Hal yang penting adalah bahwa kode tersebut berfungsi dan dapat dibaca oleh orang dari luar, baik kolega Anda yang melihatnya untuk pertama kali, atau Anda sendiri beberapa saat setelah menulisnya.



Anda dapat merangkai pernyataan elseif sebanyak yang Anda inginkan untuk mengakomodasi berbagai macam keadaan. Namun, pernyataan elseif saling eksklusif: ketika salah satu elseif mengevaluasi ke True, PowerShell hanya menjalankan kodenya dan tidak memeriksa kasus lain. Pada Listing 4.5, ini tidak menimbulkan masalah, karena Anda hanya perlu menguji server untuk "masalah" setelah memeriksa kesehatan, tetapi di masa mendatang saya menyarankan Anda untuk mengingat fitur ini.



Pernyataan if, else, dan elseif sangat bagus untuk mengimplementasikan respons kode ke pertanyaan ya / tidak sederhana. Di bagian selanjutnya, Anda akan mempelajari cara bekerja dengan logika yang lebih kompleks.



Pernyataan Switch



Mari kita sedikit mengubah contoh kita. Katakanlah kita memiliki lima server, dan pada setiap server jalur ke file yang diperlukan berbeda. Berdasarkan apa yang Anda ketahui sekarang, Anda perlu membuat pernyataan elseif terpisah untuk setiap server. Ini akan berhasil, tetapi ada metode yang lebih nyaman.



Harap dicatat bahwa sekarang kami akan bekerja dengan jenis kondisi yang berbeda. Jika sebelumnya kami membutuhkan jawaban atas pertanyaan seperti "ya / tidak", sekarang kami ingin mendapatkan arti spesifik dari satu hal. Apakah ini server SRV1? SRV2? Dll Jika Anda hanya bekerja dengan satu atau dua nilai tertentu, pernyataan if akan berfungsi, tetapi dalam kasus ini, pernyataan sakelar berfungsi jauh lebih baik.



Pernyataan switch memungkinkan Anda untuk mengeksekusi potongan kode yang berbeda tergantung pada beberapa nilai. Ini terdiri dari kata kunci switch yang diikuti dengan ekspresi dalam tanda kurung. Di dalam blok sakelar terdapat serangkaian pernyataan, dengan struktur seperti ini: pertama Anda menentukan nilainya, diikuti oleh satu set tanda kurung kurawal yang berisi blok kode, dan terakhir blok default, seperti yang ditunjukkan pada Listing 4.6.



Daftar 4.6. Ganti template pernyataan



switch () {
    {
      # 
   }
    {
   }
   default {
     # ,     
   }
}
      
      





Pernyataan switch dapat berisi jumlah nilai yang hampir tidak terbatas. Jika ekspresi terevaluasi menjadi nilai, kode yang sesuai di dalam blok akan dieksekusi. Hal yang penting adalah, tidak seperti elseif, setelah menjalankan satu blok kode, PowerShell akan terus memeriksa kondisi lainnya, kecuali dinyatakan lain. Jika tidak ada nilai yang cocok, PowerShell akan mengeksekusi kode di blok default. Untuk menghentikan pengulangan kondisi dalam pernyataan switch, gunakan kata kunci break di akhir blok kode, seperti yang ditunjukkan pada Listing 4.7.



Daftar 4.7. Menggunakan kata kunci break dalam pernyataan switch



switch () {
    {
      # 
      break
   }
----
      
      





Kata kunci break memungkinkan Anda membuat kondisi dalam pernyataan switch yang saling eksklusif. Mari kembali ke contoh kita dengan lima server dan file yang sama dengan jalur berbeda. Anda tahu bahwa server yang Anda gunakan hanya dapat memiliki satu nilai (yaitu, tidak dapat dinamai SRV1 dan SRV2 pada saat yang sama), jadi Anda perlu menggunakan pernyataan break. Skrip Anda akan terlihat seperti yang ditunjukkan pada Listing 4.8.



Daftar 4.8. Memeriksa berbagai server dengan pernyataan sakelar



$currentServer = $servers[0]
switch ($currentServer) {
   $servers[0] {
      # Check if server is online and get content at SRV1 path.
      break
   }
   $servers[1] {
      ## Check if server is online and get content at SRV2 path.
      break
   }
   $servers[2] {
      ## Check if server is online and get content at SRV3 path.
      break
   }
----
      
      





Anda dapat menulis ulang kode ini hanya dengan menggunakan pernyataan if dan elseif (dan saya sangat menyarankan Anda untuk mencobanya!). Bagaimanapun, metode apa pun yang Anda pilih, Anda memerlukan struktur yang sama untuk setiap server dalam daftar, yang berarti skenario Anda akan cukup panjang - bayangkan saja menguji lima ratus server, bukan lima. Di bagian selanjutnya, Anda akan belajar bagaimana mengatasi masalah ini dengan menggunakan salah satu struktur aliran kontrol yang paling mendasar - sebuah loop.



Menggunakan loop



Ada aturan praktis yang baik untuk pekerjaan komputer: jangan ulangi diri Anda sendiri (KERING). Jika Anda menemukan diri Anda melakukan pekerjaan yang sama, kemungkinan ada cara untuk mengotomatiskannya. Ini sama dengan pengkodean: jika Anda menggunakan baris yang sama berulang kali, mungkin ada solusi yang lebih baik.



Salah satu cara untuk menghindari pengulangan adalah dengan menggunakan loop. Sebuah loop memungkinkan Anda untuk mengeksekusi kode berulang kali hingga beberapa kondisi yang ditentukan berubah. Kondisi stop dapat memulai loop beberapa kali, baik hingga beberapa nilai boolean berubah, atau menentukan loop untuk berjalan tanpa batas. Kami akan menyebut setiap lintasan loop sebagai iterasi.



PowerShell menawarkan lima jenis loop: foreach, for, do / while, do / sampai, dan while. Di bagian ini, kita akan membahas setiap jenis loop, menyoroti fitur uniknya, dan menyoroti situasi terbaik untuk menggunakannya.



Tentang Penulis



Adam Bertram adalah pakar bisnis IT dan internet berpengalaman dengan pengalaman 20 tahun. Pengusaha, Influencer TI, Microsoft MVP, Blogger, Manajer Pelatihan, dan Penulis Pemasaran Konten, bekerja dengan banyak perusahaan TI. Adam juga mendirikan platform TechSnips yang populer untuk mengembangkan keterampilan profesional TI (techsnips.io).



Rincian lebih lanjut tentang buku ini dapat ditemukan di situs web penerbit

» Daftar Isi

» Kutipan



Untuk Habitors, diskon 25% untuk kupon - PowerShell



Setelah pembayaran untuk versi kertas buku, e-book dikirim ke email.



All Articles