6

長いプロジェクトの過程で作成したPowerShellコードが大量にあります。これらのスクリプトはさまざまな機能を実行し、それらのほとんどはプロジェクトの範囲内で他のスクリプトに何らかの形で依存しています。現在、作業はそれぞれ多くの機能を含むいくつかのファイルで構成されています。もともと、これらのスクリプトを操作するために、すべてのスクリプトファイルは環境に無計画にドットソースされていました。

ただし、最近、Powershell 2.0でモジュールが導入されていることを知り、これらのスクリプトを一緒に展開したいと思います。モジュールの内容はすべて一緒にロードされるので、ソース管理を支援するために、各スクリプトが独自のファイルを持つようにファイルを分割したいと思います。ただし、現在、スクリプト間の接続については少しわかりません。

いくつかのテストを行いましたが、各関数のExport-ModuleMemberコマンドを個々の.ps1ファイルに移動しても問題ないようです。これは、C#でのパブリックスコープとプライベートスコープのように、独自のスコープを宣言する関数のようです。ただし、それを行った後、私の.psm1ファイルには次のものしか含まれていません。

Get-ChildItem -recurse $psScriptRoot | where { $_.Extension -eq ".ps1" } | foreach { . $_.FullName }

それは正しいと思いますか?すべてのスクリプトはドットソースであり、すべてのスクリプトはその仮定の下で相互に参照します。代わりに、$ psScriptRootに相対的な場所を使用して相互に参照する必要がありますか?

これらの両方の方法とは異なる方法はありますか?誰かアドバイスはありますか?これらについてはまだよくわかりません。

4

2 に答える 2

6

各 .ps1 ファイルに 1 つの関数が含まれ、その関数が WPK モジュールと PSRemoteRegistry モジュールで使用される PSM1 ファイルに含まれる同様の手法を見てきました。

この行は PSRemoteRegistry モジュールです。

Get-ChildItem -Path $PSScriptRoot\*.ps1 | Foreach-Object{ . $_.FullName }

関数の巨大なスクリプト ファイルを 1 つ持つよりも、この手法の方が好きだと思います。

于 2011-06-03T02:03:26.263 に答える
4

マニフェストの作成も検討できます(psd1でpsm1が必要かどうかは実際にはわかりません)。

マニフェストの使用は次のとおりです。

New-ModuleManifest `
    -Path Fiddler.psd1 `
    -Author "Niklas Goude" `
    -CompanyName "http://www.powershell.nu/" `
    -ModuleVersion 1.0 `
    -Description "Module from http://www.powershell.nu/2011/03/14/fiddler/</a> - psd1 created by Matt @ amonskeysden.tumblr.com" `
    -FormatsToProcess @() `
    -RequiredAssemblies @("Fiddler.dll") `
    -NestedModules @() `
    -Copyright "" `
    -ModuleToProcess "Fiddler.psm1" `
    -TypesToProcess @() `
    -FileList @("Fiddler.psm1","Fiddler.dll")

あなたの質問に対する答えは、そこにあるFileListパラメータにファイルリストを含めることだと思います。

私はここに私の発見のいくつか(MSリソースへのリンクを含む)を書きました:

http://amonkeysden.tumblr.com/post/5127684898/powershell-and-fiddler

于 2011-06-03T07:32:31.747 に答える