Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Befehl zur Variablen - übernahme - übergabe gesucht

Frage Entwicklung Batch & Shell

Mitglied: leknilk0815

leknilk0815 (Level 3) - Jetzt verbinden

04.05.2013 um 11:19 Uhr, 2497 Aufrufe, 9 Kommentare

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"...
01.
set "Datei=1234.LOG" 
02.
 
03.
for /f %%i in (dirtmp.txt) do ( 
04.
echo %%i 
05.
%%i==%Datei% 
06.
rem set "Datei=%%i" 
07.
set "%%i=Datei" 
08.
echo das soll abgearbeitet werden 
09.
echo %Datei% 
10.
echo %%i 
11.
)  
12.
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
Mitglied: bastla
04.05.2013, aktualisiert um 11:30 Uhr
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
Bitte warten ..
Mitglied: leknilk0815
04.05.2013 um 13:05 Uhr
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...
Bitte warten ..
Mitglied: bastla
04.05.2013 um 14:04 Uhr
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
Bitte warten ..
Mitglied: leknilk0815
04.05.2013 um 18:26 Uhr
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
Bitte warten ..
Mitglied: leknilk0815
04.05.2013, aktualisiert um 22:25 Uhr
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...

01.
@echo off & setlocal 
02.
echo ################################################################### 
03.
echo -------------- Beschreibung------------------------- 
04.
echo Zuerst bei Aufforderung Pfad und den Namen der Datei  
05.
echo (mit .log- Erweiterung) eingeben 
06.
echo ******************************************************************* 
07.
echo Dann bei Aufforderung den Namen der Ausgabe- Datei 
08.
echo (mit .log- Erweiterung) eingeben. 
09.
echo Solange dieser Name nicht geändert wird, werden die neuen Daten 
10.
echo an eine (wenn vorhandene) bestehende Ausgabedatei angehaengt! 
11.
echo soll die bestehende Ausgabedatei verwendet werden, Enter drueken 
12.
echo ################################################################### 
13.
 
14.
:nextfile 
15.
set "AusgabeFile=gps.csv" 
16.
set /p Datei=bitte Dateinamen der zu bearbeitenden Datei eingeben !Angabe erforderlich!:  
17.
set /p AusgabeFile=bitte Dateinamen der CSV- Ausgabe- Datei eingeben (default=gps.csv):  
18.
  
19.
rem set "Datei=13265400.LOG" 
20.
set "Bak=.bak" 
21.
set "AusgabeDatei=bereinigt-1.log" 
22.
set "Duplikate=Duplikate.txt" 
23.
set /a LineNo=0  
24.
 
25.
move "%Datei%" "%Datei%%Bak%" 
26.
 
27.
copy nul "%Duplikate%">nul 
28.
 
29.
for /f "usebackq delims=" %%i in ("%Datei%%Bak%") do set "Zeile=%%i" & call :ProcessLine 
30.
 
31.
set "Datei=bereinigt-1.log" 
32.
set "Bak=.bak" 
33.
set "AusgabeDatei=%AusgabeFile%" 
34.
set "Duplikate=Duplikate.txt" 
35.
set /a LineNo=0  
36.
 
37.
move "%Datei%" "%Datei%%Bak%" 
38.
copy nul "%Duplikate%">nul 
39.
 
40.
for /f "usebackq delims=" %%i in ("%Datei%%Bak%") do set "Zeile=%%i" & call :ProcessLine2 
41.
 
42.
del "%Datei%%Bak%"  
43.
del "%Duplikate%" 
44.
 
45.
goto nextfile 
46.
goto :eof  
47.
 
48.
:ProcessLine  
49.
set /a LineNo+=1  
50.
 
51.
echo Validiere Zeile %LineNo% ...  
52.
 
53.
findstr /b /c:"%Zeile:~,19%" "%AusgabeDatei%">nul && >>"%Duplikate%" echo %Zeile% || >>"%AusgabeDatei%" echo %Zeile% 
54.
goto :eof 
55.
 
56.
:ProcessLine2 
57.
set /a LineNo+=1  
58.
echo Validiere Zeile %LineNo% ...  
59.
 
60.
set "Reduziert=%Zeile:~,23%%Zeile:~64,-8%" 
61.
set "Reduziert=%Reduziert:~,10%,%Reduziert:~11,8%,%Reduziert:~23,10%,%Reduziert:~34%" 
62.
 
