Powershell脚本无法识别我的功能

时间:2013-06-27 15:44:53

标签: powershell service exe

我有一个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.

2 个答案:

答案 0 :(得分:31)

Powershell按顺序进行处理(自上而下),因此函数定义需要在函数调用之前:

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

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

它可能在ISE中运行正常,因为你在内存中的函数定义仍然来自先前的运行或测试。

答案 1 :(得分:2)

对于函数调用,PowerShell在以下方面与其他编程语言完全不同:

  1. 将参数传递给函数时,不允许使用括号(如果Set-StrictMode设置为-version 2.0或更高/最新,则会引发解析错误),但是,必须使用带括号的参数来调用方法,它可以是.NET方法或用户定义的方法(在类中定义 - 在PS 5.0或更高版本中)。
  2. 参数以空格分隔,不以逗号分隔。
  3. 在定义功能的地方要小心。由于PowerShell按照自上而下的顺序逐行进行处理,因此必须在调用函数之前 > >

        Function func($para1){
              #do something
        }
        func "arg1"  #function-call
    
  4. 在ISE中,函数调用下面定义的函数可能看起来有效,但(请注意)它是上一次运行时内存中的缓存函数定义,所以如果你更新了函数,那么你就搞砸了。