将CLI参数传递给PowerShell中的函数
我有一个包含多个函数的PowerShell脚本。其中一个函数应该接收命令行参数。下面是一个与我正在做的类似的脚本:将CLI参数传递给PowerShell中的函数,powershell,powershell-3.0,Powershell,Powershell 3.0,我有一个包含多个函数的PowerShell脚本。其中一个函数应该接收命令行参数。下面是一个与我正在做的类似的脚本: $mydocs = [Environment]::GetFolderPath("MyDocuments") function example() { Param( [string]$name = "testfolder", [switch]$foo = $false ) $newdir = $mydocs + "\" + $name if (!(
$mydocs = [Environment]::GetFolderPath("MyDocuments")
function example() {
Param(
[string]$name = "testfolder",
[switch]$foo = $false
)
$newdir = $mydocs + "\" + $name
if (!(Test-Path $newdir)) { mkdir $newdir }
}
example
所以当我运行这个:
.\example.ps1 -name anewfolder -foo
我希望函数示例使用这些参数
由于作用域,我的函数没有
$args
。我将Write Host$args
放入函数中进行双重检查,它不返回任何结果。如何提取父参数,将它们传递到参数中,并让示例与参数一起运行?或者我应该删除函数并在父作用域中运行这部分代码吗?如果要将参数传递给脚本,需要像函数一样在Param()块中捕获它们。或者,您可以使用范围选择器访问脚本args,如$script:args
Param([String]$Name,[Switch]$Foo)
$mydocs = [Environment]::GetFolderPath("MyDocuments")
function example
{
param(
[string]$name,
[switch]$foo
)
$newdir = Join-Path $mydocs $name
if (!(Test-Path $newdir)) { mkdir $newdir }
}
example -Name $Name -Foo
现在,\example.ps1-name anewfolder-foo将成功。如果要向脚本传递参数,需要像函数一样在Param()
块中捕获它们。或者,您可以使用范围选择器访问脚本args,如$script:args
Param([String]$Name,[Switch]$Foo)
$mydocs = [Environment]::GetFolderPath("MyDocuments")
function example
{
param(
[string]$name,
[switch]$foo
)
$newdir = Join-Path $mydocs $name
if (!(Test-Path $newdir)) { mkdir $newdir }
}
example -Name $Name -Foo
现在,\example.ps1-name anewfolder-foo
将获得成功。$args
函数中的变量与脚本全局范围中的$args
不同。向函数传递任意脚本参数的一种非常简单的方法是$args
:
example @args
但是,请注意,这不是一种非常干净的方法。按照建议,最好正确地参数化脚本,并有选择地将这些参数传递给函数
Param(
[string]$name,
[int]$bar,
[switch]$foo
)
function example() {
Param(
[string]$name = "testfolder",
[switch]$foo
)
$newdir = "${mydocs}\${name}"
if (!(Test-Path $newdir)) { mkdir $newdir }
}
$params = @{}
if ($PSBoundParameters.ContainsKey('name')) { $params['name'] = $name }
if ($PSBoundParameters.ContainsKey('foo')) { $params['foo'] = $true }
example @params
函数中的$args
变量与脚本全局范围中的$args
变量不同。向函数传递任意脚本参数的一种非常简单的方法是$args
:
example @args
但是,请注意,这不是一种非常干净的方法。按照建议,最好正确地参数化脚本,并有选择地将这些参数传递给函数
Param(
[string]$name,
[int]$bar,
[switch]$foo
)
function example() {
Param(
[string]$name = "testfolder",
[switch]$foo
)
$newdir = "${mydocs}\${name}"
if (!(Test-Path $newdir)) { mkdir $newdir }
}
$params = @{}
if ($PSBoundParameters.ContainsKey('name')) { $params['name'] = $name }
if ($PSBoundParameters.ContainsKey('foo')) { $params['foo'] = $true }
example @params
要这样做,您必须将相同的param()
集添加到脚本顶部,然后使用指定的参数调用函数(如您所做)。要这样做,您必须将相同的param()
集添加到脚本顶部,然后调用函数(如您所做)使用指定的参数。此答案不正确。提问者希望函数使用传递到脚本中的参数。您的答案只是硬编码$foo的值。如果将脚本调用为“.\example.ps1-name anewfolder”,函数仍会将$foo视为$true。此答案不正确。提问者希望函数使用传递到脚本中的参数。您的答案只是硬编码$foo的值。如果将脚本调用为“.\example.ps1-name anewfolder”,函数仍会将$foo视为$true。与@TheIncorrigible1相比,您的答案是正确的。但我希望有一种更简单的方法,类似于他的答案,不仅正确地传递$name,而且正确地传递开关$foo。@JohnPankowicz好吧,您可以简单地执行example@PSBoundParameters
,但这将传递给脚本的所有参数,而不仅仅是对函数有效的参数。这意味着参数-bar 42
也将传递给函数,这可能会导致问题,也可能不会导致问题,具体取决于代码的其余部分。与@TheIncorrigible1相比,您的答案是正确的。但我希望有一种更简单的方法,类似于他的答案,不仅正确地传递$name,而且正确地传递开关$foo。@JohnPankowicz好吧,您可以简单地执行example@PSBoundParameters
,但这将传递给脚本的所有参数,而不仅仅是对函数有效的参数。这意味着参数-bar 42
也将传递给函数,这可能会导致问题,也可能不会导致问题,具体取决于代码的其余部分。