我正在将Korn shell脚本转换为PowerShell。现有脚本使用getopt命令并使用区分大小写的命令行参数(例如,v的行为与V不同)。
set -- `getopt T:ZISedDACkpWhzLJMl:n:g:x:r:R:V:v:N:G:o:m:O: $*`
for c in $*
do
case $c in
-h) echo $USAGE
--) shift; break;;
esac
done
对于PowerShell版本,我想保持参数名称和行为完全相同。我一直在调查命名函数参数作为一种可能性;但是,PowerShell不区分大小写,不允许使用重复的参数名称。所以,这不起作用。
function dowork ()
{
param
(
[string]$V,
[string]$v,
)
...
}
我可以使用自动$ args变量,该变量包含未声明参数的数组;但是,我不知道getopt命令的PowerShell等价物。如果没有实现我自己的getopt,还有另一种方法可以实现吗?
答案 0 :(得分:4)
在PowerShell中不能直接使用getopt做什么,而是建议不要直接重新创建它。正如您已经注意到的那样,参数大写并不重要,解析也是完全不同的,区分不是短期和长期期权,而是允许您缩短任何参数,只要它仍然是明确的。
我的建议是看看你是否可以为选项提供有意义的名称,这些名称可以使用PowerShell的参数解析,而不是反对它。然后,您可以包含有关getopt样式参数如何映射到PowerShell的文档(并且可能提供一个简单的脚本来在两者之间进行转换)。
答案 1 :(得分:1)
PowerShell变量和参数名称不区分大小写。
[CmdletBinding()]
Param(
[Parameter()]
[Alias('F')]
[string]$Foo
)
与
完全相同[CmdletBinding()]
Param(
[Parameter()]
[Alias('f')]
[string]$foo
)
使用参数:
调用任一脚本也是如此.\script.ps1 -Foo
.\script.ps1 -FOO
.\script.ps1 -foO
.\script.ps1 -F
.\script.ps1 -f
以上所有都做同样的事情。
底线:使用PowerShell的内置参数处理,您不能使用具有不同含义的大写和小写参数(例如-A
和-a
)。如果需要区分大小写的参数,则需要实现自己的参数解析器。不过,我强烈建议不要这样做,因为它与正常的PowerShell行为相矛盾。