【问题标题】:In PowerShell can I directly call a condition in a switch statement?在 PowerShell 中,我可以直接在 switch 语句中调用条件吗?
【发布时间】:2017-10-13 19:10:10
【问题描述】:

考虑一下:

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”只是一个例子。实际情况不会像这样按数字顺序排列。它们将是不同的词。

有什么想法可以做到这一点吗?

【问题讨论】:

  • 看起来您正在构建某种状态机...不要使用switch,并尝试使用if 语句、重构函数等来实现完整的流程控制。
  • 您可能需要考虑创建流程图来确定工作流程以及重复循环发生的位置;然后根据它设计你的代码。如果您没有 Visio 或其他软件,可以在 draw.io 在线免费制作流程图。

标签: powershell switch-statement


【解决方案1】:

使用GetNewClosure 将状态存储在脚本块中。如果您的代码需要脚本块内的外部变量,请考虑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

【讨论】:

    猜你喜欢
    • 2018-06-21
    • 2013-07-31
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    相关资源
    最近更新 更多