Powershell正在验证命令行参数的参数

Powershell正在验证命令行参数的参数,powershell,command-line,Powershell,Command Line,我不明白这一点。如果我将参数放在脚本的顶部,然后使用命令行运行脚本并指定用户名,则用户名将分配给$UserName Param([string]$UserName) Function MainFunction { Param([string]$UserName) } #Call Mainfunction MainFunction; 如果我将其包装到函数中,然后从命令行运行它: 例如:/Script.ps1-用户名等等 未将其分配给$UserName Param([string]$User

我不明白这一点。如果我将参数放在脚本的顶部,然后使用命令行运行脚本并指定用户名,则用户名将分配给
$UserName

Param([string]$UserName)
Function MainFunction
{
  Param([string]$UserName)
}
#Call Mainfunction
MainFunction;
如果我将其包装到函数中,然后从命令行运行它:

例如:
/Script.ps1-用户名等等

未将其分配给
$UserName

Param([string]$UserName)
Function MainFunction
{
  Param([string]$UserName)
}
#Call Mainfunction
MainFunction;

为什么会这样?

解决方案:

Function MainFunction
{
  Param([string]$UserName)
  Write-Host $UserName
}
#Call Mainfunction
MainFunction  -UserName $args[0]
powershell -File "Script.ps1" "Chuck Norris"
从CMD呼叫:

Function MainFunction
{
  Param([string]$UserName)
  Write-Host $UserName
}
#Call Mainfunction
MainFunction  -UserName $args[0]
powershell -File "Script.ps1" "Chuck Norris"

解决方案:

Function MainFunction
{
  Param([string]$UserName)
  Write-Host $UserName
}
#Call Mainfunction
MainFunction  -UserName $args[0]
powershell -File "Script.ps1" "Chuck Norris"
从CMD呼叫:

Function MainFunction
{
  Param([string]$UserName)
  Write-Host $UserName
}
#Call Mainfunction
MainFunction  -UserName $args[0]
powershell -File "Script.ps1" "Chuck Norris"

代码将参数放置在函数的作用域中。当您运行
Script.ps1-UserName BLAH
时,此参数将在脚本的范围内传递

如果要向下传递变量,需要两个参数块,一个用于脚本,一个用于函数。然后将脚本的用户名作为函数的参数传递给函数

Param([string]$UserName)

Function MainFunction {
    Param([string]$UserName)
}

MainFunction -UserName "Chuck Norris"
或者,您可以使用函数内部脚本范围中的用户名,方法是使用
$script:
使用该范围中的变量

Param([string]$UserName)

Function MainFunction {
    Write-Output "Example use of $script:UserName"
}

MainFunction

代码将参数放置在函数的作用域中。当您运行
Script.ps1-UserName BLAH
时,此参数将在脚本的范围内传递

如果要向下传递变量,需要两个参数块,一个用于脚本,一个用于函数。然后将脚本的用户名作为函数的参数传递给函数

Param([string]$UserName)

Function MainFunction {
    Param([string]$UserName)
}

MainFunction -UserName "Chuck Norris"
或者,您可以使用函数内部脚本范围中的用户名,方法是使用
$script:
使用该范围中的变量

Param([string]$UserName)

Function MainFunction {
    Write-Output "Example use of $script:UserName"
}

MainFunction

它仍然不起作用。我知道。\Test.ps1 main函数-用户名测试,但它仍然没有存储值。您认为它应该是什么?命令行参数强制进入某个随机函数,仅仅因为该函数存在,覆盖了您显式调用该函数而不使用任何参数的事实?那将是。。无法使用。对不起,我没有跟踪你?根据我所读的内容,任何类型的命令行参数验证都需要在函数中进行。因此,在Param()之后,使用进程{Try{test}Catch{}},这是几个不同的想法混合在一起的结果。您可以在脚本中编写代码并从命令行运行它。这可以包括参数和不带任何函数的参数验证。它可以(单独)包括进程/尝试/捕获块。另外,您可以在函数中编写代码,函数也可以包含所有这些内容,而与命令行无关。除此之外,您还可以“点源代码”或“导入模块”脚本,这样就可以直接从命令行使用脚本中的函数,而不用调用脚本文件名。它仍然不起作用。我知道。\Test.ps1 main函数-用户名测试,但它仍然没有存储值。您认为它应该是什么?命令行参数强制进入某个随机函数,仅仅因为该函数存在,覆盖了您显式调用该函数而不使用任何参数的事实?那将是。。无法使用。对不起,我没有跟踪你?根据我所读的内容,任何类型的命令行参数验证都需要在函数中进行。因此,在Param()之后,使用进程{Try{test}Catch{}},这是几个不同的想法混合在一起的结果。您可以在脚本中编写代码并从命令行运行它。这可以包括参数和不带任何函数的参数验证。它可以(单独)包括进程/尝试/捕获块。另外,您可以在函数中编写代码,函数也可以包含所有这些内容,而与命令行无关。此外,您还可以“点源”或“导入模块”脚本,这样可以直接从命令行使用脚本中的函数,而不是调用脚本文件名。@user1158745更新了脚本的解决方案CMD@user1158745更新了CMD的解决方案