将 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