PowerShellスクリプトモジュールで定義された関数の大規模なセットがあります。を使用したいのですが、 1つの関数だけExport-ModuleMember -Function *
を除外したいと思います。含まれているすべての関数を一覧表示するよりも、この1つの関数を除外する方が簡単です。これを達成する方法はありますか?
4 に答える
関数を除外することについての私の一般的な答えは、エクスポートしたい関数に動詞-名詞の命名を使用し、その他すべてに初期キャップを使用することです。
その後、Export-ModuleMember -function *-*
それの世話をします。
スクリプト内のすべての関数を検索し、除外するものに基づいてフィルター処理します(PowerShell v2を想定)。
$errors = $null
$functions = [system.management.automation.psparser]::Tokenize($psISE.CurrentFile.Editor.Text, [ref]$errors) `
| ?{(($_.Content -Eq "Function") -or ($_.Content -eq "Filter")) -and $_.Type -eq "Keyword" } `
| Select-Object @{"Name"="FunctionName"; "Expression"={
$psISE.CurrentFile.Editor.Select($_.StartLine,$_.EndColumn+1,$_.StartLine,$psISE.CurrentFile.Editor.GetLineLength($_.StartLine))
$psISE.CurrentFile.Editor.SelectedText
}
}
これは、私がv2でISE関数エクスプローラーを作成するために使用した手法です。ただし、これがISE以外のプレーンテキストで機能しない理由はわかりません。ただし、キャレットラインの詳細を回避する必要があります。これは、あなたが望むことを達成する方法の単なる例です。
次に、不要なものをフィルタリングして、これをExport-ModuleMember
!にパイプします。
$functions | ?{ $_.FunctionName -ne "your-excluded-function" }
PowerShell v3を使用している場合、パーサーを使用すると非常に簡単になります。
ですから、これはパーティーにかなり遅れていることはわかっていますが、簡単な解決策は、Export-ModuleMemberコマンドレットの後にエクスポートしたくないすべての関数を配置することです。そのステートメントの後に定義された関数はエクスポートされず、モジュールで使用できるようになります(別名プライベート関数)。
おそらく、より洗練された方法は、モジュール定義ファイルを含めることであり、含める関数のリストにその関数を含めないことです。
モジュール内に関数を含めないようにモジュール内にコードを記述するという考え方は非常に複雑に思えます。これは新しい機能ではありません。PowerShellのごく初期の頃から、エクスポート後に関数を配置してきました。
Ravikanth(彼のソリューションでV2を使用していた)が示唆するように、PowerShell V3を使用する私のソリューションは、PSParser
モジュールを定義することです。
Add-Type -Path "${env:ProgramFiles(x86)}\Reference Assemblies\Microsoft\WindowsPowerShell\3.0\System.Management.Automation.dll"
Function Get-PSFunctionNames([string]$Path) {
$ast = [System.Management.Automation.Language.Parser]::ParseFile($Path, [ref]$null, [ref]$null)
$functionDefAsts = $ast.FindAll({ $args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst] }, $true)
$functionDefAsts | ForEach-Object { $_.Name }
}
Export-ModuleMember -Function '*'
また、モジュールで、特定の関数を除外する場合、最後の行は次のようになります。
Export-ModuleMember -Function ( (Get-PSFunctionNames $PSCommandPath) | Where { $_ -ne 'MyPrivateFunction' } )
$PSCommandPath
ASTパーサーはバージョン3で導入されたため、これはPowerShellV3以降でのみ機能することに注意してください。