2017-02-15 29 views
0

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

Вот график структуры каталогов.

structure

Этот скрипт копирует файлы из соответствующих каталогов и создает файл журнала:

set hh=%time:~-11,2% 
set /a hh=%hh%+100 
set hh=%hh:~1% 
set dateseed=%date:~10,4%_%date:~4,2%_%date:~7,2%_%hh%%time:~3,2% 
set output="C:\Users\Public\Documents\Scanned_%dateseed%.txt" 
echo(

>>"%output%" (
    echo(Scanned By: %username% 
    echo(Date Scanned: %mydate% 
    echo(Time Scanned: %mytime% 
    echo(
) 

:: echoes the Username, File Name, Size(in KB), Last Modified date, and total number of files in the log file 
setlocal EnableDelayedExpansion 
set "current=" 
set/a counter=0 

>>"%output%" (
    for /f "delims=" %%F in (
    'dir /b /s \\SERVER\Path\Users ^| findstr ToBeMoved\' 
) do (
    for /f "delims=\; tokens=3,4,5*" %%a in ("%%F") do (
     if "!current!" neq "%%b" (
     set "current=%%b" 
     if defined footer echo(Total Files Moved: !counter! & echo(
     set/a counter=0, footer=1 
     echo(
     echo(%%b 
    ) 
     set/a counter+=1, size=%%~zF, kbSize=size/1024 
     echo %%d -- Size: !kbSize! KB -- Last Modified: %%~tF 
    ) 
) 
    if defined footer echo(Total Files Moved: !counter! & echo(
) 
EndLocal 

dir /b /s /a:d "\\SERVER\Path\Users\*ToBeMoved" | for /f "delims=\; tokens=3,4,5*" %%a in ('findstr ToBeMoved') do @xcopy /i /s /y "\\SERVER\Path\%%a\%%b\%%c" "E:\Path\%%b\" 

Хорошо, вот мой вопрос.

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

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. 

Так что я надеюсь, что я мог бы использовать, если заявление для моего сценария, чтобы сделать что-то вроде этого: if errorlevel 1 (del %output%)

Но я добавил сегмент после @xcopy линии сценария, который выглядит следующим образом:

if errorlevel 1 (
    echo SUCCESS! 
) else (
    echo FAILURE! 
) 

И он всегда возвращался FALURE!. Это то, что я пытаюсь сделать возможным?

EDIT: Она также может быть стоит отметить, что на выходе линии, которая копирует файлы из нескольких «ToBeMoved» каталогов возвращает строку для каждого каталога, так что, если нет файлов вы увидите что-то вроде :

0 File(s) copied 
0 File(s) copied 
0 File(s) copied 
0 File(s) copied 
0 File(s) copied 

второй EDIT: я изменил, если/другое заявление выше, чтобы быть if not errorlevel 2 из-за советы в комментариях. Однако результатом всегда является «УСПЕХ!». независимо от того, скопированы ли файлы или нет. Любая идея, почему это может быть? Есть ли в любом случае я мог бы написать цикл for для подсчета количества файлов во всем дереве каталогов и сохранить его для переменной, для проверки?

3rd EDIT: Я создал тестовый сценарий. Я сделал 2 папки на моем рабочем столе с именем «TEST1» и «TEST2». Внутри обоих было 3 папки: «SUB1», «SUB2» и «SUB3». В TEST1 \ SUB1 я создал пустой текстовый файл с именем File1.txt. В TEST2 \ SUB3 я создал еще один пустой текстовый файл с именем File2.txt. Я написал тестовый сценарий серии:

@echo off 
xcopy /s/i/y %userprofile%\Desktop\TEST1\SUB1 %userprofile%\Desktop\TEST2\SUB3 
echo Error Level = %errorlevel% 
xcopy /s/i/y %userprofile%\Desktop\TEST1\SUB2 %userprofile%\Desktop\TEST2\SUB2 
echo Error Level = %errorlevel% 
xcopy /s/i/y %userprofile%\Desktop\TEST1\SUB3 %userprofile%\Desktop\TEST2\SUB1 
echo Error Level = %errorlevel% 
xcopy /s/i/y %userprofile%\Desktop\TEST2\SUB1 %userprofile%\Desktop\TEST1\SUB3 
echo Error Level = %errorlevel% 
xcopy /s/i/y %userprofile%\Desktop\TEST2\SUB2 %userprofile%\Desktop\TEST1\SUB2 
echo Error Level = %errorlevel% 
xcopy /s/i/y %userprofile%\Desktop\TEST2\SUB3 %userprofile%\Desktop\TEST1\SUB1 
echo Error Level = %errorlevel% 
pause 

Результат был:

C:\Users\username\Desktop\TEST1\SUB1\File1.txt 
C:\Users\username\Desktop\TEST1\SUB1\File2.txt 
2 File(s) copied 
Error Level = 0 
0 File(s) copied 
Error Level = 0 
0 File(s) copied 
Error Level = 0 
0 File(s) copied 
Error Level = 0 
0 File(s) copied 
Error Level = 0 
C:\Users\username\Desktop\TEST2\SUB3\File1.txt 
C:\Users\username\Desktop\TEST2\SUB3\File2.txt 
2 File(s) copied 
Error Level = 0 
Press any key to continue . . . 
+1

Изменения 'если Errorlevel 1' в' если не Errorlevel 2'. 'if errorlevel n' истинно для любого значения, равного или большего, чем' n' –

+0

Итак, если уровень ошибок равен 1, то это также верно для errorlevel равно 0? – Neal

+0

Да. Если уровень ошибок равен 5, то любая проверка для значения, равного или ниже 5, будет равна true. Когда вы проверяете использование синтаксиса 'if errorlevel', вы проверяете от более высоких к более низким значениям. –

ответ

1

отредактирован оригинальный ответ в конце.

Мне не хватает чего-то очевидного, но мне не удалось получить xcopy.exe (Windows 10 64bit, испанский язык), чтобы сгенерировать код выхода errorlevel 1, задокументированный или нет.

Итак, я начал отладчик и, после некоторых тестов, это то, что я видел:

  • xcopy внутренне использует метод, называемый DisplayMessageAndExit, ну, отобразить сообщение и выйти. Он также использует несколько exit вызовов, чтобы оставить программу на некоторые события (напр. Ctrl-C)

  • Ни один из exit вызовов использует значение 1

  • Из списка вызовов, сделанных в DisplayMessageAndExit ни один из них не используют значение 1 как код выхода

  • из списка вызовов, сделанных в DisplayMessageAndExit только один из них используют MessageID 0x5622 (в моей установке ресурсов, связанных в C:\Windows\System32\es-ES\ulib.dll.mui, это зависит от локали), то есть No se encuentra el archivo: %1 (File not found - %1), а код выхода используется в вызове является 4

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

примечание: любому читателю, если вы знаете, что я не вижу, пожалуйста, комментарий.

Самый простой способ справиться с этим - сначала проверить, есть ли что-либо, чтобы скопировать. /L переключателя команды xcopy будет список файлов без копирования их

for /f "tokens=3,4,* delims=\;" %%a in (' 
    dir /b /s /ad "\\SERVER\Path\Users\*ToBeMoved" 
') do (

    xcopy /i /s /y /l "\\SERVER\Path\%%a\%%b\%%c" "E:\Path\%%b\" | findstr /b /l /c:"0 File(s) copied" > nul 
    if not errorlevel 1 (
     echo No files found 
    ) else (
     xcopy /i /s /y "\\SERVER\Path\%%a\%%b\%%c" "E:\Path\%%b\" 
     if errorlevel 2 (
      echo Problems in the copy 
     ) else (
      echo SUCESS 
     ) 
    ) 

) 

оригинального ответ

for /f "tokens=3,4,* delims=\;" %%a in (' 
    dir /b /s /ad "\\SERVER\Path\Users\*ToBeMoved" 
') do (
    xcopy /i /s /y "\\SERVER\Path\%%a\%%b\%%c" "E:\Path\%%b\" 
    if errorlevel 2 (
     echo Problems in the copy 
    ) else if errorlevel 1 (
     echo No files found 
    ) else (
     echo SUCESS 
    ) 
) 
+0

Когда я убедиться, что нет файлов, которые будут копироваться, я вижу это: 0 Файл (ы) скопирован УСПЕХ 0 Файл (ы) скопирован УСПЕХА – Neal

+0

@MCNC я добавил другую правку, где я пытался отладить мой вопрос , – Neal

+0

В любом случае я мог бы использовать это: '> nul 2> nul dir/a-d/s" folderName \ * "&& (echo Files существуют) || (echo Не найдено файлов) 'только для проверки файлов в подкаталогах ToBeMoved? – Neal