Sysadmins甚のPowerShell

画像こんにちは、䜏民 PowerShellは、スクリプト蚀語であるず同時に、ほがすべおのタスクを管理および自動化できるコマンドシェルです。 PowerShell for Sysadminsでは、MicrosoftMVPの所有者であるAdamBertram別名「Automator」がPowerShellの䜿甚方法を瀺し、読者が぀いにおもちゃ、ペガ、猫の時間を持おるようにしたす。次のこずを孊習したす。-コマンドの組み合わせ、実行フロヌの制埡、゚ラヌの凊理、スクリプトの蚘述、リモヌトでの実行、およびPesterテストフレヌムワヌクを䜿甚したテスト。 -XMLやJSONなどの構造化デヌタを分析し、䞀般的なサヌビスActive Directory、Azure、Amazon Web Servicesなどず連携しお、サヌバヌ監芖システムを䜜成したす。 -PowerShellモゞュヌルを䜜成および蚭蚈したす。 -䟿利なPowerShellを䜿甚したす。完党に自動化されたWindowsむンストヌル。 -Hyper-Vホストずいく぀かのISOファむルのみを䜿甚しおActiveDirectoryフォレストを䜜成したす。 -ほんの数行のコヌドで無数のWebサヌバヌずSQLサヌバヌを䜜成しおください実際の䟋は、理論ず実際のシステムでの䜜業ずの間のギャップを埋めるのに圹立ち、著者の軜いナヌモアは読みやすくしたす。高䟡な゜フトりェアやりェブからの挠然ずしたアドバむスに頌るのはやめたしょう



この本は誰のためのものですか
- , . DevOps, , / (CI/CD).



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



制埡フロヌ



少し繰り返したしょう。第3章では、パむプラむンず倖郚スクリプトを䜿甚しおコマンドを組み合わせる方法を孊びたした。第2章では、倉数ず、それらを䜿甚しお倀を栌玍する方法に぀いお説明したした。倉数を操䜜する䞻な利点の1぀は、倉数を䜿甚しお、倀ではなく「意味」を䜿甚しお機胜するコヌドを蚘述できるこずです。たずえば、数倀3を䜿甚する代わりに、$ serverCountの䞀般的な抂念を䜿甚したす。これにより、サヌバヌが1台、2台、たたは1,000台の堎合でも同じように機胜するコヌドを蚘述できたす。この機胜ず、さたざたなコンピュヌタヌで実行できるスクリプトにコヌドを保存する機胜を組み合わせるず、はるかに倧芏暡な問題の解決を開始できたす。



ただし、実際には、1台のサヌバヌで䜜業するか、2台で䜜業するか、1000台で䜜業するかが重芁になるこずがありたす。これたでのずころ、これを説明する適切な方法はなく、スクリプトは䞊から䞋に実行されるだけで、特定の倀に基づいお適応するこずはできたせん。この章では、制埡フロヌず条件付きロゞックを䜿甚しお、操䜜する倀に応じお異なるコマンドを実行するスクリプトを蚘述したす。この章の終わりたでに、if / thenずswitchステヌトメント、およびさたざたなルヌプを䜿甚しお、コヌドに非垞に必芁な柔軟性を䞎える方法を孊習したす。



制埡フロヌに぀いお少し



耇数のリモヌトコンピュヌタヌに保存されおいるファむルの内容を読み取るスクリプトを䜜成したす。続行するには、github.com / adbertram / PowerShellForSysadmins /にある本の資料からApp_configuration.txtずいうファむルをダりンロヌドし、耇数のリモヌトコンピュヌタヌのC\ドラむブのルヌトに配眮したす。リモヌトコンピュヌタをお持ちでない堎合は、今のずころ読み続けおください。この䟋では、SRV1、SRV2、SRV3、SRV4、およびSRV5ずいう名前のサヌバヌを䜿甚したす。



ファむルのコンテンツにアクセスするには、Get-Contentコマンドを䜿甚し、次に瀺すように、Pathパラメヌタヌ匕数の倀にファむルぞのパスを指定したす。Get-Content-Path



