Команда COPY - неожиданные результаты при перенаправлении STDERR внутри файла .BAT - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь зарегистрировать каждую передачу файла, используя команду COPY и маркер перенаправления STDERR в следующем файле .BAT:

Copy /Y FileExist01.txt NewFile01.txt 2>CopyError.log
Copy /Y NoFile02.txt NewFile02.txt 2>>CopyError.log
Copy /Y FileExist03.txt NewFile03.txt 2>>CopyError.log
Copy /Y NoFile04.txt NewFile04.txt 2>>CopyError.log
  • FileExist##.txt - это файлы, которые, как мне известно, существуют (проверенный путь и
    имя файла)
  • NoFile##.txtэто файлы, которые, как я знаю, не существуют для проверки перенаправления STDERR при ошибке (2>>CopyError.log)

Я ожидал увидеть 2 строки ошибок в CopyError.log для отображения "The system cannot find the path specified.", но вместо этого CopyError.log пусто.

Ответы [ 2 ]

3 голосов
/ 19 октября 2019

К сожалению, Copy не выводит это сообщение как StdErr.

Ранее XCopy предлагалось в качестве альтернативы. См. этот вопрос для получения дополнительной информации, однако вот вам быстрая идея:

(   Copy /Y "FileExist01.txt" "NewFile01.txt"
    Copy /Y "NoFile02.txt" "NewFile02.txt"
    Copy /Y "FileExist03.txt" "NewFile03.txt"
    Copy /Y "NoFile04.txt" "NewFile04.txt"
)|FindStr /VRC:"^ ">"CopyError.log"

Теперь, как и в случае с вашим намеченным методом, это не скажет вам, какая из команд фактически выводитсообщение. Если вы хотите сделать это, вы можете, я полагаю, вывести номер строки:

(   Copy /Y "FileExist01.txt" "NewFile01.txt"
    Copy /Y "NoFile02.txt" "NewFile02.txt"
    Copy /Y "FileExist03.txt" "NewFile03.txt"
    Copy /Y "NoFile04.txt" "NewFile04.txt"
)|FindStr /VRNC:"^ ">"CopyError.log"

Здесь к ошибке следует добавить номер, в данном случае:

2:The system cannot find the file specified.
4:The system cannot find the file specified.

По крайней мере, тогда вы сможете увидеть, что ваши 2 и 4 команды копирования потерпели неудачу.

1 голос
/ 19 октября 2019

Это потому, что команда copy не печатает это сообщение об ошибке в stderr. Я знаю, WTF!?

Вот несколько быстрых тестов, чтобы подтвердить это. Попробуйте в командной строке следующее:

dir missing-file.txt

и наблюдайте за

>dir missing-file.txt
 Volume in drive C has no label.
 Volume Serial Number is EC0D-D428

 Directory of c:\TEMP

File Not Found

Затем сделайте это с перенаправлением и убедитесь, что оно работает, сообщение об ошибке помещается в файл elog.txt.

>dir missing-file.txt
 Volume in drive C has no label.
 Volume Serial Number is EC0D-D428

 Directory of 

File Not Found

>dir missing-file.txt 2> elog.txt
 Volume in drive C has no label.
 Volume Serial Number is EC0D-D428

 Directory of 


>type elog.txt
File Not Found

Теперь повторите вышеописанное, но на этот раз с копией, а затем, в качестве последнего эксперимента, перенаправьте stdout (1) и убедитесь, что сообщение перенаправлено. Показ этой копии помещает сообщения об ошибках на стандартный вывод.

>copy /y missing-file.txt n
The system cannot find the file specified.

>copy /y missing-file.txt n 2> elog.txt
The system cannot find the file specified.

>copy /y missing-file.txt n 1> elog.txt

>type elog.txt
The system cannot find the file specified.
...