“Uygun” bir çıkış kodu döndürmek için ROBOCOPY almak?


121

ROBOCOPY'dan başarılı veya başarısız olduğunu gösteren bir çıkış koduyla çıkmasını istemek mümkün mü?

TeamCity yapı yapılandırmalarımın bir parçası olarak ROBOCOPY kullanıyorum ve çıkış kodunu ROBOCOPY'dan susturmak için bir adım eklemek zorunda kalmam bana aptalca geliyor.

Temel olarak şunu ekledim:

EXIT /B 0

çalıştırılan komut dosyasına.

Ancak, bu elbette ROBOCOPY'nin geri getireceği gerçek sorunları gizliyor.

Temel olarak, ROBOCOPY'nin şimdi döndürdüğü bit maskesi yerine SUCCESS için 0 çıkış kodunu, HIZLI DEĞİL için sıfır olmayan kodları almak istiyorum.

Veya buna sahip olamazsam, ROBOCOPY'un bit maskesini benzer bir değere çeviren basit bir toplu komut dizisi var mı?


2
Ayrıca ilk 8 çıkış kodunun (0-7) açıkça hata durumları olmadığı belirtilmelidir: stackoverflow.com/questions/16533843/psake-and-robocopy-failing
longda

Yanıtlar:


47

Gereğince burada Robocopy çıkış kodunu oluşturan aşağıdaki çıkış kodu bitlerini vardır:

0 × 10 Ciddi hata. Robocopy hiçbir dosyayı kopyalamadı. Bu bir kullanım hatası veya kaynak veya hedef dizinlerdeki erişim yetkisi yetersizliğinden dolayı oluşan bir hatadır.

0 × 08 Bazı dosyalar veya dizinler kopyalanamadı (kopya hataları oluştu ve yeniden deneme sınırı aşıldı). Bu hataları daha fazla kontrol edin.

0 × 04 Bazı Uyuşmayan dosyalar veya dizinler algılandı. Çıkış günlüğünü inceleyin. Kat hizmetleri muhtemelen gereklidir.

0 × 02 Bazı Ekstra dosyalar veya dizinler algılandı. Çıkış günlüğünü inceleyin. Bazı oda temizliği gerekli olabilir.

0 × 01 Bir veya daha fazla dosya başarıyla kopyalandı (başka bir deyişle yeni dosyalar geldi).

0 × 00 Hata oluştu ve kopyalama yapılamadı. Kaynak ve hedef dizin ağaçları tamamen senkronize edilir.

Sadece eğer if / else ifadeleri EXIT /B 0, dönüş değeri 1 veya belki 0 olduğunda ve EXIT /B 1aksi halde olduğunu belirtir . Dosyalar kopyalanmış olsa bile elle müdahale gerektiren bir sorun var.


108

TechNet , çıkış kodunu daha geleneksel bir çıkış koduna dönüştürmek için bu tek astarı önerir :

(robocopy c:\dirA c:\dirB *.*) ^& IF %ERRORLEVEL% LEQ 1 exit 0

Veya çıkış kodunu tamamen görmezden gelmek için (yani başarısız veya başarılı olmamasına dikkat etmeyin):

(robocopy c:\dirA c:\dirB *.*) ^& exit 0

Bununla birlikte, yukarıdaki her iki komut da robokopi yapıldıktan sonra bir senaryoyu sonlandırır. Bu, özellikle CI yapımı için bir konudur. Bu senaryoda robokopi kullanmak istiyorsanız, alakasız çıkış kodları için hata kodunu manuel olarak ayarlamanız gerekir. Aşağıda, 8'in altındaki tüm hata kodları, hiçbir hata olmadan yeniden yazılır ve mümkünse komut dosyası devam eder.

(robocopy c:\dirA c:\dirB *.*) ^& IF %ERRORLEVEL% LSS 8 SET ERRORLEVEL = 0

8
Güzel. Robocopy komutunun etrafındaki parantezlere ihtiyacı var, ancak bir sarmalayıcı komut dosyası kullanarak beni kurtardı.
TheCodeKing

