【问题标题】:Powershell validating params for command line argsPowershell 验证命令行参数的参数
【发布时间】:2018-04-26 19:07:49
【问题描述】:

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

Param([string]$UserName)

如果我将它包装在一个函数中,然后从命令行运行它:

例如: ./Script.ps1 -UserName BLAH

它没有被分配给$UserName

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

这是为什么呢?

【问题讨论】:

  • 还是不行。我做了 .\Test.ps1 MainFunction -UserName 测试,它仍然不存储值
  • 是什么让你认为它应该是?命令行参数被强制进入一些随机函数,仅仅因为函数存在,覆盖了你显式调用没有任何参数的函数的事实?那将..无法使用。
  • 抱歉我没关注你?根据我所阅读的内容,任何类型的命令行参数验证都需要在函数中。所以在 Param() 之后你使用 Process{Try{test}Catch{}}
  • 这是几个不同的想法混合在一起。您可以在脚本中编写代码并从命令行运行它。这可以包括没有任何功能的参数和参数验证。它可以(单独)包括 process/try/catch 块。除此之外,您可以在函数中编写代码,其中也可以包含所有这些内容,并且与命令行无关。除了所有这些之外,您还可以“点源”或“导入模块”一个脚本,这使得其中的函数可以直接从命令行使用,而不是调用脚本文件名。

标签: powershell command-line


【解决方案1】:

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

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

Param([string]$UserName)

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

MainFunction -UserName "Chuck Norris"

或者,您可以使用函数内部脚本范围内的 UserName,方法是使用 $script: 来使用该范围内的变量。

Param([string]$UserName)

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

MainFunction

【讨论】:

    【解决方案2】:

    解决方案:

    Function MainFunction
    {
      Param([string]$UserName)
      Write-Host $UserName
    }
    #Call Mainfunction
    MainFunction  -UserName $args[0]
    

    来自 CMD 的调用:

    powershell -File "Script.ps1" "Chuck Norris"
    

    【讨论】:

    • @user1158745 更新了 CMD 的解决方案
    最近更新 更多