如何在PowerShell中处理命令行参数
如何在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日
你正在重新发明轮子。正常的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也可在链接中找到):