leknilk0815
Goto Top

Befehl zur Variablen - übernahme - übergabe gesucht

Inhalt von %%i soll an eine Variable übergeben werden

Servus,
trotz stöberns finde ich keine Lösung, obwohl mein Problem sicher "primitiv" ist...

In einer Datei "dirtmp.txt" sind zeilenweise untereinander Dateinamen gelistet, die nacheinander in einer for- Schleife abgearbeitet werden sollen.
Die Zeilen werden ausgelesen und tauchen in %%i auf (wie gewünscht).
Der Inhalt von %%i soll bei jedem Durchgang an die Variable "datei" übergeben werden - das bringe ich nicht hin...

Hier das "Script"...
set "Datei=1234.LOG"  

for /f %%i in (dirtmp.txt) do (
echo %%i
%%i==%Datei%
rem set "Datei=%%i"  
set "%%i=Datei"  
echo das soll abgearbeitet werden
echo %Datei%
echo %%i
) 
pause
Die drei Zeilen:
%%i==%Datei%
rem set "Datei=%%i"
set "%%i=Datei"
sind natürlich falsch, hier müsste der richtige Befehl zur Variablenübergabe hin.

Danke vorab, Gruß - Toni

Content-Key: 206026

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

Ausgedruckt am: 28.03.2024 um 14:03 Uhr

Mitglied: bastla
bastla 04.05.2013 aktualisiert um 11:30:06 Uhr
Goto Top
Hallo leknilk0815!

Der Befehl wäre
set "Datei=%%i"
- die Frage ist allerdings, wozu Du die Variable %Datei% überhaupt benötigst (da sie nämlich ohne "delayedExpansion" bzw ein Unterprogramm in der Schleife ohnehin nicht unmittelbar verwendbar ist) ...

... und da "dirtemp.txt" sehr nach zwischengespeicherter Ausgabe eines "dir"-Befehles klingt: mit zB
for /f "delims=" %%i in ('dir /b *.txt') do
könntest Du diese Datei auch einsparen.

Grüße
bastla
Mitglied: leknilk0815
leknilk0815 04.05.2013 um 13:05:04 Uhr
Goto Top
Servus Bastla,
vielen Dank für Deine Mühe, aber hier komme ich jetzt langsam an die Grenzen...
Du hast mir neulich eine fast vollständige Vorlage für ein Script gegeben, welches aus einer GPS- Logdatei unnötige Einträge ausfiltert und am Ende noch die Kommatrennung für ein CSV- File einfügt.
Da ich für eine vollständige Route mehrere hundert Dateien bearbeiten muss, dachte ich mir, daß man die manuelle Eingabe des nächsten Files eigentlich mit dem Ergebnis eines DIR- Befehls automatisieren könnte.
Daran bastle ich nun seit 2 Tagen, aber es kommt nix vernünftiges dabei raus.
Deshalb komme ich "an die Grenzen"...
Ich glaub, ich mach es manuell...
Mitglied: bastla
bastla 04.05.2013 um 14:04:19 Uhr
Goto Top
Hallo leknilk0815!
Ich glaub, ich mach es manuell...
Ich will Dich nicht davon abhalten - aber eine Schleife um das bestehende Script "herumzuwickeln" wird kein größeres Problem sein ...

Wenn Du also den aktuellen Stand des Scripts und die notwendigen Zusatzinformationen (etwa: Wo befinden sich die Quelldateien? Wie sollen die Zieldateien benannt werden? etc) postest, schau ich mir das nachher an.

Grüße
bastla
Mitglied: leknilk0815
leknilk0815 04.05.2013 um 18:26:46 Uhr
Goto Top
Servus,
das wäre natürlich absolut Spitze!
Ich brauch noch etwas Zeit, prinzipiell funktioniert das Script, ich muss noch ein paar Sachen bereinigen, damit es nicht gar so nach "Kraut und Rüben" aussieht, schön ist's ohnehin nicht.
Leider hatten wir einen Wasserrohrbruch, da muss ich auch noch was "bereinigen", nachdem Hausherr, Installateur und Maurer wieder weg sind...
Ich melde mich heut abend oder (eher) morgen.

