解析PowerShell脚本参数

4
有没有一种简单的方法从powershell脚本文件中解析参数?
param(
    [string]$name,
    [string]$template
)

我已经开始阅读文件,不知道是否有更好的方式,也许可以使用help/man命令?
class PowerShellParameter {
    public string Name;
    public string Type;
    public string Default;
}

string[] lines = File.ReadAllLines(path);
bool inparamblock = false;
for (int i = 0; i < lines.Length; i++) {
    if (lines[i].Contains("param")) {
        inparamblock = true;
    } else if (inparamblock) {
        new PowerShellParameter(...)
        if (lines[i].Contains(")")) {
            break;
        }
    }
}
3个回答

5

至少有两种可能性。第一种(我个人认为更好的):使用Get-Command命令:

# my test file
@'
param(
  $p1,
  $p2
)

write-host $p1 $p2
'@ | Set-content -path $env:temp\sotest.ps1
(Get-Command $env:temp\sotest.ps1).parameters.keys

对于所有会员,请查看

Get-Command $env:temp\sotest.ps1 | gm
#or
Get-Command $env:temp\sotest.ps1 | fl *

另一种(更困难的)方法是使用正则表达式。
[regex]::Matches((Get-Help $env:temp\sotest.ps1), '(?<=\[\[-)[\w]+') | select -exp Value

3

我喜欢@stej提出的使用Get-Command的解决方案。不幸的是,如果脚本参数有明确的类型,并且此类型的程序集尚未加载到会话中,则该方法无法工作。这就是为什么我仍然使用这个脚本:获取脚本参数名称


+1 我得研究一下 System.Management.Automation.PSParser.Tokenize。 - djeeg

1

我不太确定你想要什么,是要记录你的脚本吗?那么请看一下 Get-Help about_Comment_Based_Help。它将告诉你如何做到这一点,之后你可以在你的脚本/模块上使用 Get-Help

如果你想要更严格的参数处理,请参考 about_functions_advanced_parametersabout_functions_cmdletbindings,了解如何更好地结构化参数。例如,

[Parameter(Position=0,Mandatory=$true,HelpMessage='输入体系结构("OSX","WinXP","Win7","Linux")')] [ValidateSet("OSX","WinXP","Win7","Linux")] [string]$architecture

将使该参数强制执行,从命令的位置0读取值,仅允许给定集合中的值,并在请求输入时提供简短的帮助消息(如果未指定该参数)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接