TeamCity'de bir tek Komut Satırı oluşturma adımı olarak çalışmasını bulamadım. Ayrı bir satıra taşımak zorunda kaldım. Gerekli olduğunu düşünmeme rağmen, / B argümanını exit komutuna da ekledim.
MikeWyatt

TeamCity dağıtım (ve sadece TeamCity) için tip fayda vardır: IF %ERRORLEVEL% LEQ 3 set errorlevel=0ve sonraki satırda: if %errorlevel% neq 0 exit /b %errorlevel%Tamam kodlar az sonra 3., çünkü (toplu iş dosyası çeşitli operasyonlar, sadece robocopy oluşuyorsa) ss64.com/nt/robocopy -exit.html
DaoCacao

6
TeamCity'de, ERRORLEVEL%% çiftiyle kaçmalısınız, şöyle: %% ERRORLEVEL %%. Aksi takdirde, TeamCity build parametresi olarak kabul eder.
Yan Sklyarenko 27.03

2
Ne yapar ^&? ss64 kaçtığını söylüyor ama bana kaçması gerekmiyor gibi görünüyor?
mlhDev

19

Jenkins onu Running de ihtiyacı var ( )ve /B. Hata seviyesini yoksaymak istiyorsanız, 1,2,3,4:

(robocopy XXX YYY) ^& IF %ERRORLEVEL% LEQ 4 exit /B 0

2
LSS 8 daha da iyi olabilir :)
Ivan

13

Gönderen bu sayfada çıktısını hata kodları listesini kullanır toplu dosyasına hataları bir bölüm eklemek ve kod farklı bölümlerini çalıştırabilirsiniz:

if %ERRORLEVEL% EQU 16 echo ***FATAL ERROR*** & goto end
if %ERRORLEVEL% EQU 15 echo OKCOPY + FAIL + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 14 echo FAIL + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 13 echo OKCOPY + FAIL + MISMATCHES & goto end
if %ERRORLEVEL% EQU 12 echo FAIL + MISMATCHES& goto end
if %ERRORLEVEL% EQU 11 echo OKCOPY + FAIL + XTRA & goto end
if %ERRORLEVEL% EQU 10 echo FAIL + XTRA & goto end
if %ERRORLEVEL% EQU 9 echo OKCOPY + FAIL & goto end
if %ERRORLEVEL% EQU 8 echo FAIL & goto end
if %ERRORLEVEL% EQU 7 echo OKCOPY + MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 6 echo MISMATCHES + XTRA & goto end
if %ERRORLEVEL% EQU 5 echo OKCOPY + MISMATCHES & goto end
if %ERRORLEVEL% EQU 4 echo MISMATCHES & goto end
if %ERRORLEVEL% EQU 3 echo OKCOPY + XTRA & goto end
if %ERRORLEVEL% EQU 2 echo XTRA & goto end
if %ERRORLEVEL% EQU 1 echo OKCOPY & goto end
if %ERRORLEVEL% EQU 0 echo No Change & goto end


:END
REM END OF BATCH FILE

8

Bunu kullanıyorum:

robocopy .....
call :REPORT_ERRORLEVEL
goto :EOF

:REPORT_ERRORLEVEL
echo.
if ERRORLEVEL 16 echo ***FATAL ERROR*** & goto :EOF
if ERRORLEVEL 8 echo **FAILED COPIES** & goto :EOF
if ERRORLEVEL 4 echo *MISMATCHES* & goto :EOF
if ERRORLEVEL 2 echo EXTRA FILES & goto :EOF
if ERRORLEVEL 1 echo Copy successful & goto :EOF
if ERRORLEVEL 0 echo –no change– & goto :EOF

8

Yukarıdaki bazı posterler bit maskesinin inceliklerini kaçırmıştır. Özellikle paradroid, hata seviyesi 3'ün tamamen başarılı bir kopyaya işaret ettiğini kaçırmıştır.