63.
findstr /e /c:"%Zeile:~-31%" "%AusgabeDatei%">nul && >>"%Duplikate%" echo %Zeile% || >>"%AusgabeDatei%" echo %Reduziert% 
64.
goto :eof
Bitte warten ..
Mitglied: bastla
04.05.2013 um 22:30 Uhr
Hallo leknilk0815!

Völlig ungetestet etwa so:
01.
@echo off & setlocal 
02.
set "Quelle=quelldateien" & REM hier auch absolute Pfadangabe möglich 
03.
set "Typ=LOG" 
04.
set "AusgabeFile=gps.csv" 
05.
  
06.
for /f "delims=" %%d in ('dir /b/a-d "%Quelle%\*.%Typ%"') do call :ProcessFile "%Quelle\%%d" 
07.
goto :eof 
08.
 
09.
:ProcessFile 
10.
set "Datei=%~1" 
11.
set "Bak=.bak" 
12.
set "AusgabeDatei=bereinigt-1.log" 
13.
set "Duplikate=Duplikate.txt" 
14.
set /a LineNo=0  
15.
 
16.
move "%Datei%" "%Datei%%Bak%" 
17.
 
18.
copy nul "%Duplikate%">nul 
19.
 
20.
for /f "usebackq delims=" %%i in ("%Datei%%Bak%") do set "Zeile=%%i" & call :ProcessLine 
21.
 
22.
set "Datei=bereinigt-1.log" 
23.
set "Bak=.bak" 
24.
set "AusgabeDatei=%AusgabeFile%" 
25.
set "Duplikate=Duplikate.txt" 
26.
set /a LineNo=0  
27.
 
28.
move "%Datei%" "%Datei%%Bak%" 
29.
copy nul "%Duplikate%">nul 
30.
 
31.
for /f "usebackq delims=" %%i in ("%Datei%%Bak%") do set "Zeile=%%i" & call :ProcessLine2 
32.
 
33.
del "%Datei%%Bak%"  
34.
del "%Duplikate%" 
35.
 
36.
goto :eof  
37.
 
38.
:ProcessLine  
39.
set /a LineNo+=1  
40.
 
41.
echo Validiere Zeile %LineNo% ...  
42.
 
43.
findstr /b /c:"%Zeile:~,19%" "%AusgabeDatei%">nul && >>"%Duplikate%" echo %Zeile% || >>"%AusgabeDatei%" echo %Zeile% 
44.
goto :eof 
45.
 
46.
:ProcessLine2 
47.
set /a LineNo+=1  
48.
echo Validiere Zeile %LineNo% ...  
49.
 
50.
set "Reduziert=%Zeile:~,23%%Zeile:~64,-8%" 
51.
set "Reduziert=%Reduziert:~,10%,%Reduziert:~11,8%,%Reduziert:~23,10%,%Reduziert:~34%" 
52.
 
53.
findstr /e /c:"%Zeile:~-31%" "%AusgabeDatei%">nul && >>"%Duplikate%" echo %Zeile% || >>"%AusgabeDatei%" echo %Reduziert% 
54.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: leknilk0815
04.05.2013 um 22:45 Uhr
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
Bitte warten ..
Mitglied: Endoro
05.05.2013, aktualisiert um 00:21 Uhr
Hallo bastla,
abgesehen davon, dass dort ein "%" fehlt:
01.
call :ProcessFile "%Quelle\%%d" 
führen diese Konstruktionen zu wundersamen Veränderungen von Zeichenketten, Beispiel:
01.
@echo off &setlocal 
02.
set "file=alcohol ^^ 120%%" 
03.
echo %file% 
04.
setlocal enabledelayedexpansion 
05.
echo !file! 
06.
endlocal 
07.
call:process "%file%" 
08.
goto:eof 
09.
 
10.
:process 
11.
set "pfile=%~1" 
12.
echo %pfile% 
13.
setlocal enabledelayedexpansion 
14.
echo !pfile! 
15.
endlocal 
16.
goto:eof
Output ist:
alcohol ^ 120% 
alcohol ^^ 120% 
alcohol ^^ 120 
alcohol ^^^^ 120
Gruss!
Bitte warten ..
Mitglied: leknilk0815
05.05.2013 um 10:01 Uhr
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.
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
PowerShell-Befehl zum mounten einer tib Datei gesucht (7)

Frage von Koopaaa zum Thema Batch & Shell ...

Sonstige Systeme
gelöst Kostenfreies Ticketsystem gesucht (1)

Frage von Stefan007 zum Thema Sonstige Systeme ...

LAN, WAN, Wireless
Software für Backup oder Datensynchronisation über WAN gesucht (4)

Frage von Rubiks zum Thema LAN, WAN, Wireless ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...