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

Function 如何将参数传递给PowerShell中的函数,function,powershell,powershell-3.0,Function,Powershell,Powershell 3.0,我有下面的PowerShell脚本 Function Publish { Param( [parameter(Mandatory=$true)] [String] $RELEASEDIR, [parameter(Mandatory=$true)] [String] $SERVICENAME, [parameter(Mandatory=$true)] [Str

我有下面的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"

独立于脚本文件。

如果要像示例中那样通过调用.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请求未应用参数的值

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


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

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

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


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

据我所知,您的要求是运行函数,你还必须在Jenkins中编译脚本

您可以这样做:

假设脚本名为RPCPublish.ps1,路径为D:\Folder

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

所以在你的情况下

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

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

据我所知,您的要求是运行函数,您还必须在Jenkins中编译脚本

您可以这样做:

假设脚本名为RPCPublish.ps1,路径为D:\Folder

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

所以在你的情况下

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

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

我使用了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\"

我使用了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\"

\rPCPusi.PS1= /=您的函数<代码>发布< /代码>不理解该脚本,并执行<代码>发布-ARG1-ARG2-ARG3,也可以考虑将函数名更改为动词No.FATATE。脚本中的
publish
功能不起作用。您传递给脚本的参数没有到达函数,因此它开始询问这些参数。我应该如何执行它。\RPCPublish.ps1=/=您的函数
publish
不理解脚本,并且执行
publish-arg1-arg2-arg3
,考虑将函数名改为动名词格式。你的脚本不接受参数。脚本中的
publish
功能不起作用。你传递给脚本的参数没有到达你的函数,因此它开始要求它们。我应该如何执行它我怎样才能在Jenkins中执行相同的参数不知道,我不做Jenkins。也许这会有帮助:我怎样才能在詹金斯执行同样的操作呢?不知道,我不做詹金斯。也许这会有帮助:插件有名字吗?@PeterMortensen插件有名字吗?@PeterMortensen