Saya mencoba mengambil pernyataan powershell elseif saya dan mengubahnya menjadi pernyataan switch untuk membuat kode saya lebih dioptimalkan, tetapi saya tidak dapat menemukan cara untuk melakukannya.

Bantuan apa pun akan sangat dihargai.

Kode:

    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
    }
0
Matt Larkin 10 Maret 2017, 22:21

2 jawaban

Jawaban Terbaik

Dalam istilah yang paling sederhana, ini setara dengan rantai If/ElseIf Anda:

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
    }
}

Anda menyadari bahwa Anda menginstal aplikasi yang sama terlepas dari apa yang Anda deteksi untuk semuanya kecuali satu kasus, bukan? Jika itu saya, saya pikir saya akan menggunakan hashtable di mana kuncinya adalah judul aplikasi yang Anda cari, dan nilainya berisi jalur ke executable dan judul untuk digunakan dalam log output. Saya pikir itu akan membuat ini lebih bersih.

$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
    }
}

Baris break membuatnya sehingga ketika salah satu dari mereka cocok, ia keluar dari Switch.

1
TheMadTechnician 10 Maret 2017, 21:45

Seperti yang telah ditunjukkan oleh komentar lain, Anda dapat melakukan hal yang hampir sama dengan if/else seperti dengan switch.

Mengenai pengoptimalan: jika ada cara untuk mendapatkan daftar semua aplikasi yang diinstal, saya lebih suka mengambil daftar itu sekali dan kemudian beralih/huruf besar, daripada meminta Anda Cmdlet Get-InstalledApplication beberapa kali.

Cara lain untuk mengoptimalkan kode Anda adalah dengan menggunakan peta/kamus dengan istilah pencarian dan executable dan mengulang kunci dan memeriksa apakah aplikasi yang sesuai dengan kunci telah diinstal:

$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] ... #>
}

Saya mengedit jawaban saya berdasarkan umpan balik dari @TheMadTechnician

1
Ronald Rink 'd-fens' 10 Maret 2017, 21:30