考虑一下:
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”只是一个例子。实际情况不会像这样按数字顺序排列。他们将是不同的词。
如何实现这一目标的任何想法?
答案 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