Duplicating stderr compilation output into separate file - windows

I have a project, which builds by using make, and I want to add possibility
to analyze overall state of warning messages.
My idea is change make rules in order to duplicate stderr compilation output into separate file during full rebuild. Means each time make all will be done, all output will be printed in console and in addition stderr output will be duplicating into separate file.
This warning report file will be added into repository, so that I will have possibility to compare warnings existing in repository and local warnings.
The question is how to DUPLICATE (not redirect) stderr output into separate file? Means how I should change all target in Makefile?
I know how to redirect stderr output (make all 2>warning_report.txt), but it is not
what I need. Warning messages should be both in main console output and in warning file.
I use Windows 7 as work environment but I had no any deal with Windows command line or batch files before.
Thanks in advance.
Edited:
In my case final solution looks like below:
make all 3>&1 1>&2- 2>&3- | tee.bat warning_report.txt
In this case script tee.bat, which is written in JScript for Windows, I took from link specified by PA (thanks).
What about swapping, I took it from here and here.

I don't know about windows but you can do it using tee command in Linux. tee is used to redirect STDOUT to file as well as console so you can take its advantage and check if you can solve your problem.
make all 2>&1 1>stdout.log | tee stderr.log
redirect STDERR to STDOUT, redirect STDOUT to stdout.log and all the STDERR is copied to stderr.log ans echoed on the console as well.
But the solution is not complete yet. The STDOUT is not printed on the console but only copied to the stdout.log. Try playing around the commands you will get the solution .

I just re-read your question and decided I would try to answer it.
Here's a snippet made to export stderr and display it.
#echo off
if exist stderr.error del stderr.error
this_is_not_a_command 2>stderr.error
if exist stderr.error type stderr.error & del stderr.error
This would export stderr to a file and then display the contents of that file.
Hope that helps.

Related

windows cmd: why does the order in which you specify output redirection matter?

if you do
ipconfig.exe 1> output.log 2>&1
this will direct all output(both stdout and stderr) to "output.log".
However, if you do (changing the order in which you specify desired redirections)
ipconfig.exe 2>&1 1> output.log
this will not achieve the intended effect of printing both output streams to "output.log" because "stderr" in this case will be printed to the console.
I suspect this has to do with the way "cmd" parses commands that gives different meanings depending on the order in which you specify redirects.
If so, what are the semantic rules and where are they documented?
I reckon this is something worth finding out as it could waste people hours by making them scratching their head trying to figure out why their redirection is not working.
The redirections are simply parsed left to right. Initially stdout and stderr are pointing to the console, so when you redirect stderr to where stdout is currently pointing in the second example, you are directing stderr to the console. You then subsequently redirect stdout to a file.
The explanations and examples here are quite good for further reference.

Hopw to stop the window from exiting during silent installation using batch file?

I wrote a batch file which does silent installation which is working fine. But how do I read the error messages if any appear? Can I write all the error/success messages to a log file? Also is there any command to stop the window from exiting?
There's the PAUSE command, which does nothing else then printing a message (Press any key to continue . . .) and waiting till a key is pressed. That would allow you to read any messages before the window goes. Just add the command to the batch file before the end of the script and/or at other position where you need it.
You could also try redirecting messages to a file. Typically console messages are redirected by adding >filename or 1>filename to the command line.
However, that would only redirect stdout messages, while there might also be stderr ones. Particularly, error messages are often printed to stderr, although that is not a rule and third-party programs may not follow that convention. Anyway, stderr messages would need to be redirected with 2>filename put on the command line.
To redirect both and make sure they go to the same file, use 1>filename 2>&1 on the command line.
You can add the redirection either to specific commands in the script or to the batch file in general. If you redirect specific commands of which there's more than one and you want the results to be logged in the same file, you'll need to use >> instead of > on all or at least all but the first command. That's because > would rewrite the output file if it existed and >> would append to it.

redirecting complete make output to a file

I want to redirect complete make output to a file.
I tried redirecting the stdout and stderr with the following command:
make >aks_file.txt 2>&1 &
But that is not redirecting the EXACT complete output which is otherwise generated by issuing just make (some lines are missing)
Am I missing something?
Some programs (either make or what make invokes) can detect whether their output streams are attached to the console or file and change their behavior (what they output) accordingly. To be more specific, more details on what output exactly is missing and by what program it is being generated when ran without redirection is needed.

How to capture stderr on Windows/DOS?

I want to capture the errors from a script into a file instead of to the screen.
In *nix, this is done with stderr redirection, usually
echo "Error" 2> errorfile.log
How do I do it in a CMD script under Windows?
For example:
PSKILL NOTEPAD >output.txt 2>&1
This will direct stdout and stderr to a file name output.txt.
See Underused features of Windows batch files for more details.
That should work in Win32, too.
If you have already redirected stdout, and want stderr redirected to the same file, you must use the 2>& special form, rather than just specifying the same file twice. Otherwise you'll get a "file busy" error.

Redirecting the darknet program's result to log file

I'm trying to redirect the results of darknet(yolo) program to my log file.
But there are some troubles in redirecting the result.
I tried ./darknet detect cfg/yolo.cfg yolo.weights image.jpg > log.txt, but it doesn't work.
And also other redirecting methods are not working.
I think the results of darknet program is not printed to stdout but printed to somewhere.( I don't know where it is.)
So, I have no idea to solve this problem.
Please help me...
How do I get this results in forms of file?
This appends all the standard output into a file. Remove 2>&1 if you don't want to log standard errors.
./darknet detect cfg/yolo.cfg yolo.weights image.jpg 2>&1 | tee -a log.txt
Detail info here.

Resources