2012-06-26 10 views

Respuesta

16

Mi respuesta de stock sobre la exclusión de funciones es usar la denominación del sustantivo del verbo para las funciones que quiero exportar, y usar los límites iniciales para todo lo demás.

Luego, Export-ModuleMember -function *-* se ocupa de ello.

+3

¡La simplicidad y la base de la convención de esta respuesta realmente me hablan! –

4

Encuentra todas las funciones en un guión y luego filtrar en base a lo que desea excluir (suponiendo 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 
    } 
} 

Esta es la técnica que utilicé para v2 para crear un ISE Function Explorer. Sin embargo, no veo una razón por la cual esto no funcione con texto plano fuera de ISE. Sin embargo, necesita solucionar los detalles de la línea de cuidado. Este es solo un ejemplo de cómo lograr lo que quieres.

Ahora, filtra lo que no se necesita y canaliza esto a Export-ModuleMember!

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

Si está utilizando v3 PowerShell, la parser makes it a lot easier.

0

Mi solución, utilizando PowerShell V3, como se insinuó por Ravikanth (que estaba usando V2 en su solución), es definir un módulo 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 '*' 

Y en un módulo, si quiero excluir una dada la función, la última línea se vería así:

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

Tenga en cuenta que esto sólo funcionará en PowerShell V3 o temprano porque el analizador AST y $PSCommandPath se introdujeron en la versión 3.

Cuestiones relacionadas