2016-12-07 5 views
1

Если у меня есть скрипт с некоторыми функциями, такими как:выполнение всех функций в скрипте

function FunctionOne{} 
function FunctionTwo{} 

Как я могу назвать их все в одной строке, в том же сценарии, без указания имени каждого функционировать?

Я хотел бы сделать что-то вроде:

Call-AllFunctionsInCurrentScriptConsecutively #calls FunctionOne then FunctionTwo 

ответ

1

This blog post предлагает использовать ParseFile() для разбора сценария:

$filename = 'C:\path\to\your.ps1' 

[ref]$tokens  = $null 
[ref]$parseErrors = $null 
$ast = [Management.Automation.Language.Parser]::ParseFile($filename, $tokens, $parseErrors) 

Затем вы можете вызывать функции (после дот-источников сценарий) по оператору вызова:

$ast.EndBlock.Statements | Where-Object { $_.Name } | ForEach-Object { & $_.Name } 

Для использования этого изделия из wi тонкий скрипт заменит имя файла $MyInvocation.MyCommand.Path.

+0

Забыл упомянуть, что я хотел бы сделать это в том же сценариях. –

+1

@Backwards_Dave '$ filename = $ MyInvocation.MyCommand.Path' –

+0

Спасибо. Это сработало хорошо. Мне просто нужно было изменить $ ast.EndBlock.Statements | ForEach-Object {& $ _. Name} до $ ast.EndBlock.Statements | Where-Object {! [String] :: IsNullOrWhiteSpace ($ _. Name)} | ForEach-Object {& $ _. Name} –

0

Разбор файла и захват имен функций из АСТ, вероятно, является самым надежным вариантом.

Более низкотехнологичный подход был бы просто дифф списка функций до и после снабжаю сценарий:

$InitialFunctions = Get-ChildItem function: -Name 
. C:\path\to\script.ps1 
Get-ChildItem function: -Name |Where-Object {$InitialFunctions -notcontains $_} |ForEach-Object { 
    & $_ 
} 
Смежные вопросы