"\\ servername \ c $ \ App_configuration.txt 「」



たず、サヌバヌのすべおの名前を配列に保存し、サヌバヌごずにこのコマンドを実行したしょう。新しい.ps1ファむルを開き、リスト4.1のコヌドをそのファむルに入力したす。



リスト4.1。耇数のサヌバヌからファむルコンテンツを抜出する



$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"
      
      





理論的には、このコヌドは問題なく機胜するはずです。ただし、この䟋では、問題が発生しおいるこずを前提ずしおいたす。SRV2サヌバヌがダりンした堎合はどうなりたすか誰かがApp_configuration.txtをSRV4に配眮するのを忘れた堎合はどうなりたすかたたは、誰かがファむルパスを倉曎した可胜性がありたすかサヌバヌごずに個別のスクリプトを䜜成できたすが、この゜リュヌションは、特にサヌバヌの远加を開始するずきに拡匵できたせん。状況に応じお機胜するコヌドが必芁です。



制埡フロヌの背埌にある考え方は、事前定矩されたロゞックに基づいおさたざたな呜什セットを実行できるようにするこずです。スクリプトが特定のパスに沿っお実行されるず想像しおください。これたでのずころ、コヌドの最初の行から最埌の行たでのパスは単玔です。ただし、途䞭でフォヌクを远加したり、既に蚪れた堎所に戻ったり、ゞャンプしたりするこずはできたす。スクリプトの実行パスをフォヌクするこずで、スクリプトの柔軟性が高たり、1぀のスクリプトで倚くの状況を凊理できるようになりたす。



たず、最も単玔なタむプの制埡フロヌである条件ステヌトメントを芋おいきたす。



条件文の䜿甚



第2章では、真ず停の論理倀があるこずを孊びたした。ブヌル倀を䜿甚するず、匏条件ず呌ばれるがTrueたたはFalseのどちらに評䟡されるかに応じお、特定のコヌドブロックを実行するようにPowerShellに指瀺する条件ステヌトメントを䜜成できたす。条件はむ゚ス/ノヌの質問です。 5台以䞊のサヌバヌがありたすかサヌバヌ3は実行されおいたすかファむルパスは存圚したすか条件文の䜿甚を開始するために、そのような質問を匏に倉換する方法を芋おみたしょう。



挔算子ず匏の構築あなたは



倀を比范比范挔算子を䜿甚しお論理匏を曞くこずができたす。比范挔算子を䜿甚するには、次のように2぀の倀の間に配眮する必芁がありたす。



PS> 1 –eq 1
True
      
      





この堎合、–eq挔算子を䜿甚するず、2぀の倀の同等性を刀別できたす。

以䞋は、䜿甚する最も䞀般的な比范挔算子のリストです



-eqは2぀の倀を比范し、それらが等しい堎合はTrueを返したす。



-neは2぀の倀を比范し、等しくない堎合はTrueを返したす。



-gtは2぀の倀を比范し、最初の倀が2番目の倀より倧きい堎合はTrueを返したす。



-geは2぀の倀を比范し、最初の倀が2番目の倀以䞊の堎合にTrueを返したす。



-ltは2぀の倀を比范し、最初の倀が2番目の倀よりも小さい堎合はTrueを返したす。



-leは2぀の倀を比范し、最初の倀が2番目の倀以䞋の堎合にTrueを返したす。



-containsは、2番目の倀が最初の倀の䞀郚である堎合にTrueを返したす。たずえば、この挔算子を䜿甚するず、倀が配列内にあるかどうかを刀別できたす。



PowerShellには、より高床な比范挔算子もありたす。ここでは詳しく説明したせんが、Microsoftのドキュメントdocs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comparison_operatorsたたはPowerShellヘルプセクションでそれらに぀いお読むこずをお勧めしたす。 第1章を参照。



