将CLI参数传递给PowerShell

时间:2017-10-24 21:08:19

标签: powershell powershell-v3.0

我有一个包含多个功能的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,然后通过我的参数运行示例?或者我应该删除该函数并在父作用域中运行我的代码部分吗?

2 个答案:

答案 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}}