如何处理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
842720 次浏览

你这是在白费力气。普通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,则$server将获得默认值;如果省略-username参数,则脚本将停止;如果省略-password,则要求终端输入。

< p >更新: 你可能还想传递一个“旗帜”;(一个布尔true/false参数)到PowerShell脚本。例如,你的脚本可能会接受一个“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"
}

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

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

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

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

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