Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
96 / 17 / 5
Регистрация: 05.07.2015
Сообщений: 52
1

Как получить параметры командлета из конкретного именованного набора?

30.08.2016, 16:39. Показов 1534. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как получить параметры скрипта (командлета) из конкретного именованного набора?

например

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function test-param {
 
[CmdletBinding( DefaultParameterSetName="Filter",SupportsShouldProcess = $true )]
 
param(
    [Parameter(ValueFromPipeline=$True,
    ValueFromPipelineByPropertyName=$True)]
    [String[]]  $ComputerName,
 
    [Parameter(ParameterSetName="Filter",
    ValueFromPipelineByPropertyName=$True)]
    [String] $AppID,
 
    [Parameter(ParameterSetName="Filter",
    ValueFromPipelineByPropertyName=$True)]
    [String] $AppName
)
"-------PSBoundParameters"
$PSBoundParameters
"----ParameterSetName"
$PSCmdlet.ParameterSetName
 
}
test-param -AppID app1 -ComputerName comp1
Вывод
Код
-------PSBoundParameters

Key                                                                                            Value                                                                                         
---                                                                                            -----                                                                                         
AppID                                                                                          app1                                                                                          
ComputerName                                                                                   {comp1}
Может кто знает, как получить параметры только с ParametersetName="Filter", т.е. AppID?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.08.2016, 16:39
Ответы с готовыми решениями:

как получить массив ссылок с конкретного фрейма?
номер фрейма знаю var links = external.menuArguments.document.frames(framenum).links; почему то...

Как получить массив из объектов конкретного типа
Например есть класс lol, надо получить в виде массива объекты типа lol

Как поменять цвет конкретного элемента или конкретного столбца матрицы?
Как поменять цвет матрицы конкретного элемента или конкретного столбца . Пример , какие элементы...

Как получить id набора кодировки (charset) по её названию?
Здравствуйте. Читаю файл. Использую StreamWriter для записи некоторых его частей. Наблюдаю...

5
Покинул форум
3672 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
30.08.2016, 19:46 2
Есть несколько вариантов, однако в виду отсутствия каких-либо дополнительных пояснений, как то, например, нужно ли получить значение параметра или только его имя, могу привести следующий пример:
PowerShell
1
2
3
4
5
6
7
...
($p = (Get-Command test-param).Parameters).Keys | % {$o = $null}{
   if ($p[$_].ParameterSets.TryGetValue($PSCmdlet.ParameterSetName, [ref]$o) {
      $PSBoundParameters[$p[$_].Name]
   }
}
...
В Вашем случае должно вернуть app1.
1
96 / 17 / 5
Регистрация: 05.07.2015
Сообщений: 52
31.08.2016, 10:21  [ТС] 3
Спасибо. То что надо. Немного подправил код по себя, чтобы получить только параметры, которые заданы при вызове, ну и чтоб самому разобраться. В целом вопрос решен!
вот что получилось:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function test-param {
 
[CmdletBinding( DefaultParameterSetName="Filter",SupportsShouldProcess = $true )]
 
param(
    [Parameter(ValueFromPipeline=$True,
    ValueFromPipelineByPropertyName=$True)]
    [String[]]  $ComputerName,
 
    [Parameter(ParameterSetName="Filter",
    ValueFromPipelineByPropertyName=$True)]
    [String] $AppID,
 
    [Parameter(ParameterSetName="Filter",
    ValueFromPipelineByPropertyName=$True)]
    [String] $AppName
)
begin {
    ($$ = $PSCmdlet.MyInvocation.MyCommand.Parameters).Keys `
    | where {
        @($PSBoundParameters.Keys) -contains $_
    } `
    | where {
        $$[$_].ParameterSets.TryGetValue("Filter", ($o = $null) -as [ref])
    } `
    | foreach {
        $$.$_.name + " = " + $PSBoundParameters.$_
        $PSBoundParameters.$_ = "*" + ($PSBoundParameters.$_).trim("*") + "*"
        $$.$_.name + " = " + $PSBoundParameters.$_
    }
}
process {
    #объекты, полученные через конвеер.
}
}
 
test-param -AppID app1 -ComputerName comp1
0
Покинул форум
3672 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
31.08.2016, 12:01 4
Дело, конечно, хозяйское как именно писать код, однако позвольте сделать пару замечаний, которые облегчат чтение и понимание кода, а также указать на то, что может привести к не самым лучшим последствиям. Во-первых, избегайте использование символа ` перед знаком конвейера, ибо конвейер сам по сбе может служить переносом, например:
PowerShell
1
2
Get-ChildItem |
Where-Object ...
Если используется PowerShell -ge 4, то лучше и вовсе использовать методы-расширения:
PowerShell
1
(Get-ChildItem).Where{...}
Старайтесь не злоупотреблять переменной $$, ибо ее непродуманное использование может привести к выводу совершенно не тех данных, что ожидаются, а в худшем случае к краху самого хоста. Все остальное можете узнать из справочного руководства. Удачи!
0
96 / 17 / 5
Регистрация: 05.07.2015
Сообщений: 52
31.08.2016, 13:27  [ТС] 5
Спасибо ещё раз.
$$ - подсмотрел здесь на форуме и просто начал бездумно использовать, пока не определился. Вроде это как переменная одной строки.

А вот символы "`" (перевод строки) в паре с "|" на новой строке для меня более читабелен, чем что-то иное. Я так сразу вижу что конвейер продолжается, они (конвейеры) у меня очень длинные и в одну строку не помещаются.
хотя конечно "` " - выдаст ошибку. но дело каждого.

про @(3,3,4).ForEach({$_+3}) не знал. у javascript что-то похожее есть, но для foreach теряется мощь % -begin {} -process {} -pipelineValiable vb
0
Покинул форум
3672 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
31.08.2016, 18:13 6
PowerShell
1
2
3
4
5
PS C:\> man about_automatic_variables
...
    $$
       Содержит последний токен последней строки, полученной сеансом.
...
Из чего делаем соответсвующие выводы.
Цитата Сообщение от dirigar
про @(3,3,4).ForEach({$_+3}) не знал. у javascript что-то похожее есть, но для foreach теряется мощь % -begin {} -process {} -pipelineValiable vb
Не что-то похожее, а то же самое (разве что в JavaScript пишется forEach), ибо и там и там foreach как метод расширение может принимать лямбда выражения, так что никуда begin-process-end не счезал, а просто приобрел новую форму.
0
31.08.2016, 18:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.08.2016, 18:13
Помогаю со студенческими работами здесь

Как из определенного набора цифр получить дату и время?
Здравствуйте! Покажите пожалуйста как из этого набора цифр - 228945175440008000 получить...

Как получить путь до конкретного элмента ? | XML | DOM | Simple XML
Добрый день! Как Вы уже знаете, в Simple XML, чтобы получить доступ в XML файле к какому-либо...

Как получить нужные параметры?
Хочу парсить сайт. Через fiddler отслеживаю пакеты, которые отправляет мой браузер. Но я заметил,...

Как получить параметры процесса?
Хотелось бы спросить можно ли в отслеживаемом процессе получить параметры запуска онного. Например...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru