2011-03-25 132 views
4

有一种简单的方法来从一个PowerShell脚本文件解析PARAMS解析PowerShell脚本参数

param(
    [string]$name, 
    [string]$template 
) 

我已经开始读文件,并想知道是否有更好的办法,也许是帮助/ 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; 
     } 
    } 
} 

回答

4

至少有两种可能性。第一个(恕我直言更好):使用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 
1

我不知道你在做什么,是否记录你的脚本?在这种情况下,请看Get-Help about_Comment_Based_Help。它会告诉你如何去做,之后你可以在你的脚本/模块上使用Get-Help

如果您经过更严格的参数处理,请参阅about_functions_advanced_parametersabout_functions_cmdletbindings了解如何更好地构造参数。例如,

[Parameter(Position=0,Mandatory=$true,HelpMessage='Enter architecture("OSX","WinXP","Win7","Linux")')] [ValidateSet("OSX","WinXP","Win7","Linux")] [string]$architecture

将使该参数强制性的,从命令的0位置读出,只允许从给定的值,并给要求输入如果在一个简短的帮助信息没有给出该参数。

3

我喜欢@stej提出的Get-Command解决方案。不幸的是,如果脚本参数指定了明确的类型并且这种类型的程序集尚未加载到会话中,则它不起作用。这就是为什么我仍然使用这个脚本:Get names of script parameters

+0

+1我得看看System.Management.Automation.PSParser.Tokenize – djeeg 2011-03-25 11:43:13