首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Powershell ElseIf转换为开关语句

将Powershell ElseIf转换为开关语句
EN

Stack Overflow用户
提问于 2017-03-10 19:21:55
回答 2查看 418关注 0票数 0

我正在尝试使用我的powershell,将它们转换成一个开关语句,以使我的代码更加优化,但我无法弄清楚如何做到这一点。

任何帮助都将不胜感激。

代码:

代码语言:javascript
复制
    If (Get-InstalledApplication -Name "%AutoCAD 2015%") {
    #Install AutoCAD 2015 Object Enabler 
    $exitCode = (Execute-Process -Path 'Civil3D_2015_OE_64Bit.exe' -Parameters '/s /v /qn,', -wait -passthru).ExitCode
    "The exit code for the Civil 3D 2015 OE is: $exitCode" | Out-File -Append -FilePath C:\Logs\PW-CE\install.log
    }
    ElseIf (Get-InstalledApplication -Name "%MEP 2015%") {
    #Install AutoCAD 2015 Object Enabler 
    $exitCode = (Execute-Process -Path 'AutoCAD_Architecture_MEP_2015_OE_x64.exe' -Parameters '/s /v /qn,', -wait -passthru).ExitCode
    "The exit code for the Civil 3D 2015 OE is: $exitCode" | Out-File -Append -FilePath C:\Logs\PW-CE\install.log
    }
    ElseIf (Get-InstalledApplication -Name "%Civil 3D 2015%") {
    #Install AutoCAD 2015 Object Enabler
    $exitCode = (Execute-Process -Path 'Civil3D_2015_OE_64Bit.exe' -Parameters '/s /v /qn,', -wait -passthru).ExitCode
    "The exit code for the Civil 3D 2015 OE is: $exitCode" | Out-File -Append -FilePath C:\Logs\PW-CE\install.log
    }
    ElseIf (Get-InstalledApplication -Name "%Civil 3D 2017%") {
    #Install AutoCAD 2015 Object Enabler 
    $exitCode = (Execute-Process -Path 'Civil3D_2015_OE_64Bit.exe' -Parameters '/s /v /qn,', -wait -passthru).ExitCode
    "The exit code for the Civil 3D 2015 OE is: $exitCode" | Out-File -Append -FilePath C:\Logs\PW-CE\install.log
    }
    ElseIf (Get-InstalledApplication -Name "%AutoCAD 2017%") {
    #Install AutoCAD 2015 Object Enabler 
    $exitCode = (Execute-Process -Path 'Civil3D_2015_OE_64Bit.exe' -Parameters '/s /v /qn,', -wait -passthru).ExitCode
    "The exit code for the Civil 3D 2015 OE is: $exitCode" | Out-File -Append -FilePath C:\Logs\PW-CE\install.log
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-10 21:45:13

简单地说,这相当于您的If/ElseIf链:

代码语言:javascript
复制
Switch($true){
    {Get-InstalledApplication -Name "%AutoCAD 2015%"} {
    #Install AutoCAD 2015 Object Enabler 
    $exitCode = (Execute-Process -Path 'Civil3D_2015_OE_64Bit.exe' -Parameters '/s /v /qn,', -wait -passthru).ExitCode
    "The exit code for the Civil 3D 2015 OE is: $exitCode" | Out-File -Append -FilePath C:\Logs\PW-CE\install.log
    continue
    }
    {Get-InstalledApplication -Name "%MEP 2015%"} {
    #Install AutoCAD 2015 Object Enabler 
    $exitCode = (Execute-Process -Path 'AutoCAD_Architecture_MEP_2015_OE_x64.exe' -Parameters '/s /v /qn,', -wait -passthru).ExitCode
    "The exit code for the Civil 3D 2015 OE is: $exitCode" | Out-File -Append -FilePath C:\Logs\PW-CE\install.log
    continue
    }
    {Get-InstalledApplication -Name "%Civil 3D 2015%"} {
    #Install AutoCAD 2015 Object Enabler
    $exitCode = (Execute-Process -Path 'Civil3D_2015_OE_64Bit.exe' -Parameters '/s /v /qn,', -wait -passthru).ExitCode
    "The exit code for the Civil 3D 2015 OE is: $exitCode" | Out-File -Append -FilePath C:\Logs\PW-CE\install.log
    continue
    }
    {Get-InstalledApplication -Name "%Civil 3D 2017%"} {
    #Install AutoCAD 2015 Object Enabler 
    $exitCode = (Execute-Process -Path 'Civil3D_2015_OE_64Bit.exe' -Parameters '/s /v /qn,', -wait -passthru).ExitCode
    "The exit code for the Civil 3D 2015 OE is: $exitCode" | Out-File -Append -FilePath C:\Logs\PW-CE\install.log
    continue
    }
    {Get-InstalledApplication -Name "%AutoCAD 2017%"} {
    #Install AutoCAD 2015 Object Enabler 
    $exitCode = (Execute-Process -Path 'Civil3D_2015_OE_64Bit.exe' -Parameters '/s /v /qn,', -wait -passthru).ExitCode
    "The exit code for the Civil 3D 2015 OE is: $exitCode" | Out-File -Append -FilePath C:\Logs\PW-CE\install.log
    continue
    }
}

您确实意识到,除了一种情况之外,您正在安装相同的应用程序,而不管您检测到的是什么,对吗?如果是我,我想我会使用哈希表,其中键是您正在搜索的应用程序标题,值包含可执行文件的路径和输出日志中要使用的标题。我想这会让这个更干净。

代码语言:javascript
复制
$Apps = @{
    '%AutoCAD 2015%' = [pscustomobject]@{'Path'='Civil3D_2015_OE_64Bit.exe';'Title'='Civil 3D 2015 OE'}
    '%MEP 2015%' = [pscustomobject]@{'Path'='AutoCAD_Architecture_MEP_2015_OE_x64.exe';'Title'='Civil 3D 2015 OE'}
    '%Civil 3D 2015%' = [pscustomobject]@{'Path'='Civil3D_2015_OE_64Bit.exe';'Title'='Civil 3D 2015 OE'}
    '%Civil 3D 2017%' = [pscustomobject]@{'Path'='Civil3D_2015_OE_64Bit.exe';'Title'='Civil 3D 2015 OE'}
    '%AutoCAD 2017%' = [pscustomobject]@{'Path'='Civil3D_2015_OE_64Bit.exe';'Title'='Civil 3D 2015 OE'}
}

Switch($Apps.Keys){
    {Get-InstalledApplication -Name $_} {
    #Install AutoCAD 2015 Object Enabler 
    $exitCode = (Execute-Process -Path $Apps[$_].Path -Parameters '/s /v /qn,', -wait -passthru).ExitCode
    "The exit code for the $($Apps[$_].Title) is: $exitCode" | Out-File -Append -FilePath C:\Logs\PW-CE\install.log
    break
    }
}

break行使其能够在其中一个匹配时退出Switch

票数 1
EN

Stack Overflow用户

发布于 2017-03-10 19:35:45

正如其他评论已经指出的那样,您可以对if/elseswitch做同样的事情。

关于优化:如果有一种方法可以获得所有已安装应用程序的列表,我宁愿获取该列表一次,然后切换/换一次,而不是多次调用Cmdlet Get-InstalledApplication

优化代码的另一种方法可以是使用带有搜索词和可执行文件的映射/字典,并在键上循环,并检查是否安装了与键对应的应用程序:

代码语言:javascript
复制
$map = @{};
$map["%Civil 3D 2015%"] = 'Civil3D_2015_OE_64Bit.exe';
$map["%MEP 2015%"] = 'AutoCAD_Architecture_MEP_2015_OE_x64.exe';
$map["%AutoCAD 2015%"] = 'Civil3D_2015_OE_64Bit.exe';
foreach($key in $map.Keys) 
{ 
    if(!(Get-InstalledApplication -Name $key)) { continue; }; 

    <# install your application #>; 
    <# Exeute-Process -Path $map[$key] ... #>
}

我根据@TheMadTechnician的反馈编辑了我的答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42726193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档