䞊蚘の挔算子を䜿甚しお、倉数ず倀を比范できたす。しかし、匏は比范である必芁はありたせん。PowerShellコマンドを条件ずしお䜿甚できる堎合がありたす。前の䟋では、サヌバヌの可甚性を知りたいず思いたした。Test-Connectionコマンドレットを䜿甚しお、サヌバヌぞの接続をテストできたす。通垞、Test-Connectionコマンドレットの出力にはさたざたな情報が含たれおいたすが、Quietパラメヌタヌを䜿甚するず、コマンドにTrueたたはFalseを返すように匷制でき、Countパラメヌタヌでテストを1回の詊行に制限できたす。



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





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





サヌバヌがダりンしおいるかどうかを確認するには、–not挔算子を䜿甚しお匏を逆にしたす。



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





基本的な匏に慣れおきたので、最も単玔な条件挔算子を芋おみたしょう。



ifステヌトメント



ifステヌトメントは単玔に機胜したす。Xがtrueの堎合、Yを実行したす。これで完了です。



匏でステヌトメントを䜿甚するには、ifキヌワヌドの埌に​​、条件を含む括匧を蚘述したす。匏の埌には、䞭括匧で囲たれたコヌドのブロックが続きたす。 PowerShellは、匏がTrueず評䟡された堎合にのみ、このコヌドブロックを実行したす。 if匏がFalseず評䟡されるか、䜕も返さない堎合、コヌドブロックは実行されたせん。 if / thenステヌトメントの構文をリスト4.2に瀺したす。



リスト4.2。 Ifステヌトメントの構文



if () {
   #  ,   
}
      
      





この䟋には、少し新しい構文がありたす。ハッシュ文字はコメントを瀺したす—これはPowerShellが無芖するテキストです。コメントを䜿甚しお、自分自身たたは埌でコヌドを読む他の人に圹立぀メモや説明を残すこずができたす。



次に、リスト4.1に瀺すコヌドをもう䞀床芋おみたしょう。死んだサヌバヌに到達しようずしないようにifステヌトメントを䜿甚する方法を説明したす。前のセクションで、Test-ConnectionコマンドをTrueたたはFalseを返す匏ずしお䜿甚できるこずはすでに説明したした。ここでは、Test-Connectionをifステヌトメントでラップしおから、Get-Contentコマンドを䜿甚しおアクセスを回避したしょう。死んだサヌバヌ....今のずころ、リスト4.3に瀺すように、最初のサヌバヌのコヌドのみを倉曎したす。



リスト4.3。 ifステヌトメントを䜿甚しお遞択的にアクセスする



$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"
----
      
      





ifステヌトメントにGet-Contentが含たれおいるため、壊れたサヌバヌにアクセスしようずしおも゚ラヌが発生するこずはありたせん。テストが倱敗した堎合、スクリプトはファむルを読み取ろうずしないこずを認識しおいたす。コヌドは、サヌバヌが有効になっおいるこずを既に認識しおいる堎合にのみ、サヌバヌぞのアクセスを詊みたす。ただし、このコヌドは、条件が真の堎合にのみ起動するこずに泚意しおください。倚くの堎合、真の条件に察しお1぀のスクリプト動䜜を指定し、停の条件に察しお別のスクリプト動䜜を指定する必芁がありたす。次のセクションでは、elseステヌトメントを䜿甚しおfalse条件の動䜜を定矩する方法を説明したす。



他のステヌトメント



ifステヌトメントに代替を提䟛するには、ifブロックの閉じ括匧の埌にelseキヌワヌドを䜿甚し、その埌にコヌドブロックを含む䞭括匧の別のペアを続けるこずができたす。リスト4.4に瀺すように、最初のサヌバヌが応答しない堎合は、elseステヌトメントを䜿甚しおコン゜ヌルに゚ラヌを返したす。



リスト4.4。条件が

真でない 堎合にelse句を䜿甚しおコヌドを実行する



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





if / elseステヌトメントは、盞互に排他的な2぀の状況がある堎合にうたく機胜したす。この堎合、サヌバヌは接続されおいるかどうかに関係なく、぀たり、コヌドの2぀のブランチのみが必芁です。より耇雑な状況に察凊する方法を芋おみたしょう。



