2011-03-25 151 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