我正在尝试使用我的powershell,将它们转换成一个开关语句,以使我的代码更加优化,但我无法弄清楚如何做到这一点。
任何帮助都将不胜感激。
代码:
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
}发布于 2017-03-10 21:45:13
简单地说,这相当于您的If/ElseIf链:
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
}
}您确实意识到,除了一种情况之外,您正在安装相同的应用程序,而不管您检测到的是什么,对吗?如果是我,我想我会使用哈希表,其中键是您正在搜索的应用程序标题,值包含可执行文件的路径和输出日志中要使用的标题。我想这会让这个更干净。
$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。
发布于 2017-03-10 19:35:45
正如其他评论已经指出的那样,您可以对if/else和switch做同样的事情。
关于优化:如果有一种方法可以获得所有已安装应用程序的列表,我宁愿获取该列表一次,然后切换/换一次,而不是多次调用Cmdlet Get-InstalledApplication。
优化代码的另一种方法可以是使用带有搜索词和可执行文件的映射/字典,并在键上循环,并检查是否安装了与键对应的应用程序:
$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的反馈编辑了我的答案。
https://stackoverflow.com/questions/42726193
复制相似问题