将 CLI 参数传递给 PowerShell 中的函数
Passing CLI arguments to a function in PowerShell
我有一个包含多个函数的 PowerShell 脚本。其中一个函数应该接收命令行参数。这是一个与我正在做的类似的脚本:
$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
放入函数中进行仔细检查,但 returns 什么也没有。我怎样才能拉出父参数,将它们传递给参数,并用我的参数获取 运行 的示例?或者我应该只删除函数和 运行 我在父范围内的这部分代码?
如果你想将参数传递给你的脚本,你需要像你的函数一样在 Param()
块中捕获它们。或者,您可以使用范围选择器访问脚本参数,例如 $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
是不同的变量。将任意脚本参数传递给函数的一种非常简单的方法是 splat $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
我有一个包含多个函数的 PowerShell 脚本。其中一个函数应该接收命令行参数。这是一个与我正在做的类似的脚本:
$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
放入函数中进行仔细检查,但 returns 什么也没有。我怎样才能拉出父参数,将它们传递给参数,并用我的参数获取 运行 的示例?或者我应该只删除函数和 运行 我在父范围内的这部分代码?
如果你想将参数传递给你的脚本,你需要像你的函数一样在 Param()
块中捕获它们。或者,您可以使用范围选择器访问脚本参数,例如 $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
是不同的变量。将任意脚本参数传递给函数的一种非常简单的方法是 splat $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