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

问题描述 投票:1回答:4

我有以下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:

即使在执行时传递参数,脚本也会再次期待它。我在这做错了什么?

function powershell powershell-v3.0
4个回答
1
投票

你的脚本正在创建一个函数,“发布”,(第1-17行),然后在没有参数的情况下调用它(第18行)。由于您已将参数定义为必需参数(第4,7,10行),因此在调用函数(第18行)时未能提供参数会导致PowerShell请求未提供参数的值。

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

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


5
投票

如果要通过调用示例中的.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"

独立于脚本文件。


0
投票

根据我的理解,您的要求是运行该函数,您还必须在Jenkins中编译脚本。

你可以这样做:

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

我可以看到你的函数名是Publish。

所以在你的情况下,

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

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


0
投票

我使用了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\"
© www.soinside.com 2019 - 2024. All rights reserved.