it-swarm.com.de

Ausgabe aus Batch-Datei umleiten

Ich erstelle eine Batch-Datei mit einigen einfachen Befehlen, um Informationen von einem System zu sammeln. Die Batch-Datei enthält Befehle zum Abrufen der Uhrzeit, der IP-Informationen, der Benutzer usw.

Ich habe alle Befehle in einer Batch-Datei zusammengefasst und es wird ausgeführt, aber ich möchte, dass die Batch-Datei beim Ausführen die Ergebnisse in eine Textdatei (Protokoll) ausgibt. Gibt es einen Befehl, den ich dem Stapel hinzufügen kann, der dies tun würde?

Denken Sie daran, dass ich den Stapel nicht über cmd ausführen und dann die Ausgabe umleiten möchte. Ich möchte die Ausgabe von innerhalb des Stapels umleiten, wenn dies möglich ist.

97
user3085030

Die einfache, naive Methode, die langsam ist, weil sie den Dateizeiger mehrmals auf das Dateiende öffnet und positioniert.

@echo off
command1 >output.txt
command2 >>output.txt
...
commandN >>output.txt

Ein besserer Weg - einfacher zu schreiben und schneller, da die Datei nur einmal geöffnet und positioniert wird.

@echo off
>output.txt (
  command1
  command2
  ...
  commandN
)

Ein weiterer guter und schneller Weg, der die Datei nur einmal öffnet und positioniert

@echo off
call :sub >output.txt
exit /b

:sub
command1
command2
...
commandN
140
dbenham

wenn Sie wollen, dass sowohl Out- als auch Err-Streams umgeleitet werden

dir >> a.txt 2>&1
56
Kalpesh Soni

Ich weiß, dass dies ein älterer Beitrag ist, aber jemand wird in einer Google-Suche darauf stoßen und es sieht auch so aus, als ob einige Fragen, die das OP in Kommentaren gestellt hat, nicht speziell angesprochen wurden. Schont mich auch, denn dies ist meine erste Antwort, die ich auf SO gepostet habe. :)

Um die Ausgabe unter Verwendung eines dynamisch generierten Dateinamens in eine Datei umzuleiten, ist mein Go-to-Ansatz (sprich: quick & dirty) die zweite von @dbenham angebotene Lösung. Also zum Beispiel:

@echo off
> filename_prefix-%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log (
echo Your Name Here
echo Beginning Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
REM do some stuff here
echo Your Name Here
echo Ending Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
)

Erstellt eine Datei wie in diesem Screenshot der Datei im Zielverzeichnis

Das wird diese Ausgabe enthalten:

Your Name Here
Beginning Date/Time: 2016-09-16_141048.log
Your Name Here
Ending Date/Time: 2016-09-16_141048.log

Denken Sie auch daran, dass diese Lösung vom Gebietsschema abhängt. Seien Sie also vorsichtig, wie/wann Sie sie verwenden.

15
Anthony
@echo off
>output.txt (
echo Checking your system infor, Please wating...

systeminfo | findstr /c:"Host Name" 
systeminfo | findstr /c:"Domain"

ipconfig /all | find "Physical Address" 

ipconfig | find "IPv4" 
ipconfig | find "Default Gateway"

)

@pause
9
saif
echo some output >"your logfile"

oder

(
 echo some output
 echo more output
)>"Your logfile"

sollte die Rechnung füllen.

Wenn Sie die Ausgabe APPEND möchten, verwenden Sie >> anstatt >. > startet eine neue Logdatei.

8
Magoo

Es gibt ein cooles kleines Programm, mit dem Sie die Ausgabe in eine Datei und auf die Konsole umleiten können

some_command  ^|  TEE.BAT  [ -a ]  filename 
@ECHO OFF
:: Check Windows version
IF NOT "%OS%"=="Windows_NT" GOTO Syntax

:: Keep variables local
SETLOCAL

:: Check command line arguments
SET Append=0
IF /I [%1]==[-a] (
        SET Append=1
        SHIFT
)
IF     [%1]==[] GOTO Syntax
IF NOT [%2]==[] GOTO Syntax

:: Test for invalid wildcards
SET Counter=0
FOR /F %%A IN ('DIR /A /B %1 2^>NUL') DO CALL :Count "%%~fA"
IF %Counter% GTR 1 (
        SET Counter=
        GOTO Syntax
)

:: A valid filename seems to have been specified
SET File=%1

:: Check if a directory with the specified name exists
DIR /AD %File% >NUL 2>NUL
IF NOT ERRORLEVEL 1 (
        SET File=
        GOTO Syntax
)

:: Specify /Y switch for Windows 2000 / XP COPY command
SET Y=
VER | FIND "Windows NT" > NUL
IF ERRORLEVEL 1 SET Y=/Y

:: Flush existing file or create new one if -a wasn't specified
IF %Append%==0 (COPY %Y% NUL %File% > NUL 2>&1)

:: Actual TEE
FOR /F "tokens=1* delims=]" %%A IN ('FIND /N /V ""') DO (
        >  CON    ECHO.%%B
        >> %File% ECHO.%%B
)

:: Done
ENDLOCAL
GOTO:EOF

:Count
SET /A Counter += 1
SET File=%1
GOTO:EOF

:Syntax
ECHO.
ECHO Tee.bat,  Version 2.11a for Windows NT 4 / 2000 / XP
ECHO Display text on screen and redirect it to a file simultaneously
ECHO.
IF NOT "%OS%"=="Windows_NT" ECHO Usage:  some_command  ³  TEE.BAT  [ -a ]  filename
IF NOT "%OS%"=="Windows_NT" GOTO Skip
ECHO Usage:  some_command  ^|  TEE.BAT  [ -a ]  filename
:Skip
ECHO.
ECHO Where:  "some_command" is the command whose output should be redirected
ECHO         "filename"     is the file the output should be redirected to
ECHO         -a             appends the output of the command to the file,
ECHO                        rather than overwriting the file
ECHO.
ECHO Written by Rob van der Woude
ECHO http://www.robvanderwoude.com
ECHO Modified by Kees Couprie
ECHO http://kees.couprie.org
ECHO and Andrew Cameron
4
AquaAlex
@echo OFF
[your command] >> [Your log file name].txt

Ich habe den obigen Befehl in meiner Batch-Datei verwendet und es funktioniert. In der Protokolldatei werden die Ergebnisse meines Befehls angezeigt.

2
Indra Permana

Fügen Sie diese beiden Zeilen in der Nähe des oberen Randes Ihrer Batch-Datei hinzu. Alle nachfolgenden stdout- und stderr-Zeilen werden nach log.txt umgeleitet:

if not "%1"=="STDOUT_TO_FILE"  %0 STDOUT_TO_FILE %*  >log.txt 2>&1
shift /1
1
ilgitano

Dies kann bei "giftigen" Zeichen in der Eingabe fehlschlagen. In Anbetracht einer Eingabe wie thisIsAnIn ^^^^ put ist ein guter Weg, um zu verstehen, was los ist. Sicher gibt es eine Regel, dass eine Eingabezeichenfolge in doppelten Anführungszeichen stehen muss, aber ich habe das Gefühl, dass diese Regel nur dann gültig ist, wenn die Bedeutung der Eingabe ein Speicherort auf einer NTFS-Partition ist (möglicherweise ist es eine Regel für URLs I) bin nicht sicher). Aber es ist natürlich keine Regel für eine beliebige Eingabezeichenfolge (es ist "eine gute Praxis", aber Sie können nicht damit rechnen).

0
jan antonin