Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell中笨拙的函数-如何使其简洁?_Powershell_Powershell 2.0 - Fatal编程技术网

Powershell中笨拙的函数-如何使其简洁?

Powershell中笨拙的函数-如何使其简洁?,powershell,powershell-2.0,Powershell,Powershell 2.0,我刚刚在Powershell中编写了一个简单的函数 Function Get-Stage { $myEnv = Get-Environment $devEnvs = "D","Dev","Test","T" $prodEnvs = "P","U","PTA","B" if($devEnvs -contains $myEnv) { return "D" } elseif($prodEnvs -contains $

我刚刚在Powershell中编写了一个简单的函数

Function Get-Stage
{       
    $myEnv = Get-Environment
    $devEnvs = "D","Dev","Test","T"
    $prodEnvs = "P","U","PTA","B"
    if($devEnvs -contains $myEnv)
    {
        return "D"
    }
    elseif($prodEnvs -contains $myEnv)
    {
        return "P"          
    }
}
编辑

Get-Environment
是一个读取注册表以查找环境文本的函数,该文本可以是
$devEnvs
$prodEnvs
中列出的任何字符串值。函数将根据从获取环境返回的内容返回
D
P


我不喜欢它。有没有一种好的、可读的、简洁的编写方法,你能想到吗?

好吧,关于更好地编写代码的方法的问题在很大程度上是基于不同的观点,但是你可以做如下事情:

function Get-Stage
{
    $environment = Get-Environment

    switch ($environment)
    {
        {$PSItem -in "D","Dev","Test","T"}{
            Write-Output "D"
        }
        {$PSItem -in "P","U","PTA","B"}{
            Write-Output "P" 
        }
        default{
            Write-Error "Invalid environment value in registry ('$PSItem')"
        }
    }
}
switch ($environment)
{
    {"D","Dev","Test","T" -contains $_}{
        Write-Output "D"
    }
    {"P","U","PTA","B" -contains $_}{
        Write-Output "P" 
    }
    default{
        Write-Error "Invalid environment value in registry ('$_')"
    }
} 
如果要支持PowerShell v2,只需将switch语句更改为以下内容:

function Get-Stage
{
    $environment = Get-Environment

    switch ($environment)
    {
        {$PSItem -in "D","Dev","Test","T"}{
            Write-Output "D"
        }
        {$PSItem -in "P","U","PTA","B"}{
            Write-Output "P" 
        }
        default{
            Write-Error "Invalid environment value in registry ('$PSItem')"
        }
    }
}
switch ($environment)
{
    {"D","Dev","Test","T" -contains $_}{
        Write-Output "D"
    }
    {"P","U","PTA","B" -contains $_}{
        Write-Output "P" 
    }
    default{
        Write-Error "Invalid environment value in registry ('$_')"
    }
} 

好的,关于更好地编写代码的方法的问题在很大程度上是基于不同的观点,但是您可以做如下事情:

function Get-Stage
{
    $environment = Get-Environment

    switch ($environment)
    {
        {$PSItem -in "D","Dev","Test","T"}{
            Write-Output "D"
        }
        {$PSItem -in "P","U","PTA","B"}{
            Write-Output "P" 
        }
        default{
            Write-Error "Invalid environment value in registry ('$PSItem')"
        }
    }
}
switch ($environment)
{
    {"D","Dev","Test","T" -contains $_}{
        Write-Output "D"
    }
    {"P","U","PTA","B" -contains $_}{
        Write-Output "P" 
    }
    default{
        Write-Error "Invalid environment value in registry ('$_')"
    }
} 
如果要支持PowerShell v2,只需将switch语句更改为以下内容:

function Get-Stage
{
    $environment = Get-Environment

    switch ($environment)
    {
        {$PSItem -in "D","Dev","Test","T"}{
            Write-Output "D"
        }
        {$PSItem -in "P","U","PTA","B"}{
            Write-Output "P" 
        }
        default{
            Write-Error "Invalid environment value in registry ('$PSItem')"
        }
    }
}
switch ($environment)
{
    {"D","Dev","Test","T" -contains $_}{
        Write-Output "D"
    }
    {"P","U","PTA","B" -contains $_}{
        Write-Output "P" 
    }
    default{
        Write-Error "Invalid environment value in registry ('$_')"
    }
} 

这有什么好处吗

Function Get-Stage
{       
  $myEnv = Get-Environment;

  $envDict = @{
     "D" = @("Dev","Test","T");
     "P" = @("U","PTA","B")
  };

  $envDict.Keys | foreach {
    $envs = @($_) + $dict[$_];
    if($envs -contains $myenv) { return $_; }
  }
}

这有什么好处吗

Function Get-Stage
{       
  $myEnv = Get-Environment;

  $envDict = @{
     "D" = @("Dev","Test","T");
     "P" = @("U","PTA","B")
  };

  $envDict.Keys | foreach {
    $envs = @($_) + $dict[$_];
    if($envs -contains $myenv) { return $_; }
  }
}

你能解释一下这个功能的用途吗?
Get-Environment
做什么?你期望从这个函数中得到什么输入和输出?Get Environment在做什么?我已经更新了这个问题。你能解释一下这个函数的用途吗?
Get-Environment
做什么?您希望此函数有哪些输入和输出?Get Environment在做什么?我已经更新了问题Robert我使用的是powershell 2,我想此解决方案无法与此配合使用$PSItem是v3以后的版本,对吗?更新了我的答案,包括对v2的支持。但是,如果您想支持动态列表加载,请查看@neolik.Robert建议的解决方案。我使用的是powershell 2,我想这个解决方案不适用于此$PSItem是v3以后的版本,对吗?更新了我的答案,包括对v2的支持。但是,如果您想支持动态列表加载,请查看@neolik建议的解决方案。实际上,该解决方案看起来有点难以阅读。也许我的简单解决方案并没有那么糟糕。@MooMinTroll:不过,它应该更易于维护。没有任何东西的重复——代码或数据。您只需扩展其中的
$envDict
,它甚至可以是一个XML文件,因此维护它的人不需要了解Powershell。实际上,它看起来更难阅读。也许我的简单解决方案并没有那么糟糕。@MooMinTroll:不过,它应该更易于维护。没有任何东西的重复——代码或数据。您只需要扩展部分,其中显示
$envDict
,甚至可以是XML文件,因此维护它的人不需要了解Powershell。