Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Замена команды в функции по условию (http://forum.oszone.net/showthread.php?t=352483)

DJ Mogarych 29-11-2022 18:01 2997617

Замена команды в функции по условию
 
Привет!

Подскажите, как заменить команду в функции по условию. У меня отчёт по 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

Заранее спасибо!

YuS_2 29-11-2022 18:47 2997627

Цитата:

Цитата 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|...

DJ Mogarych 29-11-2022 20:50 2997644

Спасибо!

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

Код:

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

YuS_2 30-11-2022 07:56 2997673

Цитата:

Цитата DJ Mogarych
надо просто выполнить команду и записать в переменную уже готовый объект »

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


Время: 18:32.

Время: 18:32.
© OSzone.net 2001-