5

PowerShellスクリプトモジュールで定義された関数の大規模なセットがあります。を使用したいのですが、 1つの関数だけExport-ModuleMember -Function *を除外したいと思います。含まれているすべての関数を一覧表示するよりも、この1つの関数を除外する方が簡単です。これを達成する方法はありますか?

4

4 に答える 4

19

関数を除外することについての私の一般的な答えは、エクスポートしたい関数に動詞-名詞の命名を使用し、その他すべてに初期キャップを使用することです。

その後、Export-ModuleMember -function *-*それの世話をします。

于 2012-06-26T03:52:47.453 に答える
5

スクリプト内のすべての関数を検索し、除外するものに基づいてフィルター処理します(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を使用している場合、パーサーを使用すると非常に簡単になります。

于 2012-06-26T03:28:20.337 に答える
1

ですから、これはパーティーにかなり遅れていることはわかっていますが、簡単な解決策は、Export-ModuleMemberコマンドレットの後にエクスポートしたくないすべての関数を配置することです。そのステートメントの後に定義された関数はエクスポートされず、モジュールで使用できるようになります(別名プライベート関数)。

おそらく、より洗練された方法は、モジュール定義ファイルを含めることであり、含める関数のリストにその関数を含めないことです。

モジュール内に関数を含めないようにモジュール内にコードを記述するという考え方は非常に複雑に思えます。これは新しい機能ではありません。PowerShellのごく初期の頃から、エクスポート後に関数を配置してきました。

于 2020-09-15T22:15:20.220 に答える
0

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' } )

$PSCommandPathASTパーサーはバージョン3で導入されたため、これはPowerShellV3以降でのみ機能することに注意してください。

于 2015-03-06T17:04:11.180 に答える