2013-06-27 30 views
12

我有一個powershell腳本,它解析一個文件,併發送一封電子郵件,如果它檢測到某種模式。我在一個函數中設置了電子郵件代碼,當我從ISE運行它時,它一切正常,但我使用PS2EXE能夠將腳本作爲服務運行,但它不能識別函數「email」。我的代碼類似於此Powershell腳本不能識別我的功能

#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. 

回答

22

PowerShell進程因此函數的定義必須是函數調用之前:

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

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

它可能在ISE中正常工作,因爲您在內存中的函數定義仍然來自之前的運行或測試。

+0

感謝它現在的作品! – laitha0

0

當涉及到函數調用,PowerShell是從其他編程語言相當不同在以下幾個方面:

  1. 當傳遞參數的函數,括號內是不允許(並引發解析錯誤如果Set-StrictMode設置爲-version 2.0或更高/ Latest,則必須使用括號括起來的參數來調用一個方法,該方法可以是.NET方法或用戶定義的方法(在類中定義 - 在PS中5.0或以上)。
  2. 參數以空格分隔,而不是逗號分隔。
  3. 在定義功能的地方小心。作爲PowerShell的順序處理線由行中自上而下的順序,因此功能必須之前違抗函數被調用:

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

在ISE,所定義的函數調用如下功能可以顯示爲正在工作,但(注意)它是上一次運行時內存中緩存的函數定義,所以如果您已更新了被擰緊的函數。