Danke und Gruß - Toni
Mitglied: leknilk0815
leknilk0815 04.05.2013 aktualisiert um 22:25:03 Uhr
Goto Top
So, hier das Script.
Es ist so gestrickt, daß die zu bearbeitenden Dateien in einem Verzeichnis unter dem Verzeichnis liegen, in dem die Batch liegt, also z.B. c:\gps-Batch und das Datenverzeichnis c:\gps-batch\quelldateien.
Die daraus erzeugte CSV- Datei mit den bereinigten Daten kann im Batchverzeichnis liegen, das ist egal.
An dieser Struktur wird sich nichts ändern, da die Ursprungsdaten ohnehin manuell in das "Quelldateien"- Verzeichnis kopiert werden müssen (für jede Route extra). Das heißt, daß man den Pfad festmachen kann oder auch am Anfang mit "set /p" abfragen kann. Aber sowas bring ich selber hin, mein Problem liegt momentan eben darin, wie man die Batch zur Abarbeitung des Dir's bringt...
Sicher einfach für Dich, für mich momentan unmöglich...

Hier noch eine Zeile der Log- Dateien als Beispiel:
2012/06/01 13:27:18 G-Sensor(-0.13,-0.06,-1.00) N40 05.536 E019 45.829 5km/h
pro Sekunde werden 10 Zeilen produziert, da kommt was zusammen...

@echo off & setlocal
echo ###################################################################
echo -------------- Beschreibung-------------------------
echo Zuerst bei Aufforderung Pfad und den Namen der Datei 
echo (mit .log- Erweiterung) eingeben
echo *******************************************************************
echo Dann bei Aufforderung den Namen der Ausgabe- Datei
echo (mit .log- Erweiterung) eingeben.
echo Solange dieser Name nicht geändert wird, werden die neuen Daten
echo an eine (wenn vorhandene) bestehende Ausgabedatei angehaengt!
echo soll die bestehende Ausgabedatei verwendet werden, Enter drueken
echo ###################################################################

:nextfile
set "AusgabeFile=gps.csv"  
set /p Datei=bitte Dateinamen der zu bearbeitenden Datei eingeben !Angabe erforderlich!: 
set /p AusgabeFile=bitte Dateinamen der CSV- Ausgabe- Datei eingeben (default=gps.csv): 
 
rem set "Datei=13265400.LOG"  
set "Bak=.bak"  
set "AusgabeDatei=bereinigt-1.log"  
set "Duplikate=Duplikate.txt"  
set /a LineNo=0 

move "%Datei%" "%Datei%%Bak%"  

copy nul "%Duplikate%">nul  

for /f "usebackq delims=" %%i in ("%Datei%%Bak%") do set "Zeile=%%i" & call :ProcessLine  

set "Datei=bereinigt-1.log"  
set "Bak=.bak"  
set "AusgabeDatei=%AusgabeFile%"  
set "Duplikate=Duplikate.txt"  
set /a LineNo=0 

move "%Datei%" "%Datei%%Bak%"  
copy nul "%Duplikate%">nul  

for /f "usebackq delims=" %%i in ("%Datei%%Bak%") do set "Zeile=%%i" & call :ProcessLine2  

del "%Datei%%Bak%"   
del "%Duplikate%"  

goto nextfile
goto :eof 

:ProcessLine 
set /a LineNo+=1 

echo Validiere Zeile %LineNo% ... 

findstr /b /c:"%Zeile:~,19%" "%AusgabeDatei%">nul && >>"%Duplikate%" echo %Zeile% || >>"%AusgabeDatei%" echo %Zeile%  
goto :eof

:ProcessLine2
set /a LineNo+=1 
echo Validiere Zeile %LineNo% ... 

set "Reduziert=%Zeile:~,23%%Zeile:~64,-8%"  
set "Reduziert=%Reduziert:~,10%,%Reduziert:~11,8%,%Reduziert:~23,10%,%Reduziert:~34%"  

findstr /e /c:"%Zeile:~-31%" "%AusgabeDatei%">nul && >>"%Duplikate%" echo %Zeile% || >>"%AusgabeDatei%" echo %Reduziert%  
goto :eof
Mitglied: bastla
bastla 04.05.2013 um 22:30:56 Uhr
Goto Top
Hallo leknilk0815!

Völlig ungetestet etwa so:
@echo off & setlocal
set "Quelle=quelldateien" & REM hier auch absolute Pfadangabe möglich  
set "Typ=LOG"  
set "AusgabeFile=gps.csv"  
 
for /f "delims=" %%d in ('dir /b/a-d "%Quelle%\*.%Typ%"') do call :ProcessFile "%Quelle\%%d"  
goto :eof

