2016-08-14 3 views
1

У меня есть скрипт python, который будет вызывать nmake. Я хочу вызвать этот скрипт в powershell следующим образом.Почему после появления PowerShell появляется ошибка после добавления перенаправления в конце строки?

python D:\build.py -f folder 

Он отлично работает, а выход заключается в следующем:

Microsoft (R) Program Maintenance Utility Version 11.00.50727.1 
Copyright (C) Microsoft Corporation. All rights reserved. 

Но если я добавить перенаправление, чтобы все stderr&stdout идет к build.log следующим образом, он показывает красные ошибки:

python D:\build.py -f folder 2>&1 | tee build.log 

python : 
At line:1 char:1 
+ python D:\source_code\media\media\build_system\build.py -f xplatform_ ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:String) [], RemoteException 
    + FullyQualifiedErrorId : NativeCommandError 

Microsoft (R) Program Maintenance Utility Version 11.00.50727.1 
Copyright (C) Microsoft Corporation. All rights reserved. 

---- Редактировать 1 ----

Я понимаю возможную причину внешний исполняемый файл nmake пишет stderr, после чего Powershell показывает ошибку.

Но первый пример, который без перенаправления, не показывает ошибку. А второй, которые перенаправляют stderr на stdout, на самом деле показывают ошибки. Так почему-то?

+1

Возможный дубликат [PsExec Выдает сообщения об ошибках, но работает без каких-либо проблем] (http://stackoverflow.com/questions/18380227/psexec-throws-error-messages -but-works-without-any-problems) – TessellatingHeckler

+0

, но у меня есть перенаправление stderr, а первые фрагменты кода не показывают ошибки – Zijing

+0

Хорошо, я понял. Перенаправление в Powershell - это объект перенаправления, а не текст. И объект ErrorRecord все еще печатался даже в stdout. – Zijing

ответ

0

Я хотел бы ответить на мой вопрос, чтобы он мог быть закрыт и полезен для других.

Причина, по которой это ошибка, заключается в том, что объект ErrorRecord напечатан в stdout.

И 2>&1 перенаправляет объект вместо текста. Поэтому после добавления перенаправления, ErrorRecord перенаправляются на stdout.

Более подробную информацию можно найти по адресу: $LastExitCode=0 but $?=False in PowerShell. Redirecting stderr to stdout gives NativeCommandError