如何在PowerShell中处理命令行参数

23 浏览
0 Comments

如何在PowerShell中处理命令行参数

如何最佳地处理命令行参数?

似乎有几种答案可以处理“最佳”方式,因此我不知道如何处理简单的事情,比如:

script.ps1 /n name /d domain

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

admin 更改状态以发布 2023年5月23日
0
0 Comments

你正在重新发明轮子。正常的PowerShell脚本的参数以-开头,例如script.ps1 -server http://devserver

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

你还可以为你的参数指定默认值,如果不存在,则从控制台读取参数,或停止脚本的执行:

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

在脚本内部,你可以简单地:

write-output $server

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

在这个例子中,如果调用脚本时没有设置$server,它将会得到一个默认值,如果省略了-username参数,脚本将停止并要求终端输入。如果省略了-password参数,则从控制台读取输入。

更新:

您还可能希望向PowerShell脚本传递一个“标志”(一个布尔值的true/false参数)。例如,当没有使用force操作时,您的脚本可以接受一个“force”的参数来执行更谨慎的模式。

此参数类型的关键字是[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"
}

现在,在调用脚本时,您将设置开关/标志参数:

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

如果您明确想表示未设置标志,那么有一个特殊的语法:

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

到相关的Microsoft文档的链接(适用于PowerShell 5.0,虽然版本3.0和4.0也可在链接中找到):

0