:ProcessFile
set "Datei=%~1"  
set "Bak=.bak"  
set "AusgabeDatei=bereinigt-1.log"  
set "Duplikate=Duplikate.txt"  
set /a LineNo=0 

move "%Datei%" "%Datei%%Bak%"  

copy nul "%Duplikate%">nul  

for /f "usebackq delims=" %%i in ("%Datei%%Bak%") do set "Zeile=%%i" & call :ProcessLine  

set "Datei=bereinigt-1.log"  
set "Bak=.bak"  
set "AusgabeDatei=%AusgabeFile%"  
set "Duplikate=Duplikate.txt"  
set /a LineNo=0 

move "%Datei%" "%Datei%%Bak%"  
copy nul "%Duplikate%">nul  

for /f "usebackq delims=" %%i in ("%Datei%%Bak%") do set "Zeile=%%i" & call :ProcessLine2  

del "%Datei%%Bak%"   
del "%Duplikate%"  

goto :eof 

:ProcessLine 
set /a LineNo+=1 

echo Validiere Zeile %LineNo% ... 

findstr /b /c:"%Zeile:~,19%" "%AusgabeDatei%">nul && >>"%Duplikate%" echo %Zeile% || >>"%AusgabeDatei%" echo %Zeile%  
goto :eof

:ProcessLine2
set /a LineNo+=1 
echo Validiere Zeile %LineNo% ... 

set "Reduziert=%Zeile:~,23%%Zeile:~64,-8%"  
set "Reduziert=%Reduziert:~,10%,%Reduziert:~11,8%,%Reduziert:~23,10%,%Reduziert:~34%"  

findstr /e /c:"%Zeile:~-31%" "%AusgabeDatei%">nul && >>"%Duplikate%" echo %Zeile% || >>"%AusgabeDatei%" echo %Reduziert%  
goto :eof
Grüße
bastla
Mitglied: leknilk0815
leknilk0815 04.05.2013 um 22:45:44 Uhr
Goto Top
Servus,

ich habs mal kurz getestet, irgendwo steckt ein Fehler drin, es erfolgt keine Ausgabe, die Batch läuft aber.
Den Fehler finde ich aber (denke ich), dazu muss ich mal ein paar Pausen einbauen und sehen, was das Script nicht macht.
Da werd ich mich aber erst morgen früh damit beschäftigen, für heute hab ich irgendwie die Schnauze voll (hat aber nichts mit dem Script zu tun!)

Danke nochmal für die Hilfe, ich melde mich!
Schönen Rest- Abend noch, Gruß - Toni
Mitglied: Endoro
Endoro 05.05.2013 aktualisiert um 00:21:14 Uhr
Goto Top
Hallo bastla,
abgesehen davon, dass dort ein "%" fehlt:
call :ProcessFile "%Quelle\%%d"   

führen diese Konstruktionen zu wundersamen Veränderungen von Zeichenketten, Beispiel:
@echo off &setlocal
set "file=alcohol ^^ 120%%"  
echo %file%
setlocal enabledelayedexpansion
echo !file!
endlocal
call:process "%file%"  
goto:eof

:process
set "pfile=%~1"  
echo %pfile%
setlocal enabledelayedexpansion
echo !pfile!
endlocal
goto:eof

Output ist:
<code type="plain>
alcohol ^ 120%
alcohol 120%
alcohol
120
alcohol 120


Gruss!
Mitglied: leknilk0815
leknilk0815 05.05.2013 um 10:01:40 Uhr
Goto Top
Servus zusammen,
ich hab grade das fehlende %- Zeichen (danke Endoro!!!) eingesetzt, das Script läuft jetzt wie gewünscht und produziert das eingedampfte CSV- File!
Interessanterweise dauert die CSV- Erstellung praktisch ebensolang wie die Aufzeichnung der Orginaldaten; die Files enthalten jeweils ca. 10 Minuten Echtzeit- Daten, etwa 10 Minuten hat auch das erste File benötigt, bis die CSV erstellt war. Da hat meine Kiste jetzt ein paar Tage lang was zu tun...

Vielen Dank an Bastla für die freundliche "Unterstützung" (ausser den Anforderungen war da ja nicht viel von mir...) und schönen Sonntag,

Gruß - Toni

P.S.: wenn ich das mal in Google Maps drin habe, melde ich mich nochmal.