在脚本文件中搜索参数
本文关键字:搜索 参数 文件 脚本 | 更新日期: 2023-09-27 18:02:20
我正在寻找一种方法在c#中搜索PowerShell脚本文件的参数。
PowerShell脚本的顶部包含以下内容:
[CmdletBinding()]
param(
[Parameter(Position=1, Mandatory=$true)] [string]$Domain,
[Parameter(Position=2, Mandatory=$true)] [string]$SIPDomain,
[Parameter(Position=3, Mandatory=$true)] [string]$RegistrarPool,
[Parameter(Position=4, Mandatory=$true)] [string]$ExchangeServer,
[Parameter(Position=5, Mandatory=$true)] [string]$OU,
[Parameter(Position=6, Mandatory=$false)] [string]$SleepTime="10",
[Parameter(Position=7, Mandatory=$false)] [bool]$CreateAA=$true,
[Parameter(Position=8, Mandatory=$false)] [bool]$CreateSA=$true
)
对于每个参数,我想存储它的位置,无论是强制的,类型,变量名和默认值(如果有的话)。我也希望所有,但变量是强制性的,因为一些脚本可能有非常基本的参数,例如
param($name, $test)
对于上面的例子,我想要一个看起来像这样的对象:
位置必选类型变量DefaultValue('='后面的位)
1 $true String $Domain
2 $true String $SIPDomain
3 $true String $RegistrarPool
4 $true String $ExchangeServer
5 $true String $OU
6 $false String $SleepTime 10
7 $false bool $CreateAA $true
8 $false bool $CreateSA $true
我花了几个小时试图使用正则表达式得到正确的分割,但我认为这种模式对我来说有点太复杂了。
非常感谢你的帮助。
谢谢,安德鲁。
您可以使用以下代码来获得您指定的相同输出:
var matches = Regex.Matches(script, @"'s*'[Parameter'(.*?')'].*?,");
foreach (var match in matches)
{
string result = Regex.Replace(match.ToString().Trim(), @".*Position=(.*?),'s*Mandatory=(.*?)').*?'[(.*?)'](.*?)(=""(.*?)""|'s*),", "$1 $2 $3 $4 $6");
Console.WriteLine(result);
}
首先匹配包含Parameter
模式的行。然后,对于其中的每一行,它提取所需的输出。
要将数据转换为变量,请在foreach
循环中使用以下行:
var datamatch = Regex.Match(match.ToString().Trim(), @".*Position=(.*?),'s*Mandatory=(.*?)').*?'[(.*?)'](.*?)(=""(.*?)""|'s*),");
然后使用datamatch.Groups[1]
、datamatch.Groups[2]
等来获取字符串,然后将字符串解析为所需的类型。例如,对于整数使用int.Parse
这只适用于V3:
(@'
[CmdletBinding()]
param(
[Parameter(Position=1, Mandatory=$true)] [string]$Domain,
[Parameter(Position=2, Mandatory=$true)] [string]$SIPDomain,
[Parameter(Position=3, Mandatory=$true)] [string]$RegistrarPool,
[Parameter(Position=4, Mandatory=$true)] [string]$ExchangeServer,
[Parameter(Position=5, Mandatory=$true)] [string]$OU,
[Parameter(Position=6, Mandatory=$false)] [string]$SleepTime="10",
[Parameter(Position=7, Mandatory=$false)] [bool]$CreateAA=$true,
[Parameter(Position=8, Mandatory=$false)] [bool]$CreateSA=$true
)
'@).split("`n") |
foreach {$_.trim()} | sc testparams.ps1
$AST = [System.Management.Automation.Language.Parser]::
ParseFile('c:'testfiles'testparams.ps1',[ref]$null,[ref]$null)
$AST.ParamBlock.Parameters |
foreach {
$IsMandatory = $_.Extent.Text -match 'Mandatory='$true'
$Position = $_.Extent.Text -replace '.+Position=('d+).+','$1'
New-Object PSObject -Property @{
Name = $_.Name
Type = $_.StaticType
Position = $Position
Mandatory = $IsMandatory
}
} | Select Name,Type,Position,Mandatory | ft -auto
Name Type Position Mandatory
---- ---- -------- ---------
$Domain System.String 1 True
$SIPDomain System.String 2 True
$RegistrarPool System.String 3 True
$ExchangeServer System.String 4 True
$OU System.String 5 True
$SleepTime System.String 6 False
$CreateAA System.Boolean 7 False
$CreateSA System.Boolean 8 False