PDA

Показать полную графическую версию : [решено] Замена команды в функции по условию


DJ Mogarych
29-11-2022, 18:01
Привет!

Подскажите, как заменить команду в функции по условию. У меня отчёт по 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
Но в строку переделать не получается никаким из способов ниже »
Строку в строку? Зачем?
$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
Спасибо!

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


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

YuS_2
30-11-2022, 07:56
надо просто выполнить команду и записать в переменную уже готовый объект »
Собственно, да. В данном случае, нет надобности записывать команду в тип "строка" и помещать её в переменную... но вообще, всё зависит от контекста, т.е. от последовательности команд, области их выполнения и естественно, от содержания проверяемого условия.




© OSzone.net 2001-2012