Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Замена команды в функции по условию

Ответить
Настройки темы
PowerShell - [решено] Замена команды в функции по условию

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6493
Благодарности: 1465


Конфигурация

Профиль | Отправить PM | Цитировать


Привет!

Подскажите, как заменить команду в функции по условию. У меня отчёт по Exchange, и надо поменять команду в зависимости от того, обычная это группа рассылки или динамическая.

Идея такая:
Код: Выделить весь код
function Get-ExtendedPerms ($value) {

    $command = if ($value.recipienttype -match "dynamic") {"Get-DynamicDistributionGroup $($value.name)"} else {"Get-DistributionGroup $($value.name)"}

    ($command | Get-ADPermission |
    ? {$_.isInherited -eq $false -and $_.ExtendedRights -and $_.user -notmatch "Authenticated Users"} |% {
        ($_.user -replace "^.*?\\") + ' (' + $_.ExtendedRights + ')'
    } |sort) -join ", "
}
Просто большая часть команды одна и та же, хочется заменить только часть, а не дублировать её всю целиком.

$command просто так как строка не вставляется, ошибка следующая:

Код: Выделить весь код
The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipel
ine input.
    + CategoryInfo          : InvalidArgument: (Get-DistributionGroup DG-test:PSObject) [Get-ADPermission], ParameterBindingException
    + FullyQualifiedErrorId : InputObjectNotBound,Get-ADPermission
    + PSComputerName        : srv-mail3.example.com
Тип выдаёт
Код: Выделить весь код
($command).GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                                                          
-------- -------- ----                                     --------                                                                                                                                          
True     True     String                                   System.Object
Но в строку переделать не получается никаким из способов ниже:
Код: Выделить весь код
$command -as [string]
$command |out-string
[string]$command
Заранее спасибо!

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 18:01, 29-11-2022

 

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Но в строку переделать не получается никаким из способов ниже »
Строку в строку? Зачем?
$command ведь и так строка...

Команду записанную в переменную в виде строки или скрипт-блок запускать надо с помощью оператора вызова "&"
Код: Выделить весь код
$a = 'dir'
&$a

Не пойдет... & не даст запускать команды с параметрами...

Но там у тебя ещё загвоздка в двойных кавычках, powershell попытается выполнить выражение $() с раскрытием переменных...
В общем, надо переписать строку так:
Код: Выделить весь код
$command = if ($value.recipienttype -match "dynamic") {{Get-DynamicDistributionGroup $($value.name)}} else {{Get-DistributionGroup $($value.name)}}
или так:
Код: Выделить весь код
$command = if ($value.recipienttype -match "dynamic") {'Get-DynamicDistributionGroup $($value.name)'} else {'Get-DistributionGroup $($value.name)'}
Далее:
Код: Выделить весь код
$command|Invoke-Expression|...

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 29-11-2022 в 19:17.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:47, 29-11-2022 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6493
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Спасибо!

Пока ехал с работы, понял, что составлять строку не нужно, а надо просто выполнить команду и записать в переменную уже готовый объект.

Код: Выделить весь код
$command = if ($value.recipienttype -match "dynamic") {Get-DynamicDistributionGroup $value} else {Get-DistributionGroup $value}

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 20:50, 29-11-2022 | #3


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
надо просто выполнить команду и записать в переменную уже готовый объект »
Собственно, да. В данном случае, нет надобности записывать команду в тип "строка" и помещать её в переменную... но вообще, всё зависит от контекста, т.е. от последовательности команд, области их выполнения и естественно, от содержания проверяемого условия.

-------
scio me nihil scire. Ѫ


Отправлено: 07:56, 30-11-2022 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Замена команды в функции по условию

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - разбить файл на несколько по условию или по фильтру shadowbat Скриптовые языки администрирования Windows 8 22-09-2022 15:33
CMD/BAT - Удалить папки в каталоге по условию fb2boook Скриптовые языки администрирования Windows 4 03-10-2019 10:02
CMD/BAT - [решено] Запуск приложения по условию DR_WELL Скриптовые языки администрирования Windows 2 29-11-2012 21:20
Доступ - Расшаривание папок по условию aleksey_m Microsoft Windows 2000/XP 8 06-03-2009 09:07
Скрипт по условию. Butunin Klim Программное обеспечение Windows 7 18-08-2006 09:37




 
Переход