Para obter um errorlevel1, a única coisa que eu acho que você pode fazer é ter uma fonte de arquivo que não existe lá.
A documentação da Microsoft declara que xcopy
exit códigos são
Exit code Description
0 Files were copied without error.
1 No files were found to copy.
2 The user pressed CTRL+C to terminate xcopy.
4 Initialization error occurred.
There is not enough memory or disk space,
or you entered an invalid drive name
or invalid syntax on the command line.
5 Disk write error occurred.
Estou executando um sistema Windows 10 de 64 bits (espanhol) e tentei tudo em que consegui pensar para obter um errorlevel 1
de xcopy
, mas não consegui. E por tudo quero dizer que a única coisa que eu não testei foi /N
com nomes longos de arquivos em uma fonte onde nomes curtos não são habilitados (no meu ambiente eu não posso testá-lo). Os suspeitos usuais de curingas não correspondentes, nomes de arquivos não presentes, pastas vazias, /D
, /EXCLUDE
, /A
, /M
, /U
, ... foram testados.
Eu acho que deve ser fácil (não arquivos encontrados ?, fácil), mas eu estava errado, não foi, então eu depurei xcopy.exe
e é isso que eu vi:
xcopy
internamente usa um método chamado DisplayMessageAndExit(messageID, WSTRING, exitCode)
para, bem, exibir uma mensagem e sair. Ele também usa várias chamadas exit
para deixar o programa em alguns casos (ex. Ctrl-C )
Não encontrei nenhuma chamada exit
que pudesse usar um valor de 1
Na lista de chamadas feitas para DisplayMessageAndExit
, nenhuma delas passa / recebe um valor de 1
como código de saída.
Na lista de chamadas feitas para DisplayMessageAndExit
, apenas uma delas usa o MessageID 0x5622
(na minha instalação, os recursos associados estão em C:\Windows\System32\es-ES\ulib.dll.mui
, é dependente de localidade), que é No se encuentra el archivo: %1
( File not found - %1
) e o código de saída usado na chamada é 4
Talvez exista uma maneira em que xcopy
seja capaz de gerar o código de saída 1
, mas não sei como.
Portanto, a pergunta é: existe uma maneira de obter o código de saída errorlevel 1
em xcopy
? o que estou perdendo?
Para obter um errorlevel1, a única coisa que eu acho que você pode fazer é ter uma fonte de arquivo que não existe lá.
A única coisa em que consigo pensar é em algum tipo de condição de corrida que entre o xcopy reunindo a lista de arquivos que irá copiar e realmente fazendo a cópia, algum outro processo apaga ou move os arquivos.
Se você puder receber um erro 1 se apenas ALGUNS dos arquivos de origem estiverem faltando, talvez seja possível fazer isso de propósito. A única maneira que posso pensar em fazer isso de propósito é ter dois ou mais processos separados em execução, um comando xcopy e um delete ou move, todos operando nos mesmos arquivos de origem. Você precisará de uma fonte com muitos arquivos para dar aos processos concorrentes tempo para ultrapassar um ao outro.
Omitir a opção / C pode significar que, se for o primeiro arquivo, o xcopy tenta e falha, ele desistirá imediatamente sem copiar nenhum arquivo, satisfazendo assim a condição de arquivos NO copiados.