Batchdatei erfordert Dateinamen - Ausführen, Sortieren und Umbenennen Schleife
Hallo,
ich heiße Jürgen, bin 25 Jahre alt und beschäftige mich derzeit mit der Programmierung von Werkzeugmaschinen.
Hierzu benötige ich einige Hilfsmittel wie in diesem Falle eine *.bat welche eine Verschlüsselungsfolge ausführt
die Datei umbenennt und in den richtigen Ordner speichert.
Das ganze sollte mehr oder weniger "automatisch" ablaufen, sprich wird eine Datei in Verzeichnis C:/XYZ mit der Dateiendung *.XYZ abgespeichert sollte diese durch eine weitere *.bat-Datei Verschlüsselt werden. Die Verschlüsselung habe ich bereits selbst erstellt, bzw. auf vorhandenem aufgebaut. Die Datei crypt.bat führt eine CHG.exe Datei aus, welche die ASCII/ANSI Zeichen umwandelt. Ich bin mit BATCH noch Neu und habe mich ein paar Tage eingelesen und das erste Ergebnis ist die crypt.bat.
Der Ablauf sollte so aussehen:
Verzeichnis C:\XYZ | Stammverzeichnis
Verzeichnis C:\XYZ/DATA | Datenverzeichnis in welchen die Ursprunsdaten abgespeichert werden.
Verzeichnis C:\XYZ/DATA/TXT/ | Datenverzeichnis in welches die Originaldatei nach der Verschlüsselung verschoben wird.
Verzeichnis C:\XYZ/DATA/ORIGIN/ Datenverzeichnis für die Originaldatei
Die Dateiendung der zu Verschlüsselnden Dateien ist immer gleich *.XYZ, jedoch beinhaltet der Dateiname ein % als Vorzeichen ( %123.XYZ ) Das machte mir schon Probleme ;-(
Um eine Datei zu Verschlüsseln muss der Dateiname angefügt werden: Beispiel crypt.bat %123.XYZ
Wird eine solche Datei in den Ordner C: \XYZ/DATA abgespeichert, sollte die crypt.bat Datei diese automatisch Verschlüsseln und anschließend in den Ordner C:\XYZ/DATA/TXT/ verschieben. Meine Versuche sind leider Fehlgeschlagen. Die CHG.exe Datei überschreibt die zu Verschlüsselnde Datei automatisch, daher wäre es Sinnvoll vor der Verschlüsselung die Originaldatei in den Ordner C:\XYZ/DATA/ORIGIN/ zu kopieren.
Meine Frage hierzu: Ist es besser eine weitere *.bat Datei anzulegen in welcher meine "Wünsche" abgelegt werden, oder kann dies direkt in die crypt.bat mit aufgenommen werden? Ist das ganze üerhaupt machbar?
ich heiße Jürgen, bin 25 Jahre alt und beschäftige mich derzeit mit der Programmierung von Werkzeugmaschinen.
Hierzu benötige ich einige Hilfsmittel wie in diesem Falle eine *.bat welche eine Verschlüsselungsfolge ausführt
die Datei umbenennt und in den richtigen Ordner speichert.
Das ganze sollte mehr oder weniger "automatisch" ablaufen, sprich wird eine Datei in Verzeichnis C:/XYZ mit der Dateiendung *.XYZ abgespeichert sollte diese durch eine weitere *.bat-Datei Verschlüsselt werden. Die Verschlüsselung habe ich bereits selbst erstellt, bzw. auf vorhandenem aufgebaut. Die Datei crypt.bat führt eine CHG.exe Datei aus, welche die ASCII/ANSI Zeichen umwandelt. Ich bin mit BATCH noch Neu und habe mich ein paar Tage eingelesen und das erste Ergebnis ist die crypt.bat.
Der Ablauf sollte so aussehen:
Verzeichnis C:\XYZ | Stammverzeichnis
Verzeichnis C:\XYZ/DATA | Datenverzeichnis in welchen die Ursprunsdaten abgespeichert werden.
Verzeichnis C:\XYZ/DATA/TXT/ | Datenverzeichnis in welches die Originaldatei nach der Verschlüsselung verschoben wird.
Verzeichnis C:\XYZ/DATA/ORIGIN/ Datenverzeichnis für die Originaldatei
Die Dateiendung der zu Verschlüsselnden Dateien ist immer gleich *.XYZ, jedoch beinhaltet der Dateiname ein % als Vorzeichen ( %123.XYZ ) Das machte mir schon Probleme ;-(
Um eine Datei zu Verschlüsseln muss der Dateiname angefügt werden: Beispiel crypt.bat %123.XYZ
Wird eine solche Datei in den Ordner C: \XYZ/DATA abgespeichert, sollte die crypt.bat Datei diese automatisch Verschlüsseln und anschließend in den Ordner C:\XYZ/DATA/TXT/ verschieben. Meine Versuche sind leider Fehlgeschlagen. Die CHG.exe Datei überschreibt die zu Verschlüsselnde Datei automatisch, daher wäre es Sinnvoll vor der Verschlüsselung die Originaldatei in den Ordner C:\XYZ/DATA/ORIGIN/ zu kopieren.
Meine Frage hierzu: Ist es besser eine weitere *.bat Datei anzulegen in welcher meine "Wünsche" abgelegt werden, oder kann dies direkt in die crypt.bat mit aufgenommen werden? Ist das ganze üerhaupt machbar?
@echo off
cls
Rem Verschlüsseln
CHG -i %1 -s [15] -r [15]
CHG -i %1 -s [19] -r [19]
CHG -i %1 -s [32] -r [32]
CHG -i %1 -s [35] -r [163]
CHG -i %1 -s [37] -r [165]
CHG -i %1 -s [40] -r [40]
CHG -i %1 -s [41] -r [169]
CHG -i %1 -s [44] -r [172]
CHG -i %1 -s [45] -r [45]
CHG -i %1 -s [49] -r [177]
CHG -i %1 -s [50] -r [178]
CHG -i %1 -s [51] -r [51]
CHG -i %1 -s [52] -r [180]
CHG -i %1 -s [53] -r [53]
CHG -i %1 -s [54] -r [54]
CHG -i %1 -s [55] -r [183]
CHG -i %1 -s [56] -r [184]
CHG -i %1 -s [57] -r [57]
CHG -i %1 -s [60] -r [60]
CHG -i %1 -s [61] -r [189]
CHG -i %1 -s [62] -r [190]
CHG -i %1 -s [65] -r [65]
CHG -i %1 -s [66] -r [66]
CHG -i %1 -s [67] -r [195]
CHG -i %1 -s [68] -r [68]
CHG -i %1 -s [69] -r [197]
CHG -i %1 -s [70] -r [198]
CHG -i %1 -s [71] -r [71]
CHG -i %1 -s [72] -r [72]
CHG -i %1 -s [73] -r [201]
CHG -i %1 -s [74] -r [202]
CHG -i %1 -s [76] -r [204]
CHG -i %1 -s [77] -r [77]
CHG -i %1 -s [78] -r [78]
CHG -i %1 -s [79] -r [207]
CHG -i %1 -s [80] -r [80]
CHG -i %1 -s [81] -r [209]
CHG -i %1 -s [82] -r [210]
CHG -i %1 -s [83] -r [83]
CHG -i %1 -s [84] -r [212]
CHG -i %1 -s [85] -r [85]
CHG -i %1 -s [86] -r [86]
CHG -i %1 -s [87] -r [215]
CHG -i %1 -s [88] -r [216]
CHG -i %1 -s [89] -r [89]
CHG -i %1 -s [90] -r [90]
cls
echo --> Datei erfolgreich Konvertiert
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 148848
Url: https://administrator.de/forum/batchdatei-erfordert-dateinamen-ausfuehren-sortieren-und-umbenennen-schleife-148848.html
Ausgedruckt am: 18.04.2025 um 08:04 Uhr
19 Kommentare
Neuester Kommentar

Salü,
anbei ein erster ungetesteter aus dem Bauch geschriebener Versuch
Gruß
anbei ein erster ungetesteter aus dem Bauch geschriebener Versuch
:start
Rem Betapahse ungetestet
Rem @echo off
if not exist C:\XYZ\DATA\*.xyz goto end
for /f %%a in ('dir /b C:\XYZ\DATA\*.xyz') do (
copy C:\XYZ\DATA\%%a C:\XYZ/DATA\ORIGIN\
call :crypt %%a
move C:\XYZ\DATA\%%a C:\XYZ/DATA\TXT\
)
goto eof
:crypt
CHG -i %1 -s [15] -r [15]
CHG -i %1 -s [19] -r [19]
CHG -i %1 -s [32] -r [32]
CHG -i %1 -s [35] -r [163]
CHG -i %1 -s [37] -r [165]
CHG -i %1 -s [40] -r [40]
CHG -i %1 -s [41] -r [169]
CHG -i %1 -s [44] -r [172]
CHG -i %1 -s [45] -r [45]
CHG -i %1 -s [49] -r [177]
CHG -i %1 -s [50] -r [178]
CHG -i %1 -s [51] -r [51]
CHG -i %1 -s [52] -r [180]
CHG -i %1 -s [53] -r [53]
CHG -i %1 -s [54] -r [54]
CHG -i %1 -s [55] -r [183]
CHG -i %1 -s [56] -r [184]
CHG -i %1 -s [57] -r [57]
CHG -i %1 -s [60] -r [60]
CHG -i %1 -s [61] -r [189]
CHG -i %1 -s [62] -r [190]
CHG -i %1 -s [65] -r [65]
CHG -i %1 -s [66] -r [66]
CHG -i %1 -s [67] -r [195]
CHG -i %1 -s [68] -r [68]
CHG -i %1 -s [69] -r [197]
CHG -i %1 -s [70] -r [198]
CHG -i %1 -s [71] -r [71]
CHG -i %1 -s [72] -r [72]
CHG -i %1 -s [73] -r [201]
CHG -i %1 -s [74] -r [202]
CHG -i %1 -s [76] -r [204]
CHG -i %1 -s [77] -r [77]
CHG -i %1 -s [78] -r [78]
CHG -i %1 -s [79] -r [207]
CHG -i %1 -s [80] -r [80]
CHG -i %1 -s [81] -r [209]
CHG -i %1 -s [82] -r [210]
CHG -i %1 -s [83] -r [83]
CHG -i %1 -s [84] -r [212]
CHG -i %1 -s [85] -r [85]
CHG -i %1 -s [86] -r [86]
CHG -i %1 -s [87] -r [215]
CHG -i %1 -s [88] -r [216]
CHG -i %1 -s [89] -r [89]
CHG -i %1 -s [90] -r [90]
goto eof
:end
ping localhost -n 10>nul
goto start
Gruß
Hallo Jürgen,
imho funktioniert die Übergabe nicht wenn ein "%" im Dateinamen enthalten ist nicht. Ich meine es gibt dafür auch keine mir bekannte Lösung.
Du kannst aber in der FOR-Schleife vor dem CALL einfach ein
verwenden.
Den CALL dann ohne Übergabeparameter und in der :crypt Routine statt %1 einfach %datei% verwenden.
Schreibst Du hinter der FOR Schleife statt "GOTO eof" einfach "GOTO end" schleift das Ding ewig. Timo ist bestimmt davon ausgegangen das crypt.bat soll aus einem anderen Job heraus aufgerufen werden und sich nach getaner Arnbeit beenden.
Gruß icsat
imho funktioniert die Übergabe nicht wenn ein "%" im Dateinamen enthalten ist nicht. Ich meine es gibt dafür auch keine mir bekannte Lösung.
Du kannst aber in der FOR-Schleife vor dem CALL einfach ein
set "datei=%%a"
Den CALL dann ohne Übergabeparameter und in der :crypt Routine statt %1 einfach %datei% verwenden.
Schreibst Du hinter der FOR Schleife statt "GOTO eof" einfach "GOTO end" schleift das Ding ewig. Timo ist bestimmt davon ausgegangen das crypt.bat soll aus einem anderen Job heraus aufgerufen werden und sich nach getaner Arnbeit beenden.
Gruß icsat
hab mich wohl nicht deutlich genug ausgedrückt, sorry:
Nachtrag:
Hast Du eben noch was geändert? Das sah doch gerade noch anders aus?
Wenn Du DATEI in der FOR-Schleife verwenden willst muss Du !DATEI! statt %DATEI% verwenden.
Dazu ist es allerdings erforderlich zu Beginn des Batch ein
zu verwenden.
for /f %%a in ('dir /b C:\NC_NUM\DATA\*.NUM') do (
copy C:\NC_NUM\DATA\%%a C:\NC_NUM\DATA\ORIGIN\
set "datei=%%a"
call :crypt
move C:\NC_NUM\DATA\%%a C:\NC_NUM\DATA\NC\
)
Nachtrag:
Hast Du eben noch was geändert? Das sah doch gerade noch anders aus?
Wenn Du DATEI in der FOR-Schleife verwenden willst muss Du !DATEI! statt %DATEI% verwenden.
Dazu ist es allerdings erforderlich zu Beginn des Batch ein
setlocal enabledelayedexpansion
Helfen doch gerne 
Warum der move nicht funktionieren sollte und jetzt nach Änderung der Pfade funktioniert erschließt sich mir allerdings so spontan nicht.
Auch Deine Aussage zu den 4 Zeichen im Dateinamen ist für mich nicht schlüssig.
Dafür würde es helfen die beiden
durch
zu ersetzen. Dann sollte auch die Fehlermedung verschwinden.
Den Part ab Zeile 61 kannst Du übrigens löschen, da der nun nicht mehr angesprungen wird.
Warum der move nicht funktionieren sollte und jetzt nach Änderung der Pfade funktioniert erschließt sich mir allerdings so spontan nicht.
Auch Deine Aussage zu den 4 Zeichen im Dateinamen ist für mich nicht schlüssig.
Dafür würde es helfen die beiden
goto eof
goto :eof
Den Part ab Zeile 61 kannst Du übrigens löschen, da der nun nicht mehr angesprungen wird.
Hallo Jürgen,
Es gibt nur sehr wenige Dinge, die nicht möglich sind.
Ich schließe daraus, dass zwischen Buchstaben und Zahlen mal eine SPACE steht und mal nicht. Richtig?
Enthalten die Datensätze in der Datei immer ausschließlich die Werte X, Y und Z?
Sollen nur Ganzzahlen addiert werden oder evtl. Zahlen mit Nachkommastellen ungleich "00"?
Ich würde mich an Deiner Stelle einmal mit dem FOR auseinander setzen.
Habe gerade keine Windows Kiste griffbereit, mir würde aber etwas in diese Richtung "for /f tokens delims" vorschweben.
Gruß icsat
Es gibt nur sehr wenige Dinge, die nicht möglich sind.
Ich schließe daraus, dass zwischen Buchstaben und Zahlen mal eine SPACE steht und mal nicht. Richtig?
Zitat von @flipmode85:
Hier sollte der Wert "Z-1234.00" um den Zahlenwert [SZ], angenommen 10.00 addiert werden. Bei dem angegebenen Wert
Oben war zwischen "Z" und "-" noch ein SPACE. Was den nun?Hier sollte der Wert "Z-1234.00" um den Zahlenwert [SZ], angenommen 10.00 addiert werden. Bei dem angegebenen Wert
Zitat von @flipmode85:
Das Ergebnis sollte anschließend so aussehen: Z1244.00 Die zwei Nachkommastellen werden benötigt, das Trennzeichen ist
Im modifizierten Ergebnis soll kein SPACE stehen?Das Ergebnis sollte anschließend so aussehen: Z1244.00 Die zwei Nachkommastellen werden benötigt, das Trennzeichen ist
Zitat von @flipmode85:
besteht darin, das es in der Textdatei auch Werte gibt welche gleich Formatiert sind, etwa "Z 123.00" und nicht
Wenn nichts geändert wird soll ein SPACE erhalten bleiben?besteht darin, das es in der Textdatei auch Werte gibt welche gleich Formatiert sind, etwa "Z 123.00" und nicht
Enthalten die Datensätze in der Datei immer ausschließlich die Werte X, Y und Z?
Sollen nur Ganzzahlen addiert werden oder evtl. Zahlen mit Nachkommastellen ungleich "00"?
Ich würde mich an Deiner Stelle einmal mit dem FOR auseinander setzen.
FOR /?
Gruß icsat
Sorry, dass ich erst jetzt antworten kann. Die Kombination von Zeit und Windowskiste war in den letzten Tagen leider nicht wirklich gegeben.
Das mit dem Buch würde ich mir schenken, für die wenigen Befehle lohnt sich dass imho nicht. Da lernt man im Internet und insbesondere hier viel besser. Es gibt zu jedem Problem unzählige Beispiele. Ich lege Dir da für den Anfang einfach mal Biber's Workshops an Herz.
Workshop Batch for Runaways - Part I - Beispiel FindLongPath.Bat Bedenklich lange Pfade finden
Workshop Batch for Runaways - Part II - Ein bisschen Handwerkszeug
Workshop Batch for Runaways - Part III - Datums- und Zeitvariablen im Batch
Außerdem findest Du unter Anleitungen auch noch diverse andere Dinge von Intresse.
Nun aber zu Deinen Problem:
Leider sind das jede Menge Annahmen.
Folgendes habe ich als Eingeabe verwendet:
Und bei der Addition von 3.99 habe ich folgende Ausgabe erhalten:
Sollte das jetzt nicht Deinen Vorstellungen entsprechen poste doch bitte mal ein Vorher / Nacher. Evtl. mit etwas mehr und möglichst variantenreicheren Zeilen.
Dein modifiziertes Skript:
Ich hoffe ich habe mich jetzt bei den Verzeichnissen nicht vertan. Ach so, ich habe noch ein Verzeichnis ADD angelegt, in welchem die Datei nach Modifikation und vor Verschlüsselung gesichert wird.
Ich bin mir jetzt nicht sicher, welche Datenmengen Du verarbeiten willst. Sollte die Dateien umfangreicher sein, könnte es einen zeitlichen Vorteil bringen, das ganze z.B. mit Hilfe von VBS zu lösen.
Ich hatte einmal täglich mehrere Dateien, die insgesamt wenige Gigabyte Daten enthielten und musse die erste Stelle von jedem Datensatz von 1 auf 2 ändern. Insgesamt so ca. 3,5 Mio Datensätze.
Mein Batch lag da bei etwa 30 Minuten wenn ich mich noch richtig erinnere, mein VBS bei unter einer Minute Verarbeitungszeit.
Gruss icsat
Das mit dem Buch würde ich mir schenken, für die wenigen Befehle lohnt sich dass imho nicht. Da lernt man im Internet und insbesondere hier viel besser. Es gibt zu jedem Problem unzählige Beispiele. Ich lege Dir da für den Anfang einfach mal Biber's Workshops an Herz.
Workshop Batch for Runaways - Part I - Beispiel FindLongPath.Bat Bedenklich lange Pfade finden
Workshop Batch for Runaways - Part II - Ein bisschen Handwerkszeug
Workshop Batch for Runaways - Part III - Datums- und Zeitvariablen im Batch
Außerdem findest Du unter Anleitungen auch noch diverse andere Dinge von Intresse.
Nun aber zu Deinen Problem:
- Mir ist noch nicht klar woher der Wert ([SZ]) für die Addition genommen werden soll. Habe ich in Deinem Beispiel nicht gefunden, daher habe ich den in meinen Skript erst mal als Fix angenommen.
- Was bedeutet "Hier kann der Parameter L142= -10 verwendet werden, ..."? Soll auch auf die 10 der Fixe Wert addiert werden oder soll die 10 als Wert für die Addition genommen werden?
- Minus Zeichen habe ich vollkommen ignoriert und bin immer von absoluten Werten ausgegangen.
- Ein Problem ist, dass Du im Batch nur mit Ganzzahlen rechnen kannst. Daher habe ich die Zahl in Vorkomma und Nachkommestellen zerlegt.
- Ich bin davon ausgegangen, dass eine Zeile maximal ein "Z" enthält.
- Weiter bin ich davon ausgegangen, dass eine "ZL"-Zeile nicht modifiziert wird und bei allen anderen "Z"-Zeilen dem "Z" immer der zu modifizierende Wert folgt.
Leider sind das jede Menge Annahmen.
Folgendes habe ich als Eingeabe verwendet:
%101.0
N10 #2000 (FRAESER:START-POS.)
# L140= 0.0 L141= 0.0 L142= -10 L143= 1 L144= 102 L145= 12000 L146= 1524 L147= 1 L148= 0
# G77H9956
N210 #851 (ISO) G90 XY ZL112
N230 #851 (ISO) G1 X98.73 Y98.85 Z-2.50
N240 #851 (ISO) G1 X98.73 Y100.39 Z-2.50
N250 #851 (ISO) G1 X102.28 Y100.39 Z-2.50
N260 #851 (ISO) G1 X102.28 Y98.85 Z-2.50
N270 #851 (ISO) G1 X98.73 Y98.85 Z-2.50
N230 #851 (ISO) G1 Z-2.50
Und bei der Addition von 3.99 habe ich folgende Ausgabe erhalten:
%101.0
N10 #2000 (FRAESER:START-POS.)
# L140= 0.0 L141= 0.0 L142= -10 L143= 1 L144= 102 L145= 12000 L146= 1524 L147= 1 L148= 0
# G77H9956
N210 #851 (ISO) G90 XY ZL112
N230 #851 (ISO) G1 X98.73 Y98.85 Z6.49
N240 #851 (ISO) G1 X98.73 Y100.39 Z6.49
N250 #851 (ISO) G1 X102.28 Y100.39 Z6.49
N260 #851 (ISO) G1 X102.28 Y98.85 Z6.49
N270 #851 (ISO) G1 X98.73 Y98.85 Z6.49
N230 #851 (ISO) G1 Z6.49
Sollte das jetzt nicht Deinen Vorstellungen entsprechen poste doch bitte mal ein Vorher / Nacher. Evtl. mit etwas mehr und möglichst variantenreicheren Zeilen.
Dein modifiziertes Skript:
:start
:@echo off
setlocal EnableDelayedExpansion
set "gcode=C:\NC_NUM\DATA\GCODE"
set "origin=C:\NC_NUM\DATA\ORIGIN"
set "add=C:\NC_NUM\DATA\ADD"
set "num=C:\NC_NUM\DATA\NUM"
for /f %%a in ('dir /b %GCODE%\*.NUM') do (
REM Get copy in folders
move %GCODE%\%%a %ORIGIN%\
set "eingabe=%ORIGIN%\%%a"
set "ausgabe=%GCODE%\%%a
call :add
copy !AUSGABE! %ADD%\
call :crypt
move !AUSGABE! %NUM%\
)
:ende
endlocal
goto :eof
:add
for /f "delims=Z tokens=1,2" %%i in (%EINGABE%) do (
set addvk=3
set addnk=99
set "zteil=%%j"
if "!ZTEIL!"=="" (
echo %%i>>%AUSGABE%
) else (
if "!ZTEIL:~0,1!"=="L" (
echo %%iZ%%j>>%AUSGABE%
) else (
for /f "tokens=1,2,3 delims=-. " %%k in ("!ZTEIL!") do (
set /a vk=%%k+!ADDVK!
set /a nk=%%l+!ADDNK!
if !NK! GEQ 100 set /a vk+=1 && set /a nk-=100
echo %%iZ!VK!.!NK! %%m>>%AUSGABE%
)
)
)
)
goto :eof
:crypt
CHG -i %AUSGABE% -s [15] -r [15]
CHG -i %AUSGABE% -s [19] -r [19]
CHG -i %AUSGABE% -s [32] -r [32]
CHG -i %AUSGABE% -s [35] -r [163]
CHG -i %AUSGABE% -s [37] -r [165]
CHG -i %AUSGABE% -s [40] -r [40]
CHG -i %AUSGABE% -s [41] -r [169]
CHG -i %AUSGABE% -s [44] -r [172]
CHG -i %AUSGABE% -s [45] -r [45]
CHG -i %AUSGABE% -s [49] -r [177]
CHG -i %AUSGABE% -s [50] -r [178]
CHG -i %AUSGABE% -s [51] -r [51]
CHG -i %AUSGABE% -s [52] -r [180]
CHG -i %AUSGABE% -s [53] -r [53]
CHG -i %AUSGABE% -s [54] -r [54]
CHG -i %AUSGABE% -s [55] -r [183]
CHG -i %AUSGABE% -s [56] -r [184]
CHG -i %AUSGABE% -s [57] -r [57]
CHG -i %AUSGABE% -s [60] -r [60]
CHG -i %AUSGABE% -s [61] -r [189]
CHG -i %AUSGABE% -s [62] -r [190]
CHG -i %AUSGABE% -s [65] -r [65]
CHG -i %AUSGABE% -s [66] -r [66]
CHG -i %AUSGABE% -s [67] -r [195]
CHG -i %AUSGABE% -s [68] -r [68]
CHG -i %AUSGABE% -s [69] -r [197]
CHG -i %AUSGABE% -s [70] -r [198]
CHG -i %AUSGABE% -s [71] -r [71]
CHG -i %AUSGABE% -s [72] -r [72]
CHG -i %AUSGABE% -s [73] -r [201]
CHG -i %AUSGABE% -s [74] -r [202]
CHG -i %AUSGABE% -s [76] -r [204]
CHG -i %AUSGABE% -s [77] -r [77]
CHG -i %AUSGABE% -s [78] -r [78]
CHG -i %AUSGABE% -s [79] -r [207]
CHG -i %AUSGABE% -s [80] -r [80]
CHG -i %AUSGABE% -s [81] -r [209]
CHG -i %AUSGABE% -s [82] -r [210]
CHG -i %AUSGABE% -s [83] -r [83]
CHG -i %AUSGABE% -s [84] -r [212]
CHG -i %AUSGABE% -s [85] -r [85]
CHG -i %AUSGABE% -s [86] -r [86]
CHG -i %AUSGABE% -s [87] -r [215]
CHG -i %AUSGABE% -s [88] -r [216]
CHG -i %AUSGABE% -s [89] -r [89]
CHG -i %AUSGABE% -s [90] -r [90]
goto :eof
Ich hoffe ich habe mich jetzt bei den Verzeichnissen nicht vertan. Ach so, ich habe noch ein Verzeichnis ADD angelegt, in welchem die Datei nach Modifikation und vor Verschlüsselung gesichert wird.
Ich bin mir jetzt nicht sicher, welche Datenmengen Du verarbeiten willst. Sollte die Dateien umfangreicher sein, könnte es einen zeitlichen Vorteil bringen, das ganze z.B. mit Hilfe von VBS zu lösen.
Ich hatte einmal täglich mehrere Dateien, die insgesamt wenige Gigabyte Daten enthielten und musse die erste Stelle von jedem Datensatz von 1 auf 2 ändern. Insgesamt so ca. 3,5 Mio Datensätze.
Mein Batch lag da bei etwa 30 Minuten wenn ich mich noch richtig erinnere, mein VBS bei unter einer Minute Verarbeitungszeit.
Gruss icsat
Zitat von @flipmode85:
Im Anhang ist eine weitere etwas größere Datei, die häufigkeit der Z-Werte ist sehr verschieden.
Ich finde maximal einen pro Zeile. Ist das richtig?Im Anhang ist eine weitere etwas größere Datei, die häufigkeit der Z-Werte ist sehr verschieden.
Zitat von @flipmode85:
addiert werden soll, lässt sich in Zeile 18 finden L142= -10 dieser kann sich verändern
Ist es immer der Wert hinter "L142=" in den Headerdaten?addiert werden soll, lässt sich in Zeile 18 finden L142= -10 dieser kann sich verändern
Steht "L142=" immer an der dritten Stelle der betroffenen Zeile?
Ist der Wert immer negativ oder kann der auch positiv sein?
Zitat von @flipmode85:
VBS, C oder C++ ich habe mich hierzu gestern etwas Informiert und es gibt eine menge unterschiedlicher Meinungen dazu. Was ist
wirklich empfehlenswert zu erlernen? In Abhängigkeit der Anwendungen würde BATCH "vorerst" ausreichen.
C++ klingt sehr interessant!
Imho ist es empfehlenswert die Grundlagen der Programmierung zu verstehen. Die Sprache ist dann nur noch ein lernen von Vokabeln.VBS, C oder C++ ich habe mich hierzu gestern etwas Informiert und es gibt eine menge unterschiedlicher Meinungen dazu. Was ist
wirklich empfehlenswert zu erlernen? In Abhängigkeit der Anwendungen würde BATCH "vorerst" ausreichen.
C++ klingt sehr interessant!
Die Frage ist eigentlich mehr, was für welchen Einsatzzweck sinnvoll ist.
Dabei würde ich für die Automatisierung von Jobabläufen auf Batch setzen.
Sind in den Jobabläufen Datenmanipulationen oder Dinge erforderlich, bei denen meine Batch-Kenntnisse an ihre Grenzen stoßen, nehme ich häufig VBS zur Unterstützung.
C++ würde ich dann eher zur Anwendungsentwicklung und weniger zum Steuern von Jobabläufen einsetzen.
Gruß icsat
Moin,
Du hast jetzt zwar viele Daten hier reinkopiert, aber leider nicht wirklich variantenreich. Es sind nur ein paar Z-Werte enthalten. Naja egal.
Hier noch mal ein etwas modifizierter Code:
Ich habe zwar etwas getestet, aber nur obeflächlich. Insbesondere bei den Rechenergebnissen bin ich mir nicht sicher, ob ich alle Eventualitäten abgedeckt habe.
Auch glaube ich nicht, dass Deine Testdaten alle Fälle abdecken. Daher wird bestimmt noch der ein oder andere Fehler bei Dir hochkommen.
[OT]
Leider fängt es an etwas unübersichtlich zu werden, da ich etwas schwer von Begriff bin und deshalb in jedem Deiner Posts neue Anforderungen finde.
Optimaler Weise gibt es vor der Realisierung soche Dinge wie Anforderungsanalyse, Konzeption und Design. Ist für Dein Problem natürlich etwas Oversized sich tagelang mit den Vorarbeiten zu befassen, aber etwas Zeit sollte da schon rein investiert werden. Die Zeit lohnt sich schon von daher, dass dieses später als Dokumentation dient oder zumindest die Grundlage dafür bildet.
Außerdem entwickelt sich das hier meiner Meinung nach gerade in die falsch Richtung. Ich helfe ja grundsätzlich gerne, wenn es anderen hilft sich dadurch in die Thematik einzuarbeiten.
Ich befürchte jedoch, dass ich hier in Ansätzen für Dich ein Firmenproblem löse ohne dass es für Dich vom Lernfaktor her einen hohen Wert hätte.
Das soll jetzt keine Kritik sein, sondern einfach nur eine Feststellung.
[/OT]
Gruß icsat
Du hast jetzt zwar viele Daten hier reinkopiert, aber leider nicht wirklich variantenreich. Es sind nur ein paar Z-Werte enthalten. Naja egal.
Hier noch mal ein etwas modifizierter Code:
:start
@echo off
setlocal EnableDelayedExpansion
set "gcode=C:\NC_NUM\DATA\GCODE"
set "origin=C:\NC_NUM\DATA\ORIGIN"
set "add=C:\NC_NUM\DATA\ADD"
set "num=C:\NC_NUM\DATA\NUM"
for /f %%a in ('dir /b %GCODE%\*.NUM') do (
REM Get copy in folders
move %GCODE%\%%a %ORIGIN%\
set "eingabe=%ORIGIN%\%%a"
set "ausgabe=%GCODE%\%%a
call :add
copy !AUSGABE! %ADD%\
call :crypt
move !AUSGABE! %NUM%\
)
:ende
endlocal
goto :eof
:add
for /f "delims=Z tokens=1,2" %%i in (%EINGABE%) do (
set "zteil=%%j"
if "!ZTEIL!"=="" (
echo %%i>>%AUSGABE%
for /f "tokens=6,7 delims== " %%n in ("%%i") do (
if "%%n"=="L142" (
set "wert=%%o"
for /f "tokens=1,2 delims=." %%p in ("%%o") do (
if "%%p" NEQ "" (
set addvk=%%p
) else (
set addvk=0
)
if "%%q" NEQ "" (
set addnk=%%q
if "!ADDNK:~0,1!"=="0" set addnk=!ADDNK:~1,1!
) else (
set addnk=0
)
)
)
)
) else (
if "!ZTEIL:~0,1!"=="-" (
for /f "tokens=1,2* delims=. " %%k in ("!ZTEIL!") do (
set /a vk=%%k+!ADDVK!
if %%l LEQ 99 (
set startnk=%%l
if "!STARTNK:~0,1!"=="0" set startnk=!STARTNK:~1,1!
) else (
set startnk=0
)
if "!ADDVK:~0,1!" EQU "-" (
set /a nk=!STARTNK!+!ADDNK!
) else (
if !VK! LSS 0 set /a nk=!STARTNK!-!ADDNK!
if !VK! GTR 0 set /a nk=!ADDNK!-!STARTNK!
if !VK! EQU 0 (
if !ADDNK! GEQ !STARTNK! (
set /a nk=!ADDNK!-!STARTNK!
) else (
set /a nk=!STARTNK!-!ADDNK!
)
)
)
if !NK! GEQ 100 (
if !VK! GEQ 0 (
set /a vk+=1
) else (
set /a vk-=1
)
set /a nk-=100
)
if !NK! LSS 0 (
if !VK! GEQ 0 (
set /a vk-=1
) else (
set /a vk+=1
if !VK! EQU 0 set "vk=-0"
)
set /a nk+=100
)
if !NK! LSS 10 set "nk=0!NK!"
if "%%m"=="" (
echo %%iZ!VK!.!NK! %%l>>%AUSGABE%
) else (
if "%%m" NEQ "" (
echo %%iZ!VK!.!NK! %%m>>%AUSGABE%
) else (
echo %%iZ!VK!.!NK! %%m>>%AUSGABE%
)
)
)
) else (
echo %%iZ%%j>>%AUSGABE%
)
)
)
goto :eof
:crypt
CHG -i %AUSGABE% -s [15] -r [15]
CHG -i %AUSGABE% -s [19] -r [19]
CHG -i %AUSGABE% -s [32] -r [32]
CHG -i %AUSGABE% -s [35] -r [163]
CHG -i %AUSGABE% -s [37] -r [165]
CHG -i %AUSGABE% -s [40] -r [40]
CHG -i %AUSGABE% -s [41] -r [169]
CHG -i %AUSGABE% -s [44] -r [172]
CHG -i %AUSGABE% -s [45] -r [45]
CHG -i %AUSGABE% -s [49] -r [177]
CHG -i %AUSGABE% -s [50] -r [178]
CHG -i %AUSGABE% -s [51] -r [51]
CHG -i %AUSGABE% -s [52] -r [180]
CHG -i %AUSGABE% -s [53] -r [53]
CHG -i %AUSGABE% -s [54] -r [54]
CHG -i %AUSGABE% -s [55] -r [183]
CHG -i %AUSGABE% -s [56] -r [184]
CHG -i %AUSGABE% -s [57] -r [57]
CHG -i %AUSGABE% -s [60] -r [60]
CHG -i %AUSGABE% -s [61] -r [189]
CHG -i %AUSGABE% -s [62] -r [190]
CHG -i %AUSGABE% -s [65] -r [65]
CHG -i %AUSGABE% -s [66] -r [66]
CHG -i %AUSGABE% -s [67] -r [195]
CHG -i %AUSGABE% -s [68] -r [68]
CHG -i %AUSGABE% -s [69] -r [197]
CHG -i %AUSGABE% -s [70] -r [198]
CHG -i %AUSGABE% -s [71] -r [71]
CHG -i %AUSGABE% -s [72] -r [72]
CHG -i %AUSGABE% -s [73] -r [201]
CHG -i %AUSGABE% -s [74] -r [202]
CHG -i %AUSGABE% -s [76] -r [204]
CHG -i %AUSGABE% -s [77] -r [77]
CHG -i %AUSGABE% -s [78] -r [78]
CHG -i %AUSGABE% -s [79] -r [207]
CHG -i %AUSGABE% -s [80] -r [80]
CHG -i %AUSGABE% -s [81] -r [209]
CHG -i %AUSGABE% -s [82] -r [210]
CHG -i %AUSGABE% -s [83] -r [83]
CHG -i %AUSGABE% -s [84] -r [212]
CHG -i %AUSGABE% -s [85] -r [85]
CHG -i %AUSGABE% -s [86] -r [86]
CHG -i %AUSGABE% -s [87] -r [215]
CHG -i %AUSGABE% -s [88] -r [216]
CHG -i %AUSGABE% -s [89] -r [89]
CHG -i %AUSGABE% -s [90] -r [90]
goto :eof
Auch glaube ich nicht, dass Deine Testdaten alle Fälle abdecken. Daher wird bestimmt noch der ein oder andere Fehler bei Dir hochkommen.
[OT]
Leider fängt es an etwas unübersichtlich zu werden, da ich etwas schwer von Begriff bin und deshalb in jedem Deiner Posts neue Anforderungen finde.
Optimaler Weise gibt es vor der Realisierung soche Dinge wie Anforderungsanalyse, Konzeption und Design. Ist für Dein Problem natürlich etwas Oversized sich tagelang mit den Vorarbeiten zu befassen, aber etwas Zeit sollte da schon rein investiert werden. Die Zeit lohnt sich schon von daher, dass dieses später als Dokumentation dient oder zumindest die Grundlage dafür bildet.
Außerdem entwickelt sich das hier meiner Meinung nach gerade in die falsch Richtung. Ich helfe ja grundsätzlich gerne, wenn es anderen hilft sich dadurch in die Thematik einzuarbeiten.
Ich befürchte jedoch, dass ich hier in Ansätzen für Dich ein Firmenproblem löse ohne dass es für Dich vom Lernfaktor her einen hohen Wert hätte.
Das soll jetzt keine Kritik sein, sondern einfach nur eine Feststellung.
[/OT]
Gruß icsat
Dennoch würde ich gerne meine Überlegung VBS zu nutzen noch einmal aufgreifen wollen. Das Batch würde dann, schön übersichtlich, wie folgt aussehen:
Und das "add.vbs":
Denke es ist etwas übersichtlicher als das reine Batch und soll zeigen, dass Batch in meinen Augen nicht immer erste Wahl ist.
Außerdem bekommst Du hiermit nun schon einmal einen Eindruck von den Unterschieden zwischen Batch und vbScript. Ich verzichte aber jetzt darauf Dir auch noch eine C oder c++ Lösung zu präsentieren.
Aber die Frage war ja ursprünglich:
Daher ist dieser Post eigentlich OffTopic. Sorry. Ach, egal. Ich wünsche eine ruhige Restwoche.
Gruß icsat
:start
@echo off
setlocal EnableDelayedExpansion
set "gcode=C:\NC_NUM\DATA\GCODE"
set "origin=C:\NC_NUM\DATA\ORIGIN"
set "add=C:\NC_NUM\DATA\ADD"
set "num=C:\NC_NUM\DATA\NUM"
for /f %%a in ('dir /b %GCODE%\*.NUM') do (
REM Get copy in folders
move %GCODE%\%%a %ORIGIN%\
set "eingabe=%ORIGIN%\%%a"
set "ausgabe=%GCODE%\%%a
call add.vbs !EINGABE! !AUSGABE!
copy !AUSGABE! %ADD%\
call :crypt
move !AUSGABE! %NUM%\
)
:ende
endlocal
goto :eof
:crypt
CHG -i %AUSGABE% -s [15] -r [15]
CHG -i %AUSGABE% -s [19] -r [19]
CHG -i %AUSGABE% -s [32] -r [32]
CHG -i %AUSGABE% -s [35] -r [163]
CHG -i %AUSGABE% -s [37] -r [165]
CHG -i %AUSGABE% -s [40] -r [40]
CHG -i %AUSGABE% -s [41] -r [169]
CHG -i %AUSGABE% -s [44] -r [172]
CHG -i %AUSGABE% -s [45] -r [45]
CHG -i %AUSGABE% -s [49] -r [177]
CHG -i %AUSGABE% -s [50] -r [178]
CHG -i %AUSGABE% -s [51] -r [51]
CHG -i %AUSGABE% -s [52] -r [180]
CHG -i %AUSGABE% -s [53] -r [53]
CHG -i %AUSGABE% -s [54] -r [54]
CHG -i %AUSGABE% -s [55] -r [183]
CHG -i %AUSGABE% -s [56] -r [184]
CHG -i %AUSGABE% -s [57] -r [57]
CHG -i %AUSGABE% -s [60] -r [60]
CHG -i %AUSGABE% -s [61] -r [189]
CHG -i %AUSGABE% -s [62] -r [190]
CHG -i %AUSGABE% -s [65] -r [65]
CHG -i %AUSGABE% -s [66] -r [66]
CHG -i %AUSGABE% -s [67] -r [195]
CHG -i %AUSGABE% -s [68] -r [68]
CHG -i %AUSGABE% -s [69] -r [197]
CHG -i %AUSGABE% -s [70] -r [198]
CHG -i %AUSGABE% -s [71] -r [71]
CHG -i %AUSGABE% -s [72] -r [72]
CHG -i %AUSGABE% -s [73] -r [201]
CHG -i %AUSGABE% -s [74] -r [202]
CHG -i %AUSGABE% -s [76] -r [204]
CHG -i %AUSGABE% -s [77] -r [77]
CHG -i %AUSGABE% -s [78] -r [78]
CHG -i %AUSGABE% -s [79] -r [207]
CHG -i %AUSGABE% -s [80] -r [80]
CHG -i %AUSGABE% -s [81] -r [209]
CHG -i %AUSGABE% -s [82] -r [210]
CHG -i %AUSGABE% -s [83] -r [83]
CHG -i %AUSGABE% -s [84] -r [212]
CHG -i %AUSGABE% -s [85] -r [85]
CHG -i %AUSGABE% -s [86] -r [86]
CHG -i %AUSGABE% -s [87] -r [215]
CHG -i %AUSGABE% -s [88] -r [216]
CHG -i %AUSGABE% -s [89] -r [89]
CHG -i %AUSGABE% -s [90] -r [90]
goto :eof
Und das "add.vbs":
'Übergabeparameter zuweisen
set objParameter = Wscript.Arguments
strEingabe = objParameter(0)
strAusgabe = objParameter(1)
'Dateien Öffnen
set objFSO = CreateObject("Scripting.FileSystemObject")
set fEingabe = objFSO.OpenTextFile(strEingabe)
set fAusgabe = objFSO.OpenTextFile(strAusgabe, 2, True)
'Wert zum addieren Initialisieren
strADD = ""
'Schleifen bis zum Dateiende
Do Until fEingabe.AtEndOfStream
'Datensatz lesen
strInput = fEingabe.ReadLine
'Output Initialisieren
strOutput = ""
'Beginnt die Zeile mit # suchen wir nach L142 ansonsten nach Z-
if mid(strInput,1,1)="#" Then
for i=1 to len(strInput)-1
'Gleichheitszeichen suchen
if mid(strInput, i, 1) = "=" Then
'Prüfen ob vor dem Gleichheitszeichen L142 steht
if mid(strInput, i-4, 4) = "L142" Then
for j=i+2 to len(strInput)-1
'Nächsten TAB suchen
if mid(strInput, j, 1) = " " Then
'Wert zu addieren festlegen, falls das noch nicht geschenen ist
If strADD = "" Then
strADD = mid(strInput, i+2, j-(i+2))
'Dezimalpunkt durch Komma ersetzen
strADD = replace(strADD, ".", ",")
end if
end if
next
end if
end if
next
'Orginal Zeile für Ausgabe übergeben
strOutput = strInput
else
for i=1 to len(strInput)-1
'Ursprungswert Initialisieren
strUrwert = ""
'nach Z- suchen
if mid(strInput, i, 2) = "Z-" Then
for j=i+1 to len(strInput)-1
'Nächsten TAB suchen
if mid(strInput, j, 1) = " " Then
'Ursprungswert festlegen, falls das noch nicht geschenen ist
If strUrwert = "" Then
strUrwert = mid(strInput, i+1, j-(i+1))
'Dezimalpunkt durch Komma ersetzen
strUrwert = replace(strUrwert, ".", ",")
'Neuen Wert berechnen
strNeuwert = cDbl(strUrwert) + cDbl(strADD)
'Wert Formatieren
strNeuwert = FormatNumber(strNeuwert,2)
'Komma durch Dezimalpunkt ersetzen
strNeuwert = replace(strNeuwert, ",", ".")
'Ausgabe zusammenbauen
if strOutput = "" Then
strOutput = mid(strInput, 1, i) & strNeuwert
intSatzzeiger = i+1+(j-(i+1))+1
else
strOutput = strOutput & mid(strInput, intSatzzeiger, (i+1 - intSatzzeiger)) & strNeuwert
intSatzzeiger = i+1+(j-(i+1))+1
end if
end if
end if
next
end if
next
'Wurde der Output nicht gesetzt wird die Originalzeile für die Ausgabe übergeben
If strOutput = "" Then
strOutput = strInput
else
strOutput = strOutput & mid(strInput, intSatzzeiger)
end if
end if
'Zeile Ausgeben
fAusgabe.WriteLine strOutput
Loop
'Dateien schließen
fEingabe.Close
fAusgabe.Close
'Objekte löschen
set objFSO = NOthing
'Script beenden
Wscript.Quit(0)
Denke es ist etwas übersichtlicher als das reine Batch und soll zeigen, dass Batch in meinen Augen nicht immer erste Wahl ist.
Außerdem bekommst Du hiermit nun schon einmal einen Eindruck von den Unterschieden zwischen Batch und vbScript. Ich verzichte aber jetzt darauf Dir auch noch eine C oder c++ Lösung zu präsentieren.
Aber die Frage war ja ursprünglich:
Zitat von @flipmode85:
Meine Frage hierzu: Ist es besser eine weitere *.bat Datei anzulegen in welcher meine "Wünsche" abgelegt werden, oder kann dies direkt in die crypt.bat mit aufgenommen werden? Ist das ganze üerhaupt machbar?
Meine Frage hierzu: Ist es besser eine weitere *.bat Datei anzulegen in welcher meine "Wünsche" abgelegt werden, oder kann dies direkt in die crypt.bat mit aufgenommen werden? Ist das ganze üerhaupt machbar?
Daher ist dieser Post eigentlich OffTopic. Sorry. Ach, egal. Ich wünsche eine ruhige Restwoche.
Gruß icsat