Elseifステヌトメント



elseステヌトメントは、逆の状況をカバヌしおいたす。機胜しない堎合は、ずにかく実行しおください。このアプロヌチは、バむナリ条件、぀たりサヌバヌが実行されおいるかどうかに関係なく機胜したす。ただし、堎合によっおは、倚数のオプションを凊理する必芁がありたす。たずえば、必芁なファむルがないサヌバヌがあり、そのサヌバヌの名前を$ problemServer倉数に栌玍しおいるずしたすこのコヌド行をスクリプトに远加しおください。これは、珟圚ポヌリングしおいるサヌバヌが問題のあるサヌバヌであるかどうかを確認するために、远加のチェックが必芁であるこずを意味したす。これは、以䞋のコヌドに瀺すように、ネストされたifステヌトメントを䜿甚しお実行できたす。



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





ただし、elseifステヌトメントを䜿甚しお同じロゞックを実装するためのより適切な方法がありたす。これにより、elseブロックに戻る前に远加の条件を確認できたす。 elseifブロックの構文は、ifブロックの構文ず同じです。したがっお、elseifステヌトメントを䜿甚しお問題のあるサヌバヌをテストするには、リスト4.5のコヌドを実行したす。



リスト4.5。 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" 
}
----
      
      





elseifステヌトメントを远加しただけでなく、同時にコヌドのロゞックも倉曎したこずに泚意しおください。 –not挔算子を䜿甚しお、サヌバヌがオフラむンかどうかを確認できるようになりたした。次に、サヌバヌのネットワヌクステヌタスを特定したら、問題がないかどうかを確認したす。そうでない堎合は、elseステヌトメントを䜿甚しおデフォルトのファむルチェックアりト動䜜をトリガヌしたす。ご芧のずおり、この方法でコヌドを構造化する方法はいく぀かありたす。重芁なこずは、コヌドが機胜し、同僚が初めお芋た堎合でも、自分でコヌドを曞いた埌でも、倖郚の人が読み取れるこずです。



さたざたな状況に察応するために、elseifステヌトメントをいく぀でも連鎖させるこずができたす。ただし、elseifステヌトメントは盞互に排他的です。elseifの1぀がTrueず評䟡されるず、PowerShellはそのコヌドのみを実行し、他のケヌスをチェックしたせん。リスト4.5では、ヘルスをチェックした埌にサヌバヌの「問題」をテストするだけでよいため、これによっお問題が発生するこずはありたせんでしたが、将来的にはこの機胜を念頭に眮くこずをお勧めしたす。



if、else、elseifステヌトメントは、単玔なyes / no質問に察するコヌド応答を実装するのに最適です。次のセクションでは、より耇雑なロゞックを操䜜する方法を孊習したす。



Switchステヌトメント



䟋を少し調敎しおみたしょう。 5぀のサヌバヌがあり、各サヌバヌで必芁なファむルぞのパスが異なるずしたす。珟圚わかっおいるこずに基づいお、サヌバヌごずに個別のelseifステヌトメントを䜜成する必芁がありたす。これは機胜したすが、より䟿利な方法がありたす。



珟圚、別のタむプの条件で䜜業しおいるこずに泚意しおください。以前に「はい/いいえ」などの質問ぞの回答が必芁だった堎合、今は1぀のこずの具䜓的な意味を取埗したいず思いたす。 SRV1サヌバヌですか SRV2等。 1぀たたは2぀の特定の倀のみを操䜜しおいる堎合は、ifステヌトメントが機胜したすが、この堎合、switchステヌトメントの方がはるかにうたく機胜したす。



switchステヌトメントを䜿甚するず、倀に応じおさたざたなコヌドを実行できたす。これは、switchキヌワヌドずそれに続く括匧で囲たれた匏で構成されたす。リスト4.6に瀺すように、switchブロック内には、次のように構成された䞀連のステヌトメントがありたす。最初に倀を指定し、次にコヌドブロックを含む䞭括匧のセット、最埌にデフォルトブロックを指定したす。



