2016-12-07 9 views
1

をすべての機能を実行します。私のようないくつかの機能とスクリプトを使用している場合は、スクリプトで

私はそれぞれの名前を指定しなくても、同じスクリプトでは、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 |場所 - オブジェクト{![文字列] :: IsNullOrWhiteSpace($ _。名前)} | ForEach-Object {&$ _。Name} –

0

ファイルを解析し、ASTから関数名を取得するのがおそらく最も信頼できるオプションです。

よりローテクのアプローチは、単に前に、スクリプトを調達した後、機能一覧をdiffをすることです:

$InitialFunctions = Get-ChildItem function: -Name 
. C:\path\to\script.ps1 
Get-ChildItem function: -Name |Where-Object {$InitialFunctions -notcontains $_} |ForEach-Object { 
    & $_ 
} 
関連する問題