20

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

2 回答 2

49

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

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

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

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

于 2013-06-27T15:51:33.767 回答
6

在函数调用方面,PowerShell 在以下方面与其他编程语言有很大不同:

  1. 将参数传递给函数时,不允许使用括号(如果 Set-StrictMode 设置为 -version 2.0 或更高版本/Latest,则会引发解析错误),但是,必须使用带括号的参数来调用方法,该方法可以是 .NET 方法或用户定义的方法(在类中定义 - 在 PS 5.0 或更高版本中)。

  2. 参数以空格分隔,而不是逗号分隔。

  3. 在定义函数的地方要小心。由于 PowerShell 按自上而下的顺序逐行处理,因此必须在调用该函数之前定义该函数:

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

在 Windows PowerShell ISE(或 Visual Studio Code)中,如果函数调用似乎正在工作,即使函数定义是在函数调用下方定义的,(请注意)这是因为它从先前的执行中缓存在内存中,一旦您更新函数定义,它也会失败。

于 2017-10-18T08:54:36.277 回答