在PowerShell中我可以直接调用switch语句中的条件吗?

时间:2017-10-13 19:10:10

标签: powershell switch-statement

考虑一下:

SWITCH ($mode)
{
    MODE1
    {
    }

    MODE2
    {
    }

    MODE3
    {
    }
}

我可以在不执行整个SWITCH语句的情况下直接调用MODE1,MODE2或MODE3下的代码吗?

我的情况是MODE3只能在MODE2完成后运行,而MODE2只能在MODE1完成后运行。我已将每个MODE的所有代码移动到一个单独的函数中。但是,确定先前模式是否已完成的逻辑正在增加,重复代码,并且令人困惑。

例如:

SWITCH ($mode)
{
    MODE1
    {
         DoMode1
         if (!Mode1Complete) { Exit }
    }

    MODE2
    {
        if (!Mode1Complete) { DoMode1 }
        if (!Mode1Complete) { Exit }
        DoMode2
    }

    MODE3
    {
        if (!Mode2Complete)
        {
            if (!Mode1Complete)
            {
                DoMode1
                if (!Mode1Complete) { Exit }
                DoMode2
                if (!Mode2Complete) { Exit }
            }
            else
            {
                DoMode2
                if (!Mode2Complete) { Exit }
            }
        }
        DoMode3
    }
}

你可以看到这将如何快速复杂化!

我想做的是:

SWITCH ($mode)
{
    MODE1
    {
        DoMode1
        If (!Mode1Complete) { Exit }
    }

    MODE2
    {
        if (!Mode1Complete)
        {
            #Call MODE1
        }
        if (!Mode1Complete) { Exit }
        DoMode2
    }

    MODE3
    {
        if (!Mode2Complete)
        {
            #Call MODE2
        }
        if (!Mode2Complete) { Exit }
        DoMode3
    }
}

请注意“MODEx”只是一个例子。实际情况不会像这样按数字顺序排列。他们将是不同的词。

如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:1)

使用GetNewClosure在scriptblocks中存储状态。如果您的代码需要在scriptblocks中包含外部变量,请考虑passing them as arguments到相应的脚本块。

实施例

# Setup scriptblocks for switch statement and dependencies.
# Use 'GetNewClosure' to capture variables (e.g.: $ModeComplete)

$Alpha = {
    if (!$ModeComplete) {
        'Alpha'
        $ModeComplete = $true
    }
}.GetNewClosure()

$Beta = {
    . $Alpha

    if (!$ModeComplete) {
        'Beta'
        $ModeComplete = $true
    }
}.GetNewClosure()

$Gamma = {
    . $Beta

    if (!$ModeComplete) {
        'Gamma'
        $ModeComplete = $true
    }
}.GetNewClosure()


# Helper scriptblock, will execute scriptblock
# from varible named as current switch condition
$ExecuteCurrentMode = {
    . (Get-Variable -Name $_ -ValueOnly)
}

# Mode
$Mode = 'Gamma'

# Switch
switch ($Mode) {
    'Alpha' {
        . $ExecuteCurrentMode $_
    }

    'Beta' {
        . $ExecuteCurrentMode $_
    }

    'Gamma' {
        . $ExecuteCurrentMode $_
    }
}

结果

Alpha
Beta
Gamma