web-dev-qa-db-ja.com

Powershellスクリプトが関数を認識しない

ファイルを解析して特定のパターンを検出した場合にメールを送信するPowerShellスクリプトがあります。関数内に電子メールコードを設定し、ISEから実行するとすべて正常に機能しますが、スクリプトをサービスとして実行できるようにPS2EXEを使用しましたが、それは関数「メール」。私のコードはこれに似ています

#Do things | 
foreach{
    email($_)
}

function email($text){
    #email $text
}

それをexeに変換して実行すると、次のエラーが発生します。

The term 'email' is not recognized as teh name of a cmdlet, function, script file, 
or operable program. Check the spelling of the name, or if a path was included, 
verify that the path is correct and try again.
16
laitha0

Powershellは順番に(トップダウンで)処理するため、関数定義は関数呼び出しの前にある必要があります。

function email($text){
    #email $text
}

#Do things | 
foreach{
    email($_)
}

以前の実行またはテストからの関数定義がメモリに残っているため、おそらくISEで正常に機能します。

31
JNK

関数呼び出しに関しては、PowerShellは他のプログラミング言語と次の点でかなり異なります。

  1. 引数を関数に渡す場合、括弧は許可されません(Set-StrictModeが-version 2.0以上/最新に設定されている場合は解析エラーが発生します)。ただし、括弧で囲まれた引数を使用してメソッドを呼び出す必要があります。 .NETメソッドまたはユーザー定義のメソッド(クラス内で定義されている-PS 5.0以降)。
  2. パラメーターはスペースで区切られ、コンマで区切られません。
  3. 関数を定義する場所には注意してください。 PowerShellは1行ずつ上から下へと順番に処理するため、関数を定義する必要がありますbeforeその関数が呼び出されます。

        Function func($para1){
              #do something
        }
        func "arg1"  #function-call
    

ISEでは、関数呼び出しの下で定義された関数が機能しているように見えるかもしれませんが、(注意)以前の実行からメモリにキャッシュされた関数定義であるため、関数を更新した場合、ねじ込みます。

2
Eddie Kumar