Bagaimana cara mendapatkan SCCM untuk mengenali kode kembali dari penyelesaian skrip Powershell?

9

Saya menggunakan penyebaran aplikasi SCCM 2012 untuk menginstal perangkat lunak. Jenis pemasangan khusus adalah pemasang yang ditulis skrip karena SCCM terus gagal karena kesalahan validasi exe. Script adalah PowerShell dan berhasil menginstal perangkat lunak bahkan ketika dieksekusi oleh SCCM.

Masalahnya adalah bahwa SCCM hanya melihat pengembalian 0 dari penyelesaian dari skrip. Saya sudah mencoba write-host, return, write-output, dan hanya item baris dengan kode untuk reboot lembut. Tak satu pun dari mereka tampaknya dibaca oleh SCCM karena log eksekusi aplikasi menangkap pengembalian 0.

Bagaimana Anda mengeluarkan kode pengembalian dari PowerShell sehingga SCCM dapat menafsirkannya?

Colyn1337
sumber
Sudahkah Anda mencoba sesuatu seperti exit 1di akhir skrip PowerShell?
jscott
Dalam hal ini exitadalah cmdbuiltin. Dalam sistem penyebaran lain saya melihat file .ps1 berjalan dengan startatau cmd /c powershell.exe somefile.ps1. Maaf karena spitballing tanpa akses ke tes SCCM.
jscott

Jawaban:

9

Ada masalah yang diketahui dengan kode keluar PowerShell (lihat akhir dari jawaban ini) yang dapat bermanifestasi saat menggunakan skrip instalasi PowerShell dengan SCCM. Untuk mengatasi masalah ini, saya mengambil dua langkah:

  1. Saya selalu meminta SCCM untuk memanggil file batch yang menjalankan skrip powershell dengan menjalankannya powershell.exesecara eksplisit.
  2. Saya memastikan bahwa setiap jalur kode dalam skrip instalasi berakhir dengan panggilan eksplisit ke [System.Environment]::Exit().

Dengan dua ukuran ini, saya tidak punya masalah terkait dengan kode keluar. Itu adalah kemenangan besar karena pemecahan masalah kode keluar dari skrip instalasi adalah proses yang lambat karena Anda harus menunggu klien SCCM untuk memanggil skrip Anda untuk setiap iterasi pemecahan masalah.

Inilah tampilan file batch dan skrip PowerShell:

Install-Application.bat

powershell.exe .\Install-Application.ps1
exit /b %errorlevel%

Install-Application.ps1

try 
{
    # do a bunch of installation stuff
    if ( $rebootNeeded )
    {
        [System.Environment]::Exit(3010)
    }

    [System.Environment]::Exit(0)
}
catch
{
    [System.Environment]::Exit(1)
}

Mengapa kode keluar tidak dapat diandalkan saat SCCM memanggil skrip powershell secara langsung?

Berikut ini cara kami mengetahui kode keluar tidak dapat diandalkan:

alx9r
sumber