Eğer ayarlandıysa, 0x01 bitinin, başka hatalar olsa bile bazı dosyaların kopyalandığını gösterdiğini unutmayın. Bu nedenle, tek sayılı numaralandırılmış herhangi bir hata seviyesi her zaman en azından bazı dosyaların kopyalandığını gösterir. Ayrıca, 0x02 bitinin, hedefte kaynakta bulunmayan dosyaların olduğunu gösterdiğini de unutmayın. Bu, / E anahtarı kullanıldığında ve önceki bir kopya alındığından beri dosyalar kaynaktan silinmişse gerçekleşir. / MIR anahtarı kullanılırsa gerçekleşmemelidir, çünkü bu, kaynağı yansıtmak için hedefteki dosyaları silmelidir (ancak bunu test etmedim).

Bu nedenle her iki hata seviyesi 1 ve 3, hatasız dosyaların başarılı bir şekilde kopyalandığını gösterir. Ayrıca 0 VE 2 hata seviyeleri, varış yerinin güncel olduğunu ve hiçbir dosyanın kopyalanmadığını gösterir.

Neye mal olursa olsun, basit yedeklemem için aşağıdakilerle karşılaştım:

errorlevel 16 echo Yedekleme başarısız olursa - yukarıdaki sebebe bakın & bitti

errorlevel 8 echo Her şey yolunda değilse - yedekleme tamamlanmadı ve bitmedi

Eğer errorlevel 4 echo Her şey yolunda değil - bazı dosyalar eşleşmedi ve işlem bitmedi

errorlevel 3 echo Yedekleme başarıyla tamamlandıysa ve bitmişse

errorlevel 2 echo Backup zaten güncelse - hiçbir dosya kopyalanmamıştır

errorlevel 1 echo Yedekleme başarıyla tamamlandıysa ve bitmişse

eğer errorlevel 0 echo Yedekleme zaten güncel - hiçbir dosya kopyalanmadı ve işlem tamamlandı

'Ekstra' dosyalar için uğraşmamayı seçtim.

'Eşleşmeyen' hatanın ne olduğu hakkında hiçbir fikrim yok, çünkü henüz olmadı, ancak bunun için izin verdim.


6

Misafir John ile aynı fikirdeyim - sonuç gerçekten 8 veya daha yüksekse, gerçekten yalnızca bir hata belirtmek istiyorsunuz.

Bir robokopi sonucunu 0 (başarılı) veya 1 (başarısız) sonuçla eşleştirmek, bir SQL Agent işinde kullanılmaya uygun, bunu kullanıyorum:

  IF %ERRORLEVEL% LSS 8 EXIT /B 0
  EXIT /B 1

2

TeamCity için bunu kullanıyorum ve gayet iyi çalışıyor. MikeWyatt, DaoCacao ve Yan Sklyarenko'dan gelen girdiler sayesinde. Cevabı görselleştirmek için tam çalışan bir örnek görmem gerekiyordu.

(robocopy  .\Artifacts\Fitnesse %FitDestinationFolder% /MIR)
IF %%ERRORLEVEL%% LEQ 3 set errorlevel=0
IF %%ERRORLEVEL%% NEQ 0 EXIT /b %%ERRORLEVEL%%
EXIT 0

1
POST-BUILD etkinliğimde benzer bir robokopi betiği kullanıyorum. Bu yüzden bağımlı kütüphaneler tüketen .exe uygulama projesine kopyalanıyor - bunlar sadece kontrol / servis bulma modeliyle ters çevriliyor.
bkwdesign

1

Gitlab ci için cmd / c ekleyin.

cmd /c (robocopy c:\dirA c:\dirB *.*) ^& IF %ERRORLEVEL% LEQ 1 exit 0

Aksi takdirde EXIT 0, CI boru hattını bu noktada kapatır.


0

Burada bitmiş dosyaları Visual Studio 2010+ 'dan başka bir klasöre nasıl kopyalayacağınıza dair bir örnek, Visual Studio iyi bir kopyada 0 değil.

cmd /c (robocopy $(TargetDir) X:\$(TargetName) $(TargetFileName) $(TargetFileName).config *.dll *.json *.xml /xx) ^& IF %ERRORLEVEL% LEQ 1 exit 0 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.