我有一个包含多个功能的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
放入函数中以进行双重检查,并且它不返回任何内容。我如何拉出父args,将它们传递给params,然后通过我的参数运行示例?或者我应该删除该函数并在父作用域中运行我的代码部分吗?
答案 0 :(得分:1)
如果要将参数传递给脚本,则需要在函数具有的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
将会成功。
答案 1 :(得分:1)
$args
是与脚本全局范围内的$args
不同的变量。将任意脚本参数传递给函数的一种非常简单的方法是splat 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
但请注意,这不是一个非常干净的方法。最好是正确地参数化脚本并有选择地传递那些意图转到函数的参数,如TheIncorrigible1所示。
{{1}}