Я работаю над пакетным скриптом, который будет перемещать файлы из пользовательских каталогов на виртуальной машине и генерировать файл журнала файлов, которые были перемещены.Возврат значений ошибок с помощью xcopy из нескольких каталогов
Вот график структуры каталогов.
Этот скрипт копирует файлы из соответствующих каталогов и создает файл журнала:
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 . . .
Изменения 'если Errorlevel 1' в' если не Errorlevel 2'. 'if errorlevel n' истинно для любого значения, равного или большего, чем' n' –
Итак, если уровень ошибок равен 1, то это также верно для errorlevel равно 0? – Neal
Да. Если уровень ошибок равен 5, то любая проверка для значения, равного или ниже 5, будет равна true. Когда вы проверяете использование синтаксиса 'if errorlevel', вы проверяете от более высоких к более низким значениям. –