Saya ingin memodifikasi penginstal MSI (dibuat melalui WiX ) untuk menghapus seluruh direktori saat mencopot pemasangan.
Saya mengerti opsi RemoveFile
dan RemoveFolder
di WiX, tetapi ini tidak cukup kuat untuk secara rekursif menghapus seluruh folder yang memiliki konten yang dibuat setelah instalasi.
Saya perhatikan pertanyaan serupa Stack Overflow Menghapus file ketika menghapus WiX , tapi saya bertanya-tanya apakah ini bisa dilakukan lebih sederhana menggunakan panggilan ke skrip batch untuk menghapus folder.
Ini adalah pertama kalinya saya menggunakan WiX, dan saya masih terbiasa dengan tindakan khusus . Apa yang akan menjadi contoh dasar dari tindakan kustom yang akan menjalankan skrip batch saat mencopot pemasangan?
sumber
Ada beberapa masalah dengan jawaban yaluna , juga nama properti peka huruf besar-kecil,
Installed
apakah ejaan yang benar (INSTALLED
tidak akan berfungsi). Tabel di atas seharusnya adalah ini:Juga dengan asumsi perbaikan penuh & menghapus nilai properti yang sebenarnya bisa:
The WiX Ekspresi Sintaks dokumentasi mengatakan:
Properti didokumentasikan di Panduan Penginstal Windows (mis. Dipasang )
EDIT: Koreksi kecil ke tabel pertama; jelas "Uninstall" juga bisa terjadi hanya dengan
REMOVE
makhlukTrue
.sumber
Anda dapat melakukan ini dengan tindakan kustom. Anda dapat menambahkan referensi untuk tindakan khusus Anda di bawah
<InstallExecuteSequence>
:Maka Anda juga harus mendefinisikan Aksi di bawah
<Product>
:Di mana FileCleanerEXE adalah biner (dalam kasus saya sedikit program c ++ yang melakukan tindakan kustom) yang juga didefinisikan di bawah
<Product>
:Trik sebenarnya untuk ini adalah
Installed AND NOT UPGRADINGPRODUCTCODE
kondisi pada Tindakan Kustom, tanpa tindakan Anda akan dijalankan pada setiap pembaruan (karena upgrade benar-benar uninstall lalu instal ulang). Yang jika Anda menghapus file mungkin tidak ingin Anda inginkan selama upgrade.Di samping catatan: Saya sarankan melalui masalah menggunakan sesuatu seperti program C ++ untuk melakukan tindakan, alih-alih skrip batch karena kekuatan dan kontrol yang disediakannya - dan Anda dapat mencegah jendela "cmd prompt" dari berkedip saat installer Anda berjalan.
sumber
CustomAction
akan dieksekusi "Setelah = 'InstallFinalize'". Pada titik ini, semua file dihapus dari folder Instalasi. Juga fileCleaner.exe. Jadi, Anda tidak dapat menjalankannya melalui CustomAction. Jawaban ini benar-benar salah. Saya bertanya-tanya tentang 42 upvotes!Masalah terbesar dengan skrip batch adalah menangani rollback ketika pengguna mengklik membatalkan (atau ada yang salah selama instalasi Anda). Cara yang benar untuk menangani skenario ini adalah membuat CustomAction yang menambahkan baris sementara ke tabel RemoveFiles. Dengan begitu Penginstal Windows menangani kasing rollback untuk Anda. Ini sangat sederhana ketika Anda melihat solusinya.
Pokoknya, untuk memiliki tindakan hanya menjalankan selama uninstall menambahkan elemen Kondisi dengan:
the ~ = mengatakan bandingkan case case (meskipun saya pikir SEMUA selalu huruf besar). Lihat dokumentasi MSI SDK tentang Sintaksis Kondisi untuk informasi lebih lanjut.
PS: Tidak pernah ada kasus di mana saya duduk dan berpikir, "Oh, file batch akan menjadi solusi yang baik dalam paket instalasi." Sebenarnya, menemukan paket instalasi yang memiliki file batch di dalamnya hanya akan mendorong saya untuk mengembalikan produk untuk pengembalian uang.
sumber
Berikut adalah seperangkat properti yang saya buat yang terasa lebih intuitif untuk digunakan daripada barang bawaan. Ketentuan didasarkan dari tabel kebenaran yang disediakan di atas oleh ahmd0.
Berikut ini beberapa contoh penggunaan:
Masalah:
sumber
Saya menggunakan Tindakan Kustom yang dikodekan secara terpisah dalam C ++ DLL dan menggunakan DLL untuk memanggil fungsi yang sesuai pada Penghapusan Instalasi menggunakan sintaks ini:
Menggunakan blok kode di atas, saya bisa menjalankan fungsi apa pun yang didefinisikan dalam C ++ DLL saat mencopot pemasangan. FYI, fungsi hapus instalan saya memiliki kode terkait Menghapus data pengguna saat ini dan entri registri.
sumber