Advanced PowerShell vol。 1:コードの再利用

こんにちは 大ファンであり、 PowerShellのアクティブな実務家である私は、以前に作成したコードを再利用する必要があるという事実にしばしば遭遇します。

実際、現代のプログラミング言語では、コードの再利用が一般的です。

PowerShellはこの点でそれほど遅れをとっておらず、開発者(スクリプト作成者)に、以前に記述されたコードにアクセスするためのいくつかのメカニズムを提供します。

ここでは、関数の使用、ドットソーシング、独自のモジュールの作成など、複雑さが増しています。



それらをすべて順番に検討してください。



ラボの問題の解決策として、 C:\セクションをリモートWindowsサーバーLAB-FS1で可能な最大サイズに拡張するスクリプトを作成します。

このようなスクリプトは1行で構成され、次のようになります。



Invoke-Command -ComputerName LAB-FS1 -ScriptBlock { "rescan", "select volume=c", "extend" | diskpart }
      
      





このように動作します。 最初に、 PowerShellLAB-FS1サーバーへのリモート接続を確立し、 -ScriptBlockパラメーターの波括弧で囲まれたローカルで設定されたコマンドを実行します。 次に、このセットは3つのテキストパラメーターをdiskpartコマンドに渡し、 diskpartはパーティションを(順に)再スキャンし、 C:\パーティションを選択して、可能な最大サイズに拡張します。







ご覧のとおり、スクリプトは非常にシンプルですが、同時に非常に便利です。

再利用のために適切に梱包する方法を検討してください。



1.関数の使用



最も簡単なオプション。



さまざまな理由で、さまざまなサーバーでパーティション拡張を何度も実行する必要がある大きなスクリプトを作成しているとします。 このすべてのスクリプトを同じ.ps1ファイル内の別個の関数として選択し、将来必要に応じて呼び出すだけであることが最も論理的です。 さらに、管理者がリモートサーバーの名前と展開可能なセクションの文字を明示的に指定できるようにすることで、スクリプトの機能を拡張します。 名前と文字は、パラメーターを使用して送信されます。

関数とその呼び出しは次のようになります。



 function ExtendDisk-Remotely { param ( [Parameter (Mandatory = $true)] [string] $ComputerName, [Parameter (Mandatory = $false)] [string] $DiskDrive = "c" ) Invoke-Command -ComputerName $ComputerName -ScriptBlock {"rescan", "select volume=$using:DiskDrive", "extend" | diskpart} } ExtendDisk-Remotely -ComputerName LAB-FS1
      
      





ここで、 ExtendDisk-Remotely関数に 2つのパラメーターがあります。





また、ローカル変数のリモートセッションへの転送は、usingキーワードを使用して実行されることに注意してください。



スクリプトをExample-01-Functions.ps1として保存し、実行します:







関数がLAB-FS1サーバーのC:\セクションを正常に呼び出して展開したことがわかります。



2.ドットソーシング



私たちは状況を複雑にします。 パーティションを拡張するための機能は非常に優れているため、他のスクリプトでの使用に頼りたいと思います。 になる方法



ソース.ps1ファイルから関数テキストをコピーし、必要なすべてに貼り付けますか? そして、機能コードが定期的に更新される場合はどうなりますか? 100個のスクリプトでこの機能が必要な場合はどうなりますか? 明らかに、それを別のファイルに取り、必要に応じて添付する必要があります。



すべての関数に対して個別のファイルを作成し、 Example-02-DotSourcing.ps1と呼びましょう。

その内容は次のようになります。



 function ExtendDisk-Remotely { param ( [Parameter (Mandatory = $true)] [string] $ComputerName, [Parameter (Mandatory = $false)] [string] $DiskDrive = "c" ) Invoke-Command -ComputerName $ComputerName -ScriptBlock {"rescan", "select volume=$using:DiskDrive", "extend" | diskpart} }
      
      





これは関数呼び出し(呼び出しなし)であり、現在は別のファイルに格納されており、ドットソースと呼ばれる手法を使用していつでも呼び出すことができます。 構文は次のようになります。



 . C:\Scripts\Example-02-DotSourcing.ps1 ExtendDisk-Remotely LAB-FS1
      
      





コードの最初の行を注意して見て、その内容を分析します: periodspacefunctionの説明を含むファイルへのパス



この構文により、 Example-02-DotSourcing.ps1ファイルの内容を現在のスクリプトに接続できます。 これは、 C ++で #includeディレクティブを使用するか、 C#で usingコマンドを使用するのと同じです-外部ソースからのコードを接続します。