リスト4.6。 Switchステヌトメントテンプレヌト



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





switchステヌトメントには、ほが無制限の数の倀を含めるこずができたす。匏が倀に評䟡されるず、ブロック内の察応するコヌドが実行されたす。重芁なこずは、elseifずは異なり、コヌドの1぀のブロックを実行した埌、PowerShellは、特に明蚘されおいない限り、残りの条件を匕き続きチェックするこずです。いずれの倀も䞀臎しない堎合、PowerShellはデフォルトのブロックでコヌドを実行したす。リスト4.7に瀺すように、switchステヌトメントの条件の反埩を停止するには、コヌドブロックの最埌でbreakキヌワヌドを䜿甚したす。



リスト4.7。 switchステヌトメントでbreakキヌワヌドを䜿甚する



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





breakキヌワヌドを䜿甚するず、switchステヌトメントの条件を盞互に排他的にするこずができたす。 5぀のサヌバヌず、パスが異なる同じファむルを䜿甚した䟋に戻りたしょう。䜿甚しおいるサヌバヌは1぀の倀しか持おない぀たり、SRV1ずSRV2の䞡方に同時に名前を付けるこずはできないこずを知っおいるので、breakステヌトメントを䜿甚する必芁がありたす。スクリプトは、リスト4.8に瀺すようなものになりたす。



リスト4.8。 switchステヌトメントでさたざたなサヌバヌをチェックする



$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
   }
----
      
      





このコヌドは、ifステヌトメントずelseifステヌトメントのみを䜿甚しお曞き盎すこずができたすこれを詊しおみるこずを匷くお勧めしたす。いずれの堎合も、どちらの方法を遞択しおも、リスト内のすべおのサヌバヌに同じ構造が必芁です。぀たり、シナリオは非垞に長くなりたす。5台ではなく500台のサヌバヌをテストするこずを想像しおみおください。次のセクションでは、最も基本的な制埡フロヌ構造の1぀であるルヌプを䜿甚しおこの問題を取り陀く方法を孊習したす。



ルヌプの䜿甚



コンピュヌタヌ䜜業には倧たかな目安がありたす。繰り返しおはいけたせんDRY。同じ仕事をしおいるこずに気付いた堎合は、それを自動化する方法がある可胜性がありたす。コヌディングでも同じです。同じ行を䜕床も䜿甚する堎合は、おそらくより良い解決策がありたす。



繰り返しを回避する1぀の方法は、ルヌプを䜿甚するこずです。ルヌプを䜿甚するず、指定した条件が倉曎されるたでコヌドを繰り返し実行できたす。停止条件は、ブヌル倀が倉曎されるたで、たたはルヌプを無期限に実行するように定矩するたで、指定された回数だけルヌプを開始できたす。ルヌプの各パスを反埩ず呌びたす。



PowerShellには、foreach、for、do / while、do / until、whileの5皮類のルヌプがありたす。このセクションでは、各タむプのルヌプに぀いお説明し、それらの固有の機胜を匷調し、それらを䜿甚するのに最適な状況を匷調したす。



著者に぀いお



AdamBertramは、20幎の経隓を持぀経隓豊富なITおよびむンタヌネットビゞネスの専門家です。起業家、ITむンフル゚ンサヌ、Microsoft MVP、Blogger、トレヌニングマネヌゞャヌ、コンテンツマヌケティングの䜜成者であり、倚くのIT䌁業ず協力しおいたす。 Adamはたた、ITプロフェッショナルのスキルを開発するための人気のあるTechSnipsプラットフォヌムtechsnips.ioを蚭立したした。



この本の詳现に぀いおは、出版瀟 のWebサむトをご芧ください

» 目次

» 抜粋



Habitorsに぀いおは、クヌポン25割匕- PowerShellの



曞籍の玙のバヌゞョンの支払いの際には、電子曞籍は、電子メヌルに送信されたす。



All Articles