在不存在的角色上捕获Get-ManagementRole异常

时间:2012-02-21 08:33:21

标签: powershell exchange-server powershell-v2.0 powershell-remoting exchange-server-2010

try {
    $ErrorActionPreference = "...";  #<- tried all settings 
#   $myRole = Get-ManagementRole $CustomRole;  #<- terminates if role doesnt exist 
    New-ManagementRole $CustomRole -UnScopedTopLevel; #<- same if existent
} catch {
    ...   #<- never happens
}

如果尚未存在,我需要创建一个新的自定义无范围角色。我的问题是,如果角色已经存在并且Get-ManagementRole无法用于检查该角色,则New-ManagementRole会终止我的脚本,因为如果该角色不存在则终止我的脚本^^

两个Cmdlet都无法捕获'catch'(!! ??)

呃,......有什么建议吗??

1 个答案:

答案 0 :(得分:0)

因此,如果您的工具不能像您需要它一样工作,那么构建 一个新工具;-) ...这是一种解决方案:

if(Test-ManagementRole“MyCustomRole”-Single){...}

function global:Test-ManagementRole
{
<#
.SYNOPSIS
Mit Test-ManagementRole wird überprüft, ob eine Management-Rolle existiert und
optional, ob sie einem bestimmten Typ entspricht.
.DESCRIPTION
Test-ManagementRole (by .rhavin;) überprüft die im System vorhandenen Management-
Rollen und liefert die Zurück, die den angegeben Kriterien entsprechen.
.PARAMETER Roles
Objekt-Array der Management-Rollen. Kann als Pipe übergeben werden. Wird dieser
Parameter weggelassen, werden alle im System definierten Rollen überprüft.
.PARAMETER Name
Der Name der Management-Rolle. Es können Wildcards (z.B. '*mail*') verwendet werden.
.PARAMETER Type
Der Typ der Management-Rolle. Es können Wildcards (z.B. '*recover*') verwendet werden.
.PARAMETER Display
Wird dieser Switch angegeben, wird ein ausführlicher Text angezeigt,
ansonsten liefert das Commandlet nur Wahr/Falsch zur weitern Verarbeitung
zurück.
.PARAMETER HideFalse
Wird dieser Switch angegeben, werden nur User, welche zur angegebenen
Rolle gehören, an die Pipeline weitergegeben bzw. angezeigt.
.PARAMETER Single
Wird dieser Switch angegeben, wird der Vorgang bei der ersten Übereinstimmung abgebrochen.
.EXAMPLE
Test-ManagementRole -Name *mail* -Type *im* -Display
Zeigt alle Management-Rollen an, welche 'mail' als Namensbestandteil haben und
in deren Typ 'im' vorkommt.
.EXAMPLE
Test-ManagementRole *Organization* -Single
Überprüft, ob eine Rolle mit dem Namensbestandteil "organization" existiert.
#>

param(
$Name = '*',
$Type = '*',
[switch]$Display,
[switch]$HideFalse,
[switch]$Single,
[Parameter(ValueFromPipeline=$true)]$Roles
)

begin {
    if ($PSCmdlet.MyInvocation.PipelinePosition -eq 1)
    {
        $cmd = "Get-ManagementRole | Test-ManagementRole";
        if ($Name) {$cmd += (' -Name "' + $Name + '"');}
        if ($Type) {$cmd += (' -Type "' + $Type + '"');}
        if ($Display) {$cmd += ' -Display';}
        if ($HideFalse) {$cmd += ' -HideFalse';}
        if ($Single) {$cmd += ' -Single';}
        Invoke-Expression $cmd;
        break;
    }
    $colOldTx = $host.UI.RawUI.ForegroundColor;
    $found = $false;
    if ($Display) {Echo "";}
}

process {
    if ($Single -and $found) {return $null;}
    function DoTest
    {
        if ($_.Name -like $Name)
        {
            if ($_.RoleType -like $Type) {return 2;}
            return 1;
        }
        return 0;
    }
    $mytest = DoTest;   
    if ($mytest -eq 2)
    {
        $found = $true;
        if ($Display)
        {
            $host.UI.RawUI.ForegroundColor = 'Green';
            Write-Host $_.Name 'ist vom Typ' $_.RoleType;
            return;
        }
        return $true
    }
    if ($HideFalse -or ($mytest -eq 0)) {return $null}
    if ($Display)
    {
        $host.UI.RawUI.ForegroundColor = 'Red';
        Write-Host $_.Name 'ist vom Typ' $_.RoleType;
        return;
    }
    return $false
}

end {
    if ($Display)
    {
        if (!($found))
        {
            $host.UI.RawUI.ForegroundColor = 'Red';
            Write-Host "Es wurde keine ManagementRolle mit Namen `"$Name`" vom Typ `"$Type`" gefunden.";
        }
        echo "";
    }
    $host.UI.RawUI.ForegroundColor = $colOldTx;
}

}