【问题标题】:How to pass arguments to functions in PowerShell如何将参数传递给 PowerShell 中的函数
【发布时间】:2017-07-11 01:39:34
【问题描述】:

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

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

【问题讨论】:

  • .\RPCPublish.ps1 =/= 你的函数publish
  • 不明白
  • dotsource 脚本并执行publish -arg1 -arg2 -arg3,另外,考虑将函数名称更改为动词-名词格式
  • 您的脚本不接受参数。您的publish 函数在您的脚本中 可以。您传递给脚本的参数没有到达您的函数,因此它开始要求它们。
  • 应该如何执行

标签: function powershell powershell-3.0


【解决方案1】:

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

独立于脚本文件。

【讨论】:

  • 如何在 Jenkins 中执行同样的操作
  • 不知道,我不做詹金斯。也许这会有所帮助:hodgkins.io/…
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    你可以这样做:

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

    我可以看到您的函数名称是 Publish

    所以在你的情况下,

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 2022-10-07
      • 2011-06-26
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多