处理命令行参数的“最佳”方法是什么?

似乎关于什么是“最好”的方法有几个答案,因此我被困在如何处理一些简单的事情上:

script.ps1 /n name /d domain

AND

script.ps1 /d domain /n name.

有没有一个插件可以更好地处理这个问题?我知道我是在白费力气。

显然,我已经拥有的并不漂亮,也不是“最好的”,但它确实有效。而且它很丑。

for ( $i = 0; $i -lt $args.count; $i++ ) {
    if ($args[ $i ] -eq "/n"){ $strName=$args[ $i+1 ]}
    if ($args[ $i ] -eq "-n"){ $strName=$args[ $i+1 ]}
    if ($args[ $i ] -eq "/d"){ $strDomain=$args[ $i+1 ]}
    if ($args[ $i ] -eq "-d"){ $strDomain=$args[ $i+1 ]}
}
Write-Host $strName
Write-Host $strDomain

当前回答

你这是在白费力气。普通的PowerShell脚本有以-开头的参数,就像script一样。Ps1 -server http://devserver

然后在一个参数部分中处理它们(注意,这必须从脚本中的第一个非注释行开始)。

你也可以为你的参数指定默认值,如果不可用,从控制台读取它们或停止脚本执行:

 param (
    [string]$server = "http://defaultserver",
    [Parameter(Mandatory=$true)][string]$username,
    [string]$password = $( Read-Host "Input password, please" )
 )

在脚本中,您可以简单地

write-output $server

因为所有的参数都变成了脚本范围内可用的变量。

在这个例子中,如果脚本调用时没有使用默认值,$server将获得默认值;如果省略-username参数,脚本将停止;如果省略-password参数,则要求终端输入。

更新: 您可能还想向PowerShell脚本传递一个“flag”(一个布尔true/false参数)。例如,您的脚本可能接受“强制”,当不使用强制时,脚本以更谨慎的模式运行。

关键字是[switch]参数类型:

 param (
    [string]$server = "http://defaultserver",
    [string]$password = $( Read-Host "Input password, please" ),
    [switch]$force = $false
 )

在脚本中,你可以这样使用它:

if ($force) {
  //deletes a file or does something "bad"
}

现在,当调用脚本时,你可以像这样设置switch/flag参数:

.\yourscript.ps1 -server "http://otherserver" -force

如果显式地想声明没有设置标志,有一个特殊的语法

.\yourscript.ps1 -server "http://otherserver" -force:$false

指向微软相关文档的链接(适用于PowerShell 5.0;但3.0和4.0版本也可在链接):

about_Scripts about_Functions about_Functions_Advanced_Parameters

其他回答

你这是在白费力气。普通的PowerShell脚本有以-开头的参数,就像script一样。Ps1 -server http://devserver

然后在一个参数部分中处理它们(注意,这必须从脚本中的第一个非注释行开始)。

你也可以为你的参数指定默认值,如果不可用,从控制台读取它们或停止脚本执行:

 param (
    [string]$server = "http://defaultserver",
    [Parameter(Mandatory=$true)][string]$username,
    [string]$password = $( Read-Host "Input password, please" )
 )

在脚本中,您可以简单地

write-output $server

因为所有的参数都变成了脚本范围内可用的变量。

在这个例子中,如果脚本调用时没有使用默认值,$server将获得默认值;如果省略-username参数,脚本将停止;如果省略-password参数,则要求终端输入。

更新: 您可能还想向PowerShell脚本传递一个“flag”(一个布尔true/false参数)。例如,您的脚本可能接受“强制”,当不使用强制时,脚本以更谨慎的模式运行。

关键字是[switch]参数类型:

 param (
    [string]$server = "http://defaultserver",
    [string]$password = $( Read-Host "Input password, please" ),
    [switch]$force = $false
 )

在脚本中,你可以这样使用它:

if ($force) {
  //deletes a file or does something "bad"
}

现在,当调用脚本时,你可以像这样设置switch/flag参数:

.\yourscript.ps1 -server "http://otherserver" -force

如果显式地想声明没有设置标志,有一个特殊的语法

.\yourscript.ps1 -server "http://otherserver" -force:$false

指向微软相关文档的链接(适用于PowerShell 5.0;但3.0和4.0版本也可在链接):

about_Scripts about_Functions about_Functions_Advanced_Parameters