Então, eu estou tentando executar foo.exe
, mas não quero a saída para o terminal, mas para um arquivo. Correr foo.exe > foo.txt
deve fazer isso por mim, mas não é. Quando estou executando o arquivo exe, recebo a saída. O exe está funcionando bem em outras palavras. No entanto, quando tento enviar a saída para um arquivo, a única coisa que recebo é:
'c:/Program' is not recognized as an internal or external command,
operable program or batch file.
Isso só aparece quando tento enviá-lo para um arquivo. Pensando que poderia ser o caminho (que é c:\Program Files (x86)\
e assim por diante) que é mal interpretado, tentei especificar o arquivo de saída da seguinte forma:, foo.exe > c:\test.txt
mas ainda assim não há alegria.
Portanto, além de afirmar que o binário que estou tentando executar está mal escrito, há algo que eu possa fazer para remediar isso? Lembre-se de que eu recebo uma saída válida ao simplesmente executar o exe, ele simplesmente não será impresso em um arquivo. Obviamente, a saída está lá, a questão é se existe alguma maneira de capturá-la.
fonte
Respostas:
Você não mostrou o comando que está usando que está falhando. Se você o mostrar na sua pergunta, poderá ser mais fácil encontrar uma solução para você.
Espero que seu comando seja algo como isto:
O erro que você está recebendo é uma pista:
Primeiro:
... is not recognized as an internal or external command, operable program or batch file.
Isso normalmente acontece quando você tenta redirecionar para um arquivo usando um em
|
vez de um>
.Segundo:
'c:/Program' ...
Ao especificar um nome de arquivo (ou caminho) que contenha espaços, você deve colocá-lo entre aspas duplas (
"..."
). Isto porque, quando o sistema operacional é determinar o arquivo para redirecionar para, ele vai parar de olhar para o nome do arquivo quando encontra um espaço sem aspas:"c:/Program"
.Tente o seguinte:
Se o acima não funcionar para capturar a saída do
foo.exe
arquivo de texto, existe outra possibilidade ...Se o programa
foo.exe
estiver gravando sua saída emSTDERR
vez deSTDOUT
, a saída defoo.exe
não será capturada usando o redirecionamento simples com um único>
. Você teria que fazer assim:Editar:
Aqui está uma explicação do redirecionamento de arquivo e da
2>&1
notação.Quando um programa grava no terminal, ele pode gravar em um dos dois
Streams
.Fluxo 1 é referido como
STDOUT
ou Standard-Output . Normalmente, os programas gravam sua saída "Normal" no fluxo 1.O fluxo 2 é referido como
STDERR
ou erro-padrão . Normalmente, os programas gravam sua saída "Erro" (mensagens de erro e aviso) no fluxo 2.Se um programa grava uma saída específica
STDOUT
ouSTDERR
é determinado pelo programador e como ele o escreveu. Alguns programas são gravados para enviar toda a saída (saída normal e erros) paraSTDOUT
.Quando um programa é executado sem redirecionamento de saída, todas as saídas normais e de erro são enviadas para a tela do terminal sem distinção entre o que é
STDOUT
saída ouSTDERR
saída.Quando você faz o redirecionamento "normal" com um único
>
como este:você não está especificando qual fluxo está sendo redirecionado para o arquivo, portanto, o fluxo 1 é assumido.
É o mesmo que se você o tivesse digitado assim:
Isso informa ao comando intérprete (
cmd.exe
) para capturar a saída do programa paraSTDOUT
(Fluxo 1) no nome do arquivo especificado. O1
in1>
refere-se ao fluxo 1.Nesse caso, todo o programa normal é capturado no arquivo, mas se o programa gravar no
STDERR
(Fluxo 2), essa saída não será capturada e será mostrada na tela. Geralmente, essa é a maneira "desejada" de fazê-lo, de modo que enquanto estiver capturando a saída normal do programa, você pode ver na tela se ocorrer um erro.Se você deseja capturar a saída "Normal" em um arquivo e a saída "Erro" em um arquivo diferente, é possível fazer o seguinte:
Se você deseja que a saída "Normal" e a saída "Erro" sejam capturadas no mesmo arquivo, você pode especificá-lo assim:
Essa é basicamente uma maneira "abreviada" de especificá-la e significa redirecionar o Fluxo 1 para o arquivo especificado e também redirecionar o Fluxo 2 para o mesmo "local" (arquivo) do Fluxo 1.
Editar:
Pacerier perguntou:
Resposta curta: você pensaria que eles são idênticos, mas não. Eles são diferentes.
Com o redirecionamento usando
>"filename.ext"
,1>"filename.ext"
ou2>"filename.ext"
, o>
faz com que a saída seja gravada em um novo arquivo chamado "filename.ext". Se o arquivo "filename.ext" já existir, ele será excluído primeiro.Então, usando:
foo.exe> "c: \ output.txt" 2> "c: \ output.txt"
causa um "conflito" em que ambos os redirecionamentos estão tentando gravar no mesmo arquivo e ambos estão tentando excluir o arquivo, se ele já existir. Isso provavelmente causará comportamento indesejado. Geralmente, uma ou outra, ou ambas, as saídas NÃO serão capturadas total ou previsivelmente.
O resultado real dependerá do sistema operacional e da versão e também poderá depender do comando que está sendo executado. O que provavelmente vai acontecer é:
1 A saída enviada para um dos redirecionamentos será capturada ou parcialmente capturada e a saída enviada para outro redirecionamento será perdida. 2 O sistema operacional irá reclamar do comando e nenhuma das saídas será capturada (totalmente). 3 Comportamento indefinido, indesejado, imprevisível e inesperado.
No Windows 7 e provavelmente no Windows Vista / 8/10, e possivelmente no Windows XP, o sistema operacional irá reclamar do comando e o comando será cancelado.
Por exemplo (Windows 7): tenho uma pasta chamada:
"C:\Temp\emptyfolder"
e um arquivo chamado "nonexistantfile" não existe lá.Nesse caso, usando um redirecionamento (
>output.txt
), a saída dodir
comando é capturada no arquivo:,output.txt
e a mensagem de erroFile Not Found
é exibida na tela ... esse é o comportamento esperado.Agora, usando os dois redirecionamentos ("> arquivo" AND "2> arquivo"):
Nesse caso, o sistema operacional reclamou que o arquivo (saída) já está em uso. E o arquivo "output.txt" acaba vazio (0 bytes), e a saída para os dois redirecionamentos foi perdida.
Agora, finalmente, usando os dois redirecionamentos ("> arquivo" AND "2> & 1"):
Nesse caso, "> arquivo" faz com que a saída do "fluxo 1" ("saída padrão") seja capturada no arquivo. E "2> & 1" faz com que a saída do "fluxo 2" ("saída de erro") seja enviada pelo "fluxo 1" já redirecionado e também seja capturada no (mesmo) arquivo.
Também é importante notar que a ordem é importante. Invertendo a ordem desta forma:
não é o mesmo e provavelmente não fornecerá o resultado desejado.
Nesse caso, "2> & 1", que é visto e pré-processado primeiro, faz com que a saída do "fluxo 2" ("saída de erro") seja redirecionada para o local para o qual o "fluxo 1" está direcionado atualmente, que nesse momento momento, é (por padrão) a tela. E "> arquivo" faz com que a saída do "fluxo 1" ("saída padrão") seja capturada no arquivo. O resultado final é que a saída do comando ("fluxo 1") será capturada no arquivo, mas a saída de erro ("fluxo 2") ainda será exibida na tela (não no arquivo).
fonte
foo.exe>"c:\test.txt"
realmente funcionou, mas ocorreu um erro de que o programa travou (a saída ainda estava lá). No entanto, sua sugestão tornou ainda melhor quando a2>&1
reclamação de falha desapareceu. Quer elaborar o que faz? Obrigado novamente por uma ótima resposta.2>&1
. Se você examinar seu arquivo "c: \ test.txt", provavelmente verá que a "reclamação de falha" foi gravada no arquivo.2>&1
não deve causar ou impedir que o programa falhe, apenas faz com que as mensagens de erro sejam capturadas em vez de exibidas.'for some reason it does'
de que maneira isso é afetado pelo redirecionamento? Você está dizendo que quando você redireciona2>&1
, inclusive , que o erro não ocorre? Que mensagem de erro você está vendo quando o erro ocorre?2>&1
não está incluído, o programa falha e eu recebo o diálogo padrão do Windows "este programa parou de responder". Quando eu o incluo, isso não acontece. Não faço ideia do porquê. A saída é gerada em ambos os casos.