外部ファイルを接続した後、2行目でそのファイルに含まれている関数を既に呼び出すことができます。 同時に、スクリプトの本文だけでなく、「裸の」PowerShellコンソールでも外部ファイルをZodorsorsできます。







Dotsourcingテクニックを使用できますが、これは効果的ですが、次のセクションで説明するより現代的な方法を使用する方がはるかに便利です。



3.独自のPowerShellモジュールを作成する



警告:私は仕事でPowerShellバージョン4を使用しています。

その機能の1つは、 Import-Moduleコマンドレットを使用せずにアクセスされると、モジュールを自動的にRAMに読み込むことです。



PowerShellの古いバージョン(2以降)では、以下に記述されているものが機能しますが、使用する前にモジュールの事前インポートに関連する追加の操作が必要になる場合があります。

現代の環境を考慮します。


状況は再び複雑になります。



私たちは非常に優れたPowerShellプログラマーになり、数百の便利な関数を作成し、それらを使いやすいように数十の.ps1ファイルに分割し、必要なスクリプトで必要なファイルを完成させます。 また、ドットソーシング用のファイルが多数あり、それらを100個のスクリプトで指定する必要がある場合はどうでしょうか。 そして、それらのいくつかの名前を変更した場合はどうなりますか? 明らかに、すべてのスクリプト内のすべてのファイルへのパスを変更する必要があります-これは非常に不便です。



したがって。



再利用のためにいくつの関数を書いたとしても、たった1つであっても、すぐに別のモジュールでフォーマットします。 独自のモジュールを作成することは、 PowerShellでコードを再利用するための最も簡単で、最適で、現代的でスマートな方法です。



Windows PowerShellモジュールとは



Windows PowerShellモジュールは、 何らかの形でオペレーティングシステムの別のファイルにある機能のセットです。 たとえば、すべてのネイティブMicrosoftモジュールはバイナリであり、コンパイルされた.dllです。 スクリプトモジュールを記述します。Example-02-DotSourcing.ps1ファイルからコードをコピーし、拡張子が.psm1のファイルとして保存します。



保存する場所を理解するために、環境変数PSModulePathの内容を見てみましょう。







デフォルトでは、 PowerShellがモジュールを検索する3つのフォルダーがあります。

PSModulePath変数の値はグループポリシーを使用して編集できるため、ネットワーク全体のモジュールへのパスを設定できますが、これは別の話なので、ここでは検討しません。 ただし、フォルダーC:\ Users \ Administrator \ Documents \ WindowsPowerShell \ Modulesを使用してモジュールを保存します。

コードは変更されません。



 function ExtendDisk-Remotely { param ( [Parameter (Mandatory = $true)] [string] $ComputerName, [Parameter (Mandatory = $false)] [string] $DiskDrive = "c" ) Invoke-Command -ComputerName $ComputerName -ScriptBlock {"rescan", "select volume=$using:DiskDrive", "extend" | diskpart} }
      
      





ファイルが保存され、その拡張子が変更されるフォルダーのみ。

非常に重要です!

Modulesフォルダー内に、 モジュールの名前でサブフォルダーを作成する必要があります。 この名前をRemoteDiskManagementにします。 このサブフォルダー内にファイルを保存し、 まったく同じ名前と拡張子.psm1を付けます-ファイルC:\ Users \ Administrator \ Documents \ WindowsPowerShell \ Modules \ RemoteDiskManagement \ RemoteDiskManagement.psm1を取得します。



モジュールの準備が完了し、システムに表示されることを確認できます。







モジュールは表示されており、将来的にはスクリプトまたはドットソーシングの本体で最初に宣言せずにその関数を呼び出すことができます。

PowerShellは、 ExtendDisk-Remotelyの機能を「組み込み」として認識し、必要に応じて接続します。







それだけです。関数名やdotorsファイルへのパスを変更する必要があるスクリプトを考えることなく、独自のモジュールを何十個も作成し、それらに含まれる関数のコードをいつでも編集して使用できます。



4.その他の高度な機能



既に書いたように、私はPowerShellが大好きで、コミュニティに興味があれば、その高度な機能についてさらに多くの記事を書くことができます。 議論するトピックの例を次に示します。記述された関数とモジュールにヘルプを追加します。 パイプラインから値を受け入れるように関数を強制する方法、およびスクリプトの記述にそれが課す機能。 一般的なコンベアとは何ですか? PowerShellでデータベースを使用する方法。 高度な機能がどのように配置されているか、パラメータが持つプロパティなど



面白い?

その後、週に1つの記事を配布しようとします。



All Articles