2012-06-26 43 views
5

Ich habe eine große Anzahl von Funktionen in einem PowerShell-Skript-Modul definiert. Ich möchte Export-ModuleMember -Function * verwenden, aber ich möchte nur eine Funktion ausschließen. Es wird für mich einfacher sein, diese eine Funktion auszuschließen, als alle enthaltenen Funktionen aufzulisten. Gibt es das überhaupt, um das zu erreichen?Kann ich eine einzelne Funktion von Export-ModuleMember ausschließen?

Antwort

16

Meine Bestandsantwort über das Ausschließen von Funktionen besteht darin, eine Verb-Nomen-Benennung für Funktionen zu verwenden, die ich exportieren möchte, und Anfangsbuchstaben für alles andere.

Dann kümmert sich Export-ModuleMember -function *-* darum.

+3

Die Einfachheit und Konventionsbasis dieser Antwort spricht wirklich zu mir! –

4

alle Funktionen in einem Skript Suchen und filtern dann auf, was Sie (unter der Annahme, Powershell v2) ausschließen möchten:

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

Dies ist die Technik, die ich für v2 verwendet, um eine ISE Function Explorer zu erstellen. Ich sehe jedoch keinen Grund, warum dies mit Klartext außerhalb von ISE nicht funktioniert. Sie müssen jedoch die Caret-Zeilen-Details umgehen. Dies ist nur ein Beispiel dafür, wie Sie erreichen können, was Sie wollen.

Jetzt filtern, was nicht benötigt wird und dieses an Export-ModuleMember weiterleiten!

$functions | ?{ $_.FunctionName -ne "your-excluded-function" } 

Wenn Sie Powershell v3 verwenden, die parser makes it a lot easier.

0

Meine Lösung, Powershell-V3, wie Ravikanth angedeutet (die V2 in seiner Lösung wurde unter Verwendung), ist ein PSParser Modul zu definieren:

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 '*' 

Und in einem Modul, wenn ich ausschließen möchten gegebene Funktion, würde sie die letzte Zeile wie:

Export-ModuleMember -Function ((Get-PSFunctionNames $PSCommandPath) | Where { $_ -ne 'MyPrivateFunction' }) 

Beachten Sie, dass dies nur in Powershell-V3 oder höher arbeiten, weil der AST-Parser und $PSCommandPath wurden in Version 3 eingeführt