Força a saída para o console em um script em lote com saída redirecionada para um arquivo

0

Eu tenho um arquivo em lotes que, entre outras coisas, configura o ambiente e faz uma compilação. Ambos stdout (saída de script) e stderr (erros do compilador) são redirecionados para arquivos separados. É possível que um arquivo de lote envie forçadamente a saída de um determinado comando para o console, independentemente do redirecionamento no arquivo de lote?

Isso pode ser uma mensagem importante que não deve ser redirecionada. Ou, mais especificamente, para colocar um comando color no script para definir as cores de primeiro e segundo plano do console, para alertar-me para não reutilizar o console para outras coisas (porque o ambiente foi alterado). Quando o stdout é redirecionado, color não altera as cores do console.

    
por Firstrock 10.08.2018 / 15:29

2 respostas

2

Para demonstrar meu comentário:

:: Q:\Test18\SU_1347898.cmd
@Echo off
cls
( Echo normal output 1 redirected with the code block
  net file returns an error
  Echo *** this line should go directly to Console *** >CON:
  Echo normal output 2 redirected with the code block
) 1>SU_1347898_.txt 2>SU_1347898_Error.log
echo(
findstr "^" %~n0_*

Exemplo de saída:

*** this line should go directly to Console ***

SU_1347898_Error.log:Die Syntax dieses Befehls lautet:
SU_1347898_Error.log:
SU_1347898_Error.log:NET FILE
SU_1347898_Error.log:[id [/CLOSE]]
SU_1347898_Error.log:
SU_1347898_.txt:normal output 1 redirected with the code block
SU_1347898_.txt:normal output 2 redirected with the code block
    
por 10.08.2018 / 18:04
2

Como LotPings diz em seu comentário e resposta, você sempre pode direcionar a saída para o console via >con (note que o trailing : não é necessário).

Mas nem todas as funcionalidades funcionam corretamente quando direcionadas para con . Por exemplo, cls não limpa corretamente a tela.

Outra opção é salvar uma cópia do stdout original antes de redirecionar para um arquivo e, em seguida, direcionar os comandos especiais para o manipulador salvo.

@echo off
9>&1 1>stdout.txt 2>stderr.txt (
  echo Most output goes to a file
  echo Hello world
  >&9 echo But this goes to the original definition of stdout - the console
)

Observe que toda vez que você redireciona um identificador existente, a definição original é salva no primeiro identificador indefinido disponível antes que o redirecionamento seja executado. Portanto, supondo que não tenha havido nenhum redirecionamento anterior, o & 3 abaixo apontará para o stdout (console) original, portanto, não há necessidade de um salvamento explícito para 9.

@echo off
1>stdout.txt 2>stderr.txt (
  echo Most output goes to a file
  echo Hello world
  >&3 echo But this normally goes to the original definition of stdout - the console
)

Mas eu não gosto de confiar no save implícito, porque não posso garantir que o 3 ainda não tenha sido usado, então talvez eu não consiga o resultado correto. Melhor salvar explicitamente em um identificador não usado especificado por você.

    
por 12.08.2018 / 18:12