如何在 PowerShell 中要求命令行参数(不是参数)?

Posted

技术标签:

【中文标题】如何在 PowerShell 中要求命令行参数(不是参数)?【英文标题】:How to require command-line arguments (not parameters) in the PowerShell? 【发布时间】:2015-04-28 22:44:07 【问题描述】:

不同于:How to handle command-line arguments in PowerShell

在 powershell 脚本中处理未命名命令行参数的最佳方法是什么?

例如,我有一个我想运行的 powershell 脚本

.\test.ps1 L3

如果未提供 L3,则会出现错误。我不想运行它:

.\test.ps1 -lab L3

我当前的脚本:

$args[0] 

如果参数被省略,则不会导致错误。

这看起来很有希望,还没有尝试过: https://technet.microsoft.com/en-us/library/hh847743.aspx * 编辑:* 有希望的链接很有用——我用它来形成我所有的例子

【问题讨论】:

为什么不想要命名参数(parameters)?它们使代码更具可读性,如果您正确设置参数,我认为您可以在传递它们时不命名它们,只要您以正确的顺序执行。 命名参数很棒。但是这个脚本总是需要这个参数,每次我使用它都会节省三到四次击键。 如果它是唯一的参数,您可以将其命名并以未命名的形式传递,PowerShell 将处理它就好了。不要为了您的方便而写作 - 写作是为了让下一个必须使用它的人(而不是您)可以理解您的脚本。 此参数仅在命令行中提供,不在其他脚本中提供。我同意在脚本中,命名参数是一件好事。 我的观点仍然存在。即使是在命令行中,为了让下一个人理解,而不是为了方便。命名参数几乎总是一件好事,无论如何 - 当有人必须修改此脚本以添加另一个参数时,他们会希望它们命名。现在命名它不需要花费你任何费用,就去做吧。 【参考方案1】:

这成功了:

Param
  (
     [parameter(Position=0, Mandatory=$true)]
     [String]
     $LabNumber
  ) 

$LabNumber

第二个选项很有趣,但我更喜欢上面的 Mandatory=$true,因为如果你忘记它,它实际上会提示你输入它。

Param
  (
     [parameter(Position=0)]
     [String]
     $LabNumber=$(throw "LabNumber is required.  Usage Example: .\test.ps1 L3")
  ) 

$LabNumber

而且,正如@alroc 对所有参数的偏好,第二个参数必须命名:

Param
  (
     [parameter(Position=0, Mandatory=$true)]
     [String]
     $LabNumber,

     [alias("Submissions")] 
     [String]
     $LoginsFilename = "..\logins.txt"
  )
"LabNumber:"+$LabNumber
"LoginsFilename:"+$LoginsFilename

【讨论】:

以上是关于如何在 PowerShell 中要求命令行参数(不是参数)?的主要内容,如果未能解决你的问题,请参考以下文章

如何从PowerShell命令行转义管道字符以传递到非PowerShell命令

如何安装和配置 Azure PowerShell

如何将命令行参数传递给 PowerShell ps1 文件

powershell脚本,命令行参数传值,并绑定变量的例子

PowerShell 命令行参数和“--”

Powershell在远程计算机上使用命令行参数执行远程exe