Apakah mungkin untuk meminta ROBOCOPY untuk keluar dengan kode keluar yang menunjukkan keberhasilan atau kegagalan?
Saya menggunakan ROBOCOPY sebagai bagian dari konfigurasi build TeamCity saya, dan harus menambahkan langkah untuk hanya membungkam kode keluar dari ROBOCOPY tampaknya konyol bagi saya.
Pada dasarnya, saya telah menambahkan ini:
EXIT /B 0
ke skrip yang sedang dijalankan.
Namun, ini tentu saja menutupi masalah nyata yang akan kembali oleh ROBOCOPY.
Pada dasarnya, saya ingin memiliki kode keluar 0 untuk SUKSES dan bukan-nol untuk KEGAGALAN alih-alih bit-mask yang dikembalikan ROBOCOPY sekarang.
Atau, jika saya tidak bisa memilikinya, apakah ada urutan sederhana dari perintah batch yang akan menerjemahkan bit-mask ROBOCOPY ke nilai yang sama?
Jawaban:
Seperti di sini , Robocopy memiliki bit kode keluar berikut yang membentuk kode keluar:
Cukup tambahkan pernyataan if / else bahwa
EXIT /B 0
ketika nilai balik adalah 1 atau mungkin 0, danEXIT /B 1
sebaliknya. Bahkan jika file mungkin telah disalin, ada sesuatu yang salah yang memerlukan intervensi manual.sumber
TechNet menyarankan one-liner ini untuk mengubah kode keluar menjadi kode keluar yang lebih tradisional:
Atau ini untuk mengabaikan kode keluar sepenuhnya (yaitu tidak peduli jika gagal atau berhasil):
Namun, kedua perintah di atas akan menghentikan skrip setelah robocopy dieksekusi. Ini adalah masalah terutama untuk membangun CI. Jika Anda ingin menggunakan robocopy dalam skenario ini, Anda perlu mengatur kode kesalahan secara manual untuk kode keluar yang tidak relevan. Di bawah ini, semua kode kesalahan di bawah 8 akan ditulis ulang tanpa kesalahan sama sekali, dan skrip akan dilanjutkan jika memungkinkan.
sumber
IF %ERRORLEVEL% LEQ 3 set errorlevel=0
dan pada baris berikutnya:if %errorlevel% neq 0 exit /b %errorlevel%
(jika file batch terdiri dari beberapa operasi, tidak hanya robocopy), karena kode OK kurang dari 3. ss64.com/nt/robocopy -exit.htmlERRORLEVEL
dengan %% ganda, seperti ini: %% ERRORLEVEL %%. Kalau tidak, itu menganggapnya sebagai parameter build TeamCity.^&
dilakukan? ss64 mengatakan lolos tetapi bagi saya sepertinya tidak harus melarikan diri?Menjalankannya dari Jenkins membutuhkan keduanya
( )
dan/B
. Jika Anda ingin mengabaikan level kesalahan 1,2,3,4:sumber
Dari halaman ini Anda dapat menambahkan bagian ke file batch Anda yang menggunakan daftar kode kesalahan untuk menghasilkan kesalahan dan menjalankan bagian kode yang berbeda:
sumber
Saya menggunakan ini:
sumber
Beberapa poster di atas telah melewatkan kehalusan topeng bit. Secara khusus paradroid telah melewatkan errorlevel 3 yang menunjukkan salinan yang sepenuhnya berhasil.
Perhatikan bahwa bit 0x01 jika diset menunjukkan bahwa beberapa file telah disalin bahkan jika ada kegagalan lainnya. Jadi setiap tingkat kesalahan ganjil selalu menunjukkan bahwa setidaknya beberapa file telah disalin. Perhatikan juga bahwa bit 0x02 hanya menunjukkan bahwa ada file di tujuan yang tidak ada di sumbernya. Ini akan terjadi jika saklar / E digunakan dan file telah dihapus dari sumber sejak salinan sebelumnya diambil. Seharusnya tidak terjadi jika saklar / MIR digunakan karena itu akan menghapus file di tujuan untuk mencerminkan sumber (tapi saya belum menguji ini).
Jadi kedua level 1 DAN 3 menunjukkan keberhasilan menyalin file tanpa kesalahan. Level error 0 AND 2 juga mengindikasikan bahwa tujuan sudah mutakhir dan tidak ada file yang disalin.
Untuk apa nilainya saya datang dengan yang berikut ini untuk cadangan sederhana saya:
jika errorlevel 16 echo Backup gagal - lihat alasan di atas & lakukan
jika errorlevel 8 echo All tidak baik - cadangan tidak lengkap & goto dilakukan
jika errorlevel 4 echo All tidak baik - beberapa file tidak cocok & dilakukan
jika errorlevel 3 echo Backup selesai dengan sukses & lakukan
jika errorlevel 2 echo Backup sudah diperbarui - tidak ada file yang disalin & dilakukan
jika errorlevel 1 echo Backup selesai dengan sukses & sudah selesai
jika errorlevel 0 echo Backup sudah diperbarui - tidak ada file yang disalin & dilakukan
Saya memilih untuk tidak repot dengan file 'ekstra'.
Saya tidak tahu apa kesalahan 'tidak cocok' karena itu belum terjadi tetapi saya mengizinkannya untuk berjaga-jaga.
sumber
Saya setuju dengan Guest John - Anda benar-benar hanya ingin menunjukkan kesalahan jika hasilnya sebenarnya 8 atau lebih tinggi.
jadi untuk memetakan hasil robocopy ke hasil 0 (berhasil) atau 1 (gagal), cocok untuk digunakan dalam pekerjaan SQL Agent, saya menggunakan ini:
sumber
Untuk TeamCity saya menggunakan ini dan itu berfungsi dengan baik. Terima kasih atas masukan dari MikeWyatt, DaoCacao, dan Yan Sklyarenko. Saya hanya perlu melihat contoh yang berfungsi penuh untuk membantu memvisualisasikan jawabannya.
sumber
tambahkan cmd / c sebelum untuk gitlab ci.
jika EXIT 0 menutup pipa CI pada saat itu.
sumber
Contoh di sini tentang cara menyalin file jadi dari Visual Studio 2010+ ke folder lain sebagai Visual Studio mengharapkan 0 bukan 1 pada salinan yang baik.
sumber