Batch oder Hochsprache (C++)?

AcJoker

Cadet 2nd Year
Registriert
Feb. 2009
Beiträge
24
Hallo,

mich würde mal interessieren wie Ihr folgendes Problem angehen würdet und warum?
Reicht hier eine einfache Batch oder bringt hier eine Hochsprache wie C++ oder andere einen Vorteil?


Alle Ordner eines Verzeichnisses sollen verschoben werden, aber nur wenn diese entweder vom Vormonat oder älter ist, oder alternativ älter als x Tage ist.
Die Informationen die dazu nötig sind liegen in einer TXT in jeweiligen Ordner.

_Header.txt
Code:
$$ Version: 01.00
$$ Acquired Name: abc
$$ Acquired Date: 15-Feb-2017
$$ Acquired Time: 13:55:52
$$ Job Code: XX0000001
$$ Task Code:

Benötigt werden hier das Datum(Monat als Zahl) und der Job Code (und zusätzlich hiervon die ersten beiden Zeichen).

Die Daten sollen nun wie folgt sortiert werden
\Jahr_Monat\erste zwei Zeichen des Job Code\Job Code\zu verschiebender Ordner\
Vor dem verschieben muss geprüft werden ob es den Ordner bereits gibt. Ist dem so, soll nichts gemacht werden. Fehlerhandling wäre aber grundsätzlich auch wünschenswert.

Die Quelle soll danach gelöscht werden.

Zuvor soll vom ganzen Quellordner noch eine Kopie angelegt werden zur Sicherheit.

Da der Job Code nicht nur das Format "XX0000001" haben kann sondern auch "20170215" sein kann muss in diesem Fall anstelle der ersten beiden Zeichen (im Beispiel 20) "MC" verwendet werden.


Dies ist meine Batch Lösung dafür

Code:
@echo off &setlocal enabledelayedexpansion


set "src=C:\Batch\Data"
set "dst=C:\Batch\Sort"
set "dstBackup=C:\Batch\Backup"
set "z=%date%"
set "sortdate=%z:~10,4%%z:~4,2%%z:~7,2%"
set /a "w=%z:~10,4%"
set /a "x=%z:~4,2%"


xcopy "%src%\*.*" "%dstBackup%\%sortdate%\" /E/I/K

for /f "tokens=1,5" %%i in ('dir /ad /tc "%src%"^|findstr /rc:"\<<DIR>\>"^|findstr /rvc:"\<\.\.*\>"') do ( ^
for /f "tokens=4" %%k in ('findstr /l "Job Code:" %src%\%%j\_Header.txt') do ( ^
for /f "tokens=4" %%l in ('findstr /c:"Acquired Date:" %src%\%%j\_Header.txt') do ( ^
for /f "tokens=1,2,3 delims=-" %%m in ("%%l") do ( ^


if %%n==Jan set /a n=1
if %%n==Feb set /a n=2
if %%n==Mar set /a n=3
if %%n==Apr set /a n=4
if %%n==May set /a n=5
if %%n==Jun set /a n=6
if %%n==Jul set /a n=7
if %%n==Aug set /a n=8
if %%n==Sep set /a n=9
if %%n==Oct set /a n=10
if %%n==Nov set /a n=11
if %%n==Dec set /a n=12


set /a "o=%%o"

if %x% GTR !n! (set v=1) else if %w% GTR !o! (set V=1) else (set v=2))

set k2=%%k
set k2=!k2:20=MC!
set k3=!k2:~0,2!


if !v!==1 (
if NOT exist "%dst%\!o!_!n!\!k3!\%%k\%%j\_Header.txt" set y=1
if !y!==1 2>nul md "%dst%\!o!_!n!\!k3!\%%k\%%j\"
if !y!==1 move "%src%\%%j\*.*" "%dst%\!o!_!n!\!k3!\%%k\%%j\"
if !y!==1 del "%src%\%%j\*.*" /s/q
if !y!==1 rmdir "%src%\%%j\"
)
)
)
)
)

Es können lokal damit 4000 Ordner mit insg. 16GB und 40.000 Daten in ca. 30 Min kopiert und sortiert werden.

Gruß
Joker
 
Zuletzt bearbeitet:
Weder noch natürlich. Man nutzt eine Skriptsprache. Sei es WindowsScriptingHost (VB), Powershell, Python, bash, etc. Aber weder eine Batchdatei noch C++.
 
