如何将参数传递给 PowerShell 中的函数

How to pass arguments to functions in PowerShell

我有下面的 PowerShell 脚本

Function Publish
{
    Param(
        [parameter(Mandatory=$true)]
        [String]
        $RELEASEDIR,

        [parameter(Mandatory=$true)]
        [String]
        $SERVICENAME,

        [parameter(Mandatory=$true)]
        [String]
        $SERVER
    )

    Get-ChildItem "$RELEASEDIR\*"
    $service = Get-Service -Name $SERVICENAME -Computername $SERVER -ErrorAction SilentlyContinue
    $service.Status
}
Publish

我是如何执行的:

PS C:\Release\RPCPS> .\RPCPublish.ps1 -RELEASEDIR "C:\Location" -SERVICENAME "value" -SERVER "server"
cmdlet Publish at command pipeline position 1
Supply values for the following parameters:
RELEASEDIR:

即使在执行时传递了参数之后,脚本仍然期待它。我在这里做错了什么?

如果您想像您的示例那样通过调用 .ps1 来执行脚本,则无需使用函数。您的脚本应如下所示:

Param(
    [parameter(Mandatory=$true)]
    [String]
    $RELEASEDIR,
    [parameter(Mandatory=$true)]
    [String]
    $SERVICENAME,
    [parameter(Mandatory=$true)]
    [String]
    $SERVER
    )
Get-ChildItem "$RELEASEDIR\*"
$service = Get-Service -Name $SERVICENAME -Computername $SERVER -ErrorAction SilentlyContinue
$service.Status

参数直接传递给脚本,可以在那里使用。

另一方面,如果您想建立一个(可重用的)函数,只需从脚本中删除最后一行,该行调用不带参数的函数(这就是为什么它每次都要求强制参数) .

如果你去掉最后一行,你可以调用一次不带参数的脚本。之后你在当前会话中有一个新函数 Publish,你可以用

调用它
Publish -RELEASEDIR "C:\Release\Batchfile" -SERVICENAME "AmazonSSMAgent" -SERVER "10.0.1.91"

独立于脚本文件。

您的脚本正在创建一个函数 "Publish"(第 1-17 行),然后不带参数调用它(第 18 行)。由于您已将参数定义为必需参数(第 4、7、10 行),因此在调用函数时未能提供参数(第 18 行)会导致 PowerShell 请求未提供参数的值。

向脚本文件本身提供参数没有帮助;没有机制可以 "automagically" 将这些参数传递给脚本中的任何内容(您必须为此明确编写脚本代码)。

正如 Matt 在评论中所建议的那样,dot-source 删除第 18 行后的脚本,然后显式调用您的函数,传递参数 (publish -RELEASEDIR "C:\Release\Batchfile" -SERVICENAME "AmazonSSMAgent" -SERVER "10.0.1.91")。

据我了解,您的要求是 运行 函数 ,您还必须编译脚本詹金斯

你可以这样做:

假设您的脚本名称是 RPPCublish.ps1,路径是 D:\Folder.

而且我可以看到你的函数名称是 Publish

所以在你的情况下,

powershell -command "& { D:\folder\RPCPublish.ps1; Publish }"

您可以在脚本块中在此之后传递参数。

我使用了 PowerShell 插件 (PowerShell) 并执行了相同的操作。

. "C:\Release\RPCPS\RPCPublish.ps1"
FUunctionName -RELEASEDIR "C:\bin\Release" -SERVICENAME "Service" -SERVER "$env:SERVER" -DISPLAYNAME "Services Air" -BINPATH "D:\Build\Project.exe" -DESCRIPTION "This service hosts Air service" -DESTINATION "d$\Build\"