Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将CLI参数传递给PowerShell中的函数_Powershell_Powershell 3.0 - Fatal编程技术网

将CLI参数传递给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 (!(

我有一个包含多个函数的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
放入函数中进行双重检查,它不返回任何结果。如何提取父参数,将它们传递到参数中,并让示例与参数一起运行?或者我应该删除函数并在父作用域中运行这部分代码吗?

如果要将参数传递给脚本,需要像函数一样在
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
也将传递给函数,这可能会导致问题,也可能不会导致问题,具体取决于代码的其余部分。