Sehe es genau wie desmoule mit +1 für python. Diese angenehme Sprache sollte imho einfach jeder mal kennengelernt haben
 
Ist zwar prinzipiell machbar mit C++, aber nicht empfehlenswert ohne Filesystem, welches erst in C++17 vorhanden ist. Ich würde auch eine Skriptsprache empfehlen.
 
Das ist eine typische Aufgabe für eine Skriptsprache. Allerdings hängt das auch vom OS und den persönlichen Präferenzen des Entwicklers ab. Es wäre Unsinn jemandem irgend eine Sprache zu empfehlen, der eine andere Skriptsprache aus dem FF beherrscht. Andererseits ist es auch möglich dass der Entwickler eine ähnliche Problematik schon in einer Hochsprache gelöst hat. Dann wäre es unsinnig, nicht auf diese Erfahrungen zurück zu greifen.

Ähnliches gilt natürlich auch, wenn es eine frei verfügbare Lösung für das Problem gibt. Entscheidend ist der Aufwand.
 
Jup...

Powershell oder Python sind deine Freunde unter Windows...

Ich empfehle Powershell, die IDE ist wirklich sehr gut.

Wenns bash sein soll gibts da natürlich auch in Windows Wege

Kompilierte Sprachen sind hier totaler Quatsch und Batch ist für den A****
 
Totaler Quatsch wuerde ich mal nicht sagen. Je nach Programmiersprache und vorhandener Tools, schreibt man das genauso schnell runter wie in den genannten Scriptsprachen und erhaelt v.a. im Hinblick auf Performance wahrscheinlich deutlich performantere Loesungen, e.g. falls das hauefiger gemacht werden muss.
 
Ja das stimmt, die Einschränkung sollte man machen. Wenn sich jemand mit den Tools (sehr) gut auskennt, erreicht er da auch sein Ziel und ist uU deutlich performanter unterwegs.

Allerdings muss man in dem Beispiel sagen, dass die größte Zeit vermutlich für die HDD Operationen draufgeht, wo es relativ egal ist ob man das kompiliert / script / batch macht.

Hier geht ja nicht viel Zeit für die Analyse drauf.. von daher wird sich der Output m.E. nicht sooviel verändern.
 
naja - soweit ich das sehe ist da keine aufwändige Berechnung drin. IO dauert mit Abstand am längsten. Und dann sequentiell verschieben aufrufen -> auf OS warten -> verschieben -> auf OS warten -> ...
​Da geht ziemlich viel Zeit flöten.
 
Also ich seh noch keine Begründung. :unsure

=> Warum nicht C++?
===> Weil C++ eine Sprache ist, die zwar mehr oder weniger alles kann, aber die so allgemein gehalten ist, daß man zunächst das grundsätzliche Problem (Dateisystemzugriff einschließlich Durchsuchen und allem anderen) bauen muß. Das nimmt einem keiner ab; sinngemäß: mit einem leeren .cpp-Dokument kann man überhaupt nichts anfangen.

=> Warum nicht Batch?
====> Batch ist besser positioniert für die Aufgabe als zB C++, weil es insbesondere für Betriebssystem-Verwaltungsaufgaben da ist. Triviales Beispiel: In batch sagt man einfach "dir" und kriegt die Dateien im Ordner aufgelistet. Mit C++ hätte man signifikant mehr Vorarbeit zu leisten.

Jedoch ist Batch... alt und, auch wenn ich das Wort nicht gerne in dem Kontext verwende, überholt. Es gibt inzwischen genug Möglichkeiten unter Verwendung aller möglicher Sprachen, die Batch einfach voraus sind und mit denen die Problemstellung unkomplizierter angegangen werden kann.

==> Als stellvertretendes Beispiel: Warum nicht JAVA?
=====> Weil JAVA plattformunabhängig ist. Hier geht es aber insbesondere um Plattformspezifisches. Die Stärke von JAVA würde hier gegen einen arbeiten.


==> Als stellvertretendes Beispiel: Warum keine Programmiersprache?
====> Weil die vergleichsweise aufwendig in der Entwicklung sind. Programmiersprachen wollen üblicherweise kompiliert werden. Eine Zeile geändert? Wieder kompilieren. Was hinzugefügt? Neu kompilieren. Was entfernt? ... sollte klar sein. Man hat also am Ende einen vergleichsweise hohen Entwicklungsaufwand für etwas, was am Ende ein relativ kleines Problem ist. Möglicherweise schlimmer: wenn man am Ende die entworfene und implementierte Applikation nur genau einmal benötigt. DANN hätte man sich das auch sparen können.

==> Demgegenüber Scriptsprachen:
====> Die leisten, üblicherweise in einer Sandbox, dasselbe wie "richtige" Programmiersprachen. (Wobei das spätestens seit JAVA/.NET verwischt ist.) Scriptsprachen haben darüberhinaus den Vorteil, daß sie üblicherweise für bestimmte Dinge entworfen wurden (im Gegensatz zu alllgemeinen Programmiersprachen): javascript/vbscript für den Browser. Batch für Windows. ShellScript für bash(Linux&Co). Perl und PHP für dynamische Websites (wobei beide noch viel mehr können). Und so weiter.


Für Windows ist inzwischen die PowerShell das Mittel der Wahl. Nicht weil die inhärent so viel besser ist als alle Alternativen: sondern weil die von Microsoft als Windows-Steuerzentrale forciert wird. Alles,was man mit Windows machen kann, kann man über die PowerShell abhandeln, bis auf ein paar ganz wenige Ausnahmen. Das geht soweit, daß man in PowerShell .NET-Code definieren und dynamisch laden kann, vorhandene .NET-Objekte einbinden und verwenden kann und Steuerelemente einfach greifen und steuern kann, was bis PowerShell nur den Programmiersprachen vorbehalten war. Ein Profi bekommt über die PowerShell sogar Zugriff auf die Win32API, also auf Windows selbst, ohne irgendeine Zeile kompilieren zu müssen.

Dabei ist im Gegensatz zu allen übrigen Scriptsprachen die PowerShell objektorientiert. Man muß also nicht erst umständlich Ausgaben filtern, um das Ergebnis zu bekommen, was man auch tatsächlich haben wollte (was natürlich jedesmal dann schiefgeht, wenn die Ausgabe einen Ticken anders aussieht). In PowerShell hat halt jedes Dateiobjekt seine Eigenschaft .Name (der Dateiname) oder .FullName (der vollständige Dateipfad); da funkt nichts dazwischen.


Oder andersherum formuliert, für Dateisystemzugriffe unter Windows ist die PowerShell derzeit das beste Mittel. Man muß so gut wie keine Vorarbeit leisten und wenn man bereits Erfahrungen gesammelt hat mit C#, dann geht PowerShell butterweich von der Hand.

Lediglich in die teilweise etwas konfuse PowerShell-Syntax muß man sich erstmal reinfuchsen und die Konzepte begreifen, aber das geht relativ schnell.
 
==> Als stellvertretendes Beispiel: Warum nicht JAVA?
=====> Weil JAVA plattformunabhängig ist. Hier geht es aber insbesondere um Plattformspezifisches. Die Stärke von JAVA würde hier gegen einen arbeiten.
Nur weil eine Programmiersprache einen Vorteil hat, der nicht speziell das unterstützt, ist das kein Nachteil.
==> Als stellvertretendes Beispiel: Warum keine Programmiersprache?
====> Weil die vergleichsweise aufwendig in der Entwicklung sind. Programmiersprachen wollen üblicherweise kompiliert werden. Eine Zeile geändert? Wieder kompilieren. Was hinzugefügt? Neu kompilieren. Was entfernt? ... sollte klar sein. Man hat also am Ende einen vergleichsweise hohen Entwicklungsaufwand für etwas, was am Ende ein relativ kleines Problem ist.
​Kompilieren ist jetzt nicht so anstrengend und ist der Nennung nicht wert. Und wie gesagt, wenn man in einer Programmiersprache und dessen Tools umgehen kann, dann ist der Zeitaufwand auch zu vernachlässigen.
 
Außerdem nimmt in C++ dir jemand die Zugriffe auf das Dateisystem ab. Beispielsweise die Entwickler von Qt.

Die Ähnlichkeit der Methoden der PowerShell zu C# kennst du ja bereits.. Da gibt es genauso file.Name. Alle Dateien eines Ordners auslesen, ebenso nur eine Zeile: "Directory.GetFiles(path)". Wirklich mehr Aufwand ist das nicht zur PS. Das kompilieren ist bei so kleinen Programmen so schnell, dass man das nicht mal mitbekommt.
 
Zuletzt bearbeitet:
es ist schon ein Unterschied, ob ich in Powershell drei Klicks in der IDe mache und Ziel bin, oder erst eine C/C++ Entwicklungsumgebung instlalieren, einrichten, uU was Einbinden muss und den Code am Ende noch kompilieren muss...

Man ist schon deutlich schneller mit einer Skriptsprache am Ziel.

Und auch die Entwicklung geht schneller in der Powershell IDE als in einer C IDE
 
Zuletzt bearbeitet:
Klar, bei einer einmaligen Sache ist durch das Installieren verhältnismäßig viel Overhead dabei, aber so lange dauert das auch nicht und bis auf 5 Klicks gibts da auch nicht viel mehr zu tun. Was muss man denn bspw. im Qt Creator einrichten? Nix. Und oh wow, die 3 Sekunden fürs erstmalige kompilieren sind echt krass. Die nachfolgenden differentielle kompilierungen mit ihren 0.23s hauen auch ganz schön rein.

Sofern man die IDE erst noch installieren muss, ja dann ist man mit der PowerShell bei der ersten Sache schneller. Und das auch nur solange die Resultate aus <50 Zeilen bestehen. Ansonsten macht es kaum ein Unterschied.

Je einfacher ein Problem ist, desto eher eignen sich simple Skripte dafür (dieser Fall hier ist eines davon). Ansonsten stehen die Chancen gut, dass man bei etwas komplexeren Dingen durch Programmieren und einem passendem Framework schneller ans Ziel kommt (vorausgesetzt, man kann Programmieren).



Noch eine ganz andere Idee: Node.js mit JavaScript oder TypeScript. Da hätte man auch eine High-Level API für das Dateisystem.

@pizza4ever hier könnte man sogar den in Windows integrierten Editor nutzen. Nur für die Node installation müsste man sich noch 15 Sekunden Zeit nehmen.
 
es ist schon ein Unterschied, ob ich in Powershell drei Klicks in der IDe mache und Ziel bin, oder erst eine C/C++ Entwicklungsumgebung instlalieren, einrichten, uU was Einbinden muss und den Code am Ende noch kompilieren muss...
für alle, die eine Hochsprache in Frage kommt, gilt es in der Regel, dass die IDE schon fertig eingerichtet ist.
 
Alles okay, aber wenn ich das Problem im OP selber angehen müßte, würd ich alles nehmen außer einer Sprache die ich kompilieren muß.

Weiß nicht, vielleicht ist es ja inzwischen erwarteter Standard, daß man sich mal so eben paar fünfzig Codezeilen aus dem Ärmel schüttelt, das einmal kompiliert und dann läuft das wie erwartet.


Meine Erfahrung sagt mir aber was anderes.

Außerdem sollte das da oben natürlich NICHT irgendwie allgemeingültigen Anspruch erheben oder sowas, sondern es sollte der Versuch einer Antwort auf den OP sein, der da lautete: warum würde man ggf das eine dem anderen vorziehen? Da hat sicher jeder seine eigenen Vorstellungen von, aber eine Antwort in diesem Sinne hatte mir bis dahin hier im Thread gefehlt.


Das ist einfach ein Fall von, ich nehme das was am besten mein Problem lösen kann, und wenn ich -sagen wir- ein C-Guru bin, dann werd ich mir natürlich nicht erst irgendwie C#-Kenntnisse aneignen, sondern ich werd das flink in C implementieren, da muß ich dann auch nicht nachdenken.

Dasselbe gilt für alle anderen Programmier-Profis auch, soweit die gewohnt sind, in einer bestimmten Umgebung zu arbeiten.


Und dann gibt es noch welche, denen die konkrete Programmiersprache (hier stellvertretend hier für jede Sprache, die irgendwas automatisiert) völlig wumpe ist und die sagen, für das Problem nehm ich das und für das andere Problem nehm ich das andere da, und sei es nur, weil man das eine Problem in der einen Sprache einfacher umgesetzt bekommt.

Banales Beispiel: bevor ich mich rumärger und eine Datenbankverbindung irgendwie in C# oder Perl oder sonstwas aufbreche, nehm ich PHP, weil da brauch ich zwei Zeilen und ich hab meine Daten. Und wenn ich Text verarbeiten will - insbesondere Information aus Text holen will-- dann nehm ich Perl (oder ggf sed), weil das hat reguläre Ausdrücke. Für Windowsgeschichten PowerShell oder eine .NET-kompatible Sprache. Und wenn ich das mitnehmen will auf andere Plattformen, dann vermutlich JAVA, insbesondere dann, wenn mein Problem keinen oder nur wenig zusätzlichen Kontext (aus der Umgebung) benötigt.

Und wenn ich eine Liste von Dateien aus einem Verzeichnis haben will und nicht mehr oder weniger, dann bau ich nicht ne Qt-Anwendung, sondern ich nehm ne Kommandozeile und schreib da "dir" rein.
 
Weiß nicht, vielleicht ist es ja inzwischen erwarteter Standard, daß man sich mal so eben paar fünfzig Codezeilen aus dem Ärmel schüttelt, das einmal kompiliert und dann läuft das wie erwartet.
​Von jemanden, der beruflich hauptsaechlich programmiert, kann man das tatsaechlich erwarten, zumindest bei diesem Beispiel.

​Beim Scripten muss man doch auch nicht zwangslaeufig alles sofort richtig haben? Sehe da jetzt keinen so enormen Unterschied.


Und dann gibt es noch welche, denen die konkrete Programmiersprache (hier stellvertretend hier für jede Sprache, die irgendwas automatisiert) völlig wumpe ist
Und die unterscheiden sich mMn nicht vom C-Guru oder vom Programmierprofi. Fuer jene mag die Programmiersprache auch egal sein, aber da sie die meisten nicht trivialen Probleme schneller mit ihrer Umgebung loesen, werden sie wohl kaum eine aus neutraler Sicht effizientere Sprache waehlen, sondern ihre eigene Sprache. Nicht jeder kann alle Programmiersprachen, die fuer irgendeinen Anwendungszweck am effizientesten sind, und dann sicher auch nicht equivalent gut, sodass er nach der reinen Effizienz entscheiden wuerde.

​Von daher gibt es fuer mich 2 Gruende, welche fuer eine Hochsprache sprechen:
​Person kommt mit Hochsprache auf Grund seiner Faehigkeiten mindestens genauso schnell ans Ziel
​Ausfuehrungszeit ist wichtig (s.o.)
​Eventuell auch noch: Wiederverwendung


​BTW: C# kann mittlerweile auch gescripted werden
 
Zuletzt bearbeitet:
Nein, man muß natürlich nicht sofort alles richtig haben, aber bei der Scriptsprache ändert man paar Zeichen und fertig, und bei Programmiersprachen scheuchst es jeweils durch einen Rebuild. Der, mit Pech, auch noch ein vorheriges Aufräumen des Buildverzeichnisses erfordert.

Ich sag ja nicht, daß es nicht geht. Diese Behauptung wäre auch absurd. Aber es ist nicht das Optimum. Oder, Beispiel PowerShell und .NET-Module: Die können bei PS nicht aus dem Speicher entfernt werden. Entwickel ich also ein .NET-Modul für PS und will das antesten, dann bin ich gezwungen, bei jeder Änderung des .NET-Moduls die PowerShell neu zu starten.


Und ja, genau das war's, worauf ich bei "Sprach-Gurus" hinauswollte: Die können das in "ihrer" Sprache besser umsetzen und es ist am Ende effizienter, das so zu machen, als wie wenn man sich erst noch andere Kenntnisse aneignen müßte, um seine Lösung halt irgendwie anders zu implementieren.

Aber es gibt eben auch Leuts, die nicht nur genau EINE Sprache gut können und die dann die Wahl haben. Die können dann auch wählen und werden dann sicherlich auch wählen.
 
und bei Programmiersprachen scheuchst es jeweils durch einen Rebuild. Der, mit Pech, auch noch ein vorheriges Aufräumen des Buildverzeichnisses erfordert.
:freak:
​F5 und das Programm laeuft durch, mehr ist da i.d.R. nicht (unterscheidet sich natuerlich je nach Umgebung)
 
Zurück
Oben