如何将参数传递给 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\"
我有下面的 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\"