2012-06-26 20 views
5

Tôi có một tập hợp lớn các hàm được định nghĩa trong mô-đun tập lệnh PowerShell. Tôi muốn sử dụng Export-ModuleMember -Function *, nhưng tôi muốn loại trừ chỉ một chức năng. Nó sẽ dễ dàng hơn cho tôi để loại trừ một chức năng này hơn là liệt kê tất cả các hàm được bao gồm. Có bất kì cách nào để đạt được điều này không?Tôi có thể loại trừ một chức năng đơn lẻ khỏi Export-ModuleMember không?

Trả lời

16

Câu trả lời của tôi về chức năng loại trừ là sử dụng cách đặt tên danh từ cho các chức năng tôi muốn xuất và sử dụng mũ ban đầu cho mọi thứ khác.

Sau đó, Export-ModuleMember -function *-* sẽ xử lý.

+3

Sự đơn giản và quy ước của câu trả lời này thực sự nói với tôi! –

4

Tìm tất cả các chức năng trong một kịch bản và sau đó lọc dựa trên những gì bạn muốn loại trừ (giả sử 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 
    } 
} 

Đây là kỹ thuật tôi sử dụng cho v2 để tạo ra một ISE Function Explorer. Tuy nhiên, tôi không thấy lý do tại sao điều này sẽ không hoạt động với văn bản thuần bên ngoài ISE. Bạn cần phải giải quyết các chi tiết dòng chú ý. Đây chỉ là một ví dụ về cách đạt được những gì bạn muốn.

Bây giờ, hãy lọc những gì không được yêu cầu và gửi đường ống này đến Export-ModuleMember!

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

Nếu bạn đang sử dụng PowerShell v3, parser makes it a lot easier.

0

Giải pháp của tôi, sử dụng PowerShell V3, như ám bởi ravikanth (người đã sử dụng V2 trong giải pháp của mình), là xác định một mô-đun 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 '*' 

Và trong một module, nếu tôi muốn loại trừ một được chức năng, dòng cuối cùng sẽ như thế nào:

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

Lưu ý rằng điều này sẽ chỉ làm việc trong PowerShell V3 hay muộn vì phân tích cú pháp AST và $PSCommandPath đã được giới thiệu trong phiên bản 3.

Các vấn đề liên quan