yakazaa
Goto Top

BATCH - Ausgabe in zwei Dateien gleichzeitig

Hallo,

ganz simples Problem, knifflige Lösung ?

Ich habe ein längeres Skript, in dem ich diverse Aktionen ausführe, teilweise ergeben sich daraus so genannte "Statusmeldungen", jedoch immer "Log-Meldungen".

Beispiel:
SET STATUS=TEST.TXT
SET LOG=TEST.LOG

ECHO Skript startet...>%STATUS%
ECHO Skript startet...>%LOG%

DIR /w >>%LOG%

ECHO Skript beendet.>>%STATUS%
ECHO Skript beendet.>>%LOG%

Jetzt sind ja jeweils die ECHO Zeilen gleich, kann man das nicht zusammenfassen ?

Meine Idee wäre dahingehend:

ECHO Skript startet...>>%STATUS% >>&%LOG%

Klappt aber nicht - und ich weiß nicht warum face-smile

Content-ID: 192896

Url: https://administrator.de/contentid/192896

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

bastla
bastla 17.10.2012 um 12:08:17 Uhr
Goto Top
yakazaa
yakazaa 17.10.2012 um 12:13:02 Uhr
Goto Top
Jain, nicht so ganz:

Ich führe unter anderem auch eine Acronis Wiederherstellung durch; natürlich ungerne 2 Mal, nur um sie dann nochmal im Log stehen zu haben (wäre soch bei der FOR Schleifen Lösung so, nicht ?

SNIP:
"for /f [...] %%i in [...] do echo %%i>>Die_Datei.txt && echo %%i"
lt. Ausgabe in Datei ermöglichen aber zeitgleich in der Eingabeaufforderung weiterhin anzeigen.

Das mit dem "Tee" verstehe ich nicht...
68162
68162 17.10.2012 um 12:32:23 Uhr
Goto Top
Zitat von @yakazaa:

Das mit dem "Tee" verstehe ich nicht...

Stichworte: 'UnxUtils' und weiter führend 'tee.exe'

MfG, FM_81
Lochkartenstanzer
Lochkartenstanzer 17.10.2012 um 12:36:42 Uhr
Goto Top
Zitat von @yakazaa:
Das mit dem "Tee" verstehe ich nicht...

Das mit dem Tee ist doch schon in den Thread von mir erklärt worden. einfach mal diese Liste duchschauen und schon bist Du schlauer.


lks
andimue
andimue 17.10.2012 um 12:46:07 Uhr
Goto Top
Mach dir doch eine kleine Unterprozedur in dein Skript rein, dass die beiden ECHOs macht, also in etwa so:

...
call :SUB_ECHO  "Diese Zeile ausgeben"  
..
call :SUB_ECHO "und diese Zeile auch"  
...


:SUB_ECHO
:: Para 1 =  auszugebende Zeile
ECHO %1>>%STATUS%
ECHO %1>>%LOG%
goto :EOF
yakazaa
yakazaa 17.10.2012 aktualisiert um 13:08:28 Uhr
Goto Top
Ich mache es jetzt doch etwas anders, ein Arbeitskollege gab mir gerade den Tipp:
ECHO Hallo >%STATUS% >>%LOG%

Zumindest unter Windows 7 klappt das erstmal, wie es sich hinterher im BatrPE verhält, wird man sehen.. face-smile
pieh-ejdsch
pieh-ejdsch 17.10.2012 um 15:03:44 Uhr
Goto Top
moin,

ECHO Hallo >%STATUS% >>%LOG%
Das geht so gar nicht!
Du kannst ein Verbratenes Hänchen Äähm Verwendetes Handle in dem gleichen Befehl nicht nochmal an etwas Umleiten oder Dublizieren.
Deine Datei Status wird immer leer bleiben.
Das wäre ja einfach
echo Testen obs nicht geht. >datei
echo Hallo >datei >con
type Datei
Zumal es dafür etliche Würgarounds gibt. (siehe Tee)

Ich plädiere dazu, bei einem sehr Langen Batch am Anfang eine Variable zu setzen:
set X= 1^>tmp.t ^&^&type tmp.t ^>^>status ^&^&type tmp.t ^>^>log ^&^&type tmp.t

echo Hallo test.%X%

Das ist ein guter Kompromiss zwischen Schreibkram; Performance und Batchlänge.

Gruß Phil
pieh-ejdsch
pieh-ejdsch 19.10.2012, aktualisiert am 20.10.2012 um 15:52:50 Uhr
Goto Top
moin yakazaa,

hast Du noch keine Möglichkeit gefunden eine Variante von den vieln Angebotenen zu nutzen?

Wenn Du unbedingt mehrere Umleitungen in mehrere Dateien haben möchtest, dann eventuell so:
@set prompt=$g$s
setlocal

 rem Diese Variable(n) Dubliziert(en) eine Ausgabe in Handle 1; und Handle 3-9
 rem Handle 1 wird immer ausgegeben.
 rem Handle 3-9 kann bei Bedarf in eine Datei Umgeleitet werden,
 rem diese werden jedoch nicht extra ausgegeben.
 rem Hanlde 3 kann Aber immer Ausgegeben werden.

set X1+3=^|@for /f "delims=" %%_ in ('findstr /n "^" ') do @set "line=%%_" ^&for %%: in ("@" ">&3") do @cmd /von /c "(%%~: echo(!Line:*:=!)"   

set X13=^|@for /f "delims=" %%_ in ('findstr /n "^" ') do @set "line=%%_" ^&for %%: in ("@" ">&3 3>nul") do @for /f "tokens=1,2" %%# in ("%%~:") do @cmd /von /c "%%$ (%%# echo(!Line:*:=!)"  

set X1345=^|for /f "delims=" %%_ in ('findstr /n "^" ') do @set "line=%%_" ^&for %%: in ("@" ">&3 3>nul" ">&4 4>nul" ">&5 5>nul") do @for /f "tokens=1,2" %%# in ("%%~:") do @cmd /von /c "(%%# echo(!Line:*:=!) %%$"  

set X1-9=^|for /f "delims=" %%_ in ('findstr /n "^" ') do @set "line=%%_" ^&for %%: in ("@" ">&3 3>nul" ">&4 4>nul" ">&5 5>nul" ">&6 6>nul" ">&7 7>nul" ">&8 8>nul" ">&9 9>nul") do @for /f "tokens=1,2" %%# in ("%%~:") do @cmd /von /c "(%%# echo(!Line:*:=!) %%$"  

 rem Dateien loeschen
del Datei?
echo on
rem echo Test doppelt Handle 1+3%X1+3%
@echo off

echo Test doppelt Handle 1 ^^^& 3%X1+3%

echo Test Handle 1-5 ^(3-5^) stumm%X1345%

 rem Schreibarbeit ist es dafür Trotz alledem
echo Test Handle 1-9 ^(3-9^) stumm, 7in Datei7%X1-9% 7^^^>^^^>Datei7

echo Handling Handle Test 1 3%x13% 1^^^>^^^>Datei1 3^^^>^^^>Datei3

echo Handling Handle Test 1+3%X1+3% 1^^^>^^^>Datei1 3^^^>^^^>Datei3
echo Test Handle 1 3-5%x1345% 3^^^>^^^>Datei3 4^^^>^^^>Datei4 5^^^>^^^>Datei5
echo ------
find /n /v "" Datei?  
echo on
rem dir %X13% 3^^^>^^^> Ausgabe.txt
@echo off
echo Leite Handle 3 in Ausgabe.txt
del Ausgabe.txt xcopy.log
dir %X13% 3^^^>^^^> Ausgabe.txt

echo on
rem xcopy 2>&1 %X1+3% ^^^>^^^>xcopy.log
@echo off
echo Leite Handle 1 in Log
xcopy 2>&1 %X1+3% ^^^>^^^>xcopy.log
echo ------
type Ausgabe.txt xcopy.log 
 
pause 
Durch die Komplizierte Schreibweise der Umleitung ist die Handhabung nicht so einfach, und die Umleitung dauert auch sehr lange.

Da diese Teesorten immer erst die Ausgabe geben, wenn der erste Befehl der Kette durch ist, ist es mit der Temporären Datei immer noch am Schnellsten.
Diese auf die Handles umzubiegen geht so:
@set prompt=$g$s
setlocal

set Tee=^|(findstr "^" ^>"%temp%\tee.txt" ^&type "%temp%\tee.txt" ^&type "%temp%\tee.txt" ^>^&3)  

set TEE8=^|3^>nul 4^>nul 5^>nul 6^>nul 7^>nul 8^>nul 9^>nul (findstr "^" ^>"%temp%\tee.txt" ^&type "%temp%\tee.txt" ^&type "%temp%\tee.txt" ^>^&3 ^&type "%temp%\tee.txt" ^>^&4 ^&type "%temp%\tee.txt" ^>^&5 ^&type "%temp%\tee.txt" ^>^&6 ^&type "%temp%\tee.txt" ^>^&7 ^&type "%temp%\tee.txt" ^>^&8 ^&type "%temp%\tee.txt" ^>^&9)  

rem echo Test doppelt Handle 1+3%Tee%
@echo off

echo Test doppelt Handle 1 ^& 3%Tee%
echo on
rem dir %tee% 3> Ausgabe.txt
@echo off
echo Leite Handle 3 in Ausgabe.txt
dir %tee% 3> Ausgabe.txt

echo on
rem xcopy 2>&1 %tee% >xcopy.log
@echo off
echo Leite Handle 1 in Log
xcopy 2>&1 %tee% >xcopy.log
echo ------
type Ausgabe.txt xcopy.log 
 
pause
 rem die Beiden Variablen TEE TEE8 / Anweisungen stehen nun in der CMD-Line zur Verfügung
cmd /k prompt $g$S
Setz doch bitte den Betrag auf gelöst. Danke

Gruß Phil
yakazaa
yakazaa 19.10.2012 aktualisiert um 15:02:26 Uhr
Goto Top
Hallo zusammen,

hatte die Anfrage eigentlich verworfen, denn es ist ehrlich gesagt ein bisschen zuviel Aufwand, für das was ich erreichen wollte.. face-smile

Ich schreibe jetzt einfach in Temp-Dateien und schreibe es im Anschluss in eine zweite Datei:

X:\Programs\Acronis\TrueImageCMD.EXE /deploy /filename:%IMAGEPATH%\%IMAGENAME%.TIB /harddisk:1 /target_harddisk:1>>%STATUS%
TYPE %STATUS%>>%LOG%

Tut genau das, was ich brauche...

DANKE euch allen für die Mühe,
Gruß Dominik