Разобрать параметры сценария powershell - PullRequest
4 голосов
/ 25 марта 2011

Есть ли простой способ разобрать параметры из файла сценария 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 ]

4 голосов
/ 25 марта 2011

Есть как минимум две возможности. Первый (лучше): 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 голосов
/ 25 марта 2011

Мне нравится решение с Get-Command, предложенное @stej. К сожалению, это не работает, если в параметрах сценария указаны явные типы, а сборка такого типа еще не загружена в сеанс. Вот почему я все еще использую этот скрипт: Получить имена параметров скрипта

1 голос
/ 25 марта 2011

Я не совсем уверен, что вы ищете, это документирует ваши сценарии? В этом случае взгляните на Get-Help about_Comment_Based_Help. Он расскажет вам, как это сделать, и после этого вы можете использовать Get-Help в вашем скрипте / модуле.

Если вы после более строгой обработки параметров, посмотрите на about_functions_advanced_parameters и about_functions_cmdletbindings, как улучшить структуру параметров. Например,

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

сделает этот параметр обязательным, прочитает из позиции 0 команды, разрешит только значение из данного набора и выдаст краткое справочное сообщение при запросе ввода, если этот параметр не был задан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...