Метод проверки xcopy скопировал все файлы

После того, как я скопировал весь каталог с помощью xcopy, я хочу убедиться, что все файлы были скопированы, поскольку это часто кажется неудачным. Я пытаюсь сделать это, перебирая каждый файл в исходном каталоге, а затем проверяя его существование в целевом каталоге.

У меня есть что-то, что, кажется, работает на моей машине, но не работает на машине сборки, где мне это нужно.

@echo off
set /a count=0
set /a count2=0
for /r "C:\work\DLS\built\Android_EU\data" %%f in (*) do (set /a count+=1
)

for /r "C:\work\DLS\TegraProject\DLS\assets" %%f in (*) do (set /a count2+=1
)

echo count is %count%
echo count 2 is %count2%

if %count%==%count2% echo equal
if not %count%==%count2% echo not equal

pause

if %count%==%count2% exit 0
if not %count%==%count2% exit 1

Я проверил вручную, и в обеих папках на обеих машинах есть 594 файла.

Это правильно сообщается на моей машине.

На машине сборки написано, что есть файлы 583 и 584. Есть ли причина, по которой будут пропускать файлы?

Спасибо,

Крис.


person Chris Moore    schedule 05.02.2014    source источник
comment
Любая базовая команда копирования не будет работать с файлами, открытыми или заблокированными в другой программе. Однако, если вы используете Robocopy, который является заменой Xcopy, то он предоставляет сводку в конце, чтобы показать статистику.   -  person foxidrive    schedule 05.02.2014
comment
Спасибо за ваш ответ. Я заменил на Robocopy, и, кажется, он работал несколько раз подряд. Я могу ошибаться, но я почти уверен, что вчера пробовал Robocopy, и это тоже не всегда срабатывало. Я думаю, что было бы неплохо сделать эту проверку после копирования в любом случае.   -  person Chris Moore    schedule 05.02.2014
comment
Robocopy предоставит вам сводку, а также установит уровень ошибки, который вы можете проверить. Если вы хотите подтвердить это вручную, что вы будете делать, если файл был скопирован, но имеет нулевые байты? Какой уровень проверки вы хотите?   -  person foxidrive    schedule 05.02.2014
comment
Спасибо @foxidrive. Я придумал кое-что, но, похоже, это не работает на конкретной машине, и я не знаю, почему. Я отредактировал свой вопрос.   -  person Chris Moore    schedule 05.02.2014
comment
Перепроверьте количество файлов на машине с помощью dir /b /a-d |find /c /v ""   -  person foxidrive    schedule 05.02.2014
comment
Спасибо @foxidrive, я думаю, что могу просто проверить уровень ошибки на 1, так как файлы всегда должны быть скопированы, так как дерево заранее удалено. Мне любопытно узнать, почему моя ручная проверка могла потерпеть неудачу, чисто для моего собственного понимания.   -  person Chris Moore    schedule 05.02.2014
comment
Спасибо @foxidrive, dir /s /b /a-d |find /c /v правильно возвращает 594 в обоих каталогах. Есть ли способ присвоить это переменной, как я сделал в своей попытке?   -  person Chris Moore    schedule 05.02.2014
comment
Причина, по которой файл был пропущен, заключается в том, что атрибут hidden был установлен для файла в одной из папок. Метод, который я показал, также подсчитывает скрытые файлы.   -  person foxidrive    schedule 05.02.2014


Ответы (2)


Хорошо, кажется, это работает - спасибо за ваш вклад @foxidrive.

cd C:\work\DLS\built\Android_EU\data
dir /s /b /a-d |find /c /v "" > temp.txt
set /p count=<temp.txt
cd C:\work\DLS\TegraProject\DLS\assets\data
dir /s /b /a-d |find /c /v "" > temp.txt
set /p count2=<temp.txt

echo count is %count%
echo count 2 is %count2%

pause

if %count%==%count2% exit 0
if not %count%==%count2% exit 1
person Chris Moore    schedule 05.02.2014
comment
Кажется, теперь это работает, если запустить с машины сборки напрямую - robocopy успешно, моя проверка прошла успешно, и когда я проверяю вручную, есть 594 файла. Но когда я пытаюсь вызвать скрипт через программное обеспечение непрерывной интеграции Bamboo, robocopy проходит успешно, моя проверка проходит успешно, но когда я проверяю вручную, файлов намного меньше 594 :-/. - person Chris Moore; 05.02.2014
comment
Код, который вы показали, не даст другого ответа. Эти папки живут и меняются? Должна быть веская причина - например, какой-то другой процесс помещает файлы или удаляет их. - person foxidrive; 05.02.2014
comment
Спасибо @foxidrive. В конце концов они будут, но я проверяю это отдельно. Копия сделана, поэтому на момент тестирования в обоих каталогах есть 595 файлов, если я смотрю вручную. Когда я запускаю пакетный файл с моим кодом, значения верны (595 и 595). Когда я запускаю пакетный файл с вашим кодом, значения равны 3 и 1. Я не уверен, в чем может быть разница, но, похоже, она есть. Но даже с моим кодом все еще остается проблема с использованием Bamboo, когда файлы не копируются, но вся проверка проходит успешно, но это должна быть совершенно отдельная проблема :-/. - person Chris Moore; 05.02.2014
comment
Я не упомянул, что в папке данных есть несколько подкаталогов, но, может быть, это имеет значение для вашего кода? Например: C:\work\DLS\TegraProject\DLS\assets\data\anims C:\work\DLS\TegraProject\DLS\assets\data\models\player\body и т.д. - person Chris Moore; 05.02.2014

Попробуйте это: это будет работать до 2^31 -1 файлов. :)

@echo off
set "count="
set "count2="

for /f %%a in (' dir "C:\work\DLS\built\Android_EU\data"   /s /b /a-d ^|find /c /v "" ') do set count=%%a
for /f %%a in (' dir "C:\work\DLS\TegraProject\DLS\assets" /s /b /a-d ^|find /c /v "" ') do set count2=%%a

echo count is %count%
echo count 2 is %count2%

if %count% EQU %count2% echo equal
if %count% NEQ %count2% echo not equal

pause

if %count% EQU %count2% exit 0
if not %count% NEQ %count2% exit 1
person foxidrive    schedule 05.02.2014
comment
Спасибо @foxidrive. С этим кодом на моей машине он возвращает 2 и 1, а на машине сборки возвращает 3 и 1 :-/. У меня есть альтернативный метод, который, похоже, работает, поэтому я опубликую его сейчас. - person Chris Moore; 05.02.2014
comment
Теперь также учитываются файлы в подкаталогах. - person foxidrive; 06.02.2014