Alternative zu vorhandener Batch-Datei

ThePoly123

Cadet 2nd Year
Registriert
Juli 2021
Beiträge
22
Hallo zusammen,

folgend findet Ihr einen Befehl (Batch-Datei), zur Erstellung einer fortlaufend neuen, indivudellen Nummer. Die Anforderungen, sowie das Ergebnis sind recht simpel.
Der Befehl der Batch Datei ist mit einer anderen TXT-Datei mit folgendem Inhalt verknüpft:
TXT:
"echo 7372 > .id.txt"

Leider funktioniert dieser Befehl auf einem anderen Rechner nicht. Hat hierfür jemand eine andere alternative / effektivere Idee?

Vielen Dank!

Batch:
Code:
@echo off

:start
if exist %~dp0.lock goto start
echo. 2> %~dp0.lock

set /p id=<%~dp0.id.txt
set /a "new_id=%id+1"
echo %id%
echo %new_id% > %~dp0.id.txt

del ~dp0.lock
pause
 
ThePoly123 schrieb:
Leider funktioniert dieser Befehl auf einem anderen Rechner nicht. Hat hierfür jemand eine andere alternative / effektivere Idee?
Und was genau funktioniert nicht? Normalerweise kommt wenigstens irgendeine Rückmeldung, wenn etwas schiefläuft. Eventuell reicht es ja, einfach den Pfad bzw. Namen der Datei anzupassen.

Den führenden Punkt im Dateinamen würde ich beispielsweise zum Testen mal weglassen.
 
  • Gefällt mir
Reaktionen: madmax2010
Code:
.id.txt
^

%~dp0.id.txt
     ^
 
danke, habe diese entfernt. Leider bleibt das CMD Feld immer noch leer...
Ergänzung ()

BATCH:
Code:
@echo off

:start
if exist %~dp0.lock goto start
echo. 2> %~dp0.lock

set /p id=<%~dp0id.txt
set /a "new_id=%id+1"
echo %id%
echo %new_id% > %~dp0id.txt

del ~dp0.lock
pause

TXT:
Code:
echo 7372 > id.txt
 
Vermutlich hängt es dann an der Semaphore, dem Lock-File. Nimm testweise auch da mal den führenden Punkt raus.
 
Das erscheint dann:
1631784489918.png
 
Also wenn ich schreibe, dass du das beim Lock-File rausnehmen sollst, dann natürlich auch an allen Stellen. Ganz offensichtlich zeigt dein Screenshot ja noch eine Stelle wo .lock verwendet wird.


Ich vermute mal, dass das Lock deswegen da ist, weil die Datei von mehreren PCs parallel aufgerufen wird, kann das sein? Oder hat jeder PC eine eigene lokale Kopie davon?
 
habe nun alle angepasst. So wie ich es zuletzt eingefügt habe.

Aktuell wird die datei nur von einem lokalen PC genutzt. Sie soll aber zukünftig auf einem Laufwerk von mehreren drauf zugegriffen werden.
 
ThePoly123 schrieb:
habe nun alle angepasst. So wie ich es zuletzt eingefügt habe.
Lass dir doch nicht alles aus der Nase ziehen... Funktioniert es denn jetzt?
 
leider nein.. auf einem anderen Rechner hat es funktioniert, hier leider nicht. Gibt es noch andere alternativen zur batchdatei, eine solche, fortlaufende zahl zu erstellen?
 
Vielleicht einmal mit @echo on ausführen und den Output zeigen auf dem Rechner aufdem es nicht läuft?
Ergänzung ()

Das Skript hat ja als Voraussetzung dass neben dem Batch file noch die initiale .id.txt liegt mit dem Startwert... Wurde die denn mit kopiert?
 
Wenn ich die Batch so bei mir ausprobiere, stört er sich am Pfad.

Der Spruch "Batch is a bitch" kommt nicht von ungefähr. Ich vermute Probleme bei Pfaden mit Leerzeichen.

Code:
@echo off
set idfile="d:\id.txt"
set lockfile="d:\lock"

:start
if exist %lockfile% goto start
echo. 2>%lockfile%
set /p id=<%idfile%
set /a "new_id=%id+1"
echo %id%
echo %new_id% > %idfile%
del %lockfile%
pause

So funktioniert es bei mir. Geändert habe ich den Pfad der beiden Lock- bzw. ID-Dateien. Siehe dazu die beiden Variablen zu Beginn der Datei. Hier den Pfad wie gewünscht anpassen. Die "" sind notwendig, wenn der Pfad Leerzeichen enthält (zB bei program files). Kann sein, dass es mit den "" auch in der ursprünglichen Form inkl. ~dp0 und führendem . im Dateinamen funktioniert hätte: Kann man aber leicht testen, indem man die SET-Variablen entsprechend wieder mit ~dp.... füllt.


Alternativen gibt es viele, nicht zuletzt ein PowerShell-Skript, vbscript bis hin zu einer Mini-Konsolen-Anwendung mit .Net.
Ergänzung ()

Code:
@echo off
set idfile="%~dp0.id.txt"
set lockfile="%~dp0.lock"

:start
if exist %lockfile% goto start
echo. 2>%lockfile%
set /p id=<%idfile%
set /a "new_id=%id+1"
echo %id%
echo %new_id% > %idfile%
del %lockfile%
pause

Jo, funktioniert auch. Augenscheinlich sind es tatsächlich nur die "" gewesen. Wie dem auch sei, in der jetzigen Form ist die Batch einfacher einzustellen, weil man die Dateipfade zentral ändern kann und nicht alle Vorkommnisse einzeln ändern muss.
 
Zuletzt bearbeitet:
super, danke schon mal für die Mühe!!

leider funktioniert es trotzdem nicht... sicherlich bin ich zu unerfahren deine Lösung richtig zu implementieren.
In dem Bild siehst du, das ich diese 4 Datein habe. In der "Zahlen" datei steht folgendes drin:
echo 7372 > .id.txt
muss ich hier auch irgendwas anpassen?
Deinen Code von oben habe ich bereits 1:1 übernommen, da in deinem 2. Lösungsvorschlag der Pfad ja nicht angepasst werden muss.

Danke schon mal!

1631796696062.png
 
Wichtig ist natürlich, dass die Dateinamen konsistent sind, also durchweg überall identisch. In deinem Screenshot sieht man jetzt beispielsweise die Datei id.txt ohne Punkt davor.

Meine beiden Lösungen aus #13 habe ich bei mir getestet und sie laufen. Dein ursprünglicher Code lief bei mir hingegen ebenfalls nicht. Ich hab jetzt allerdings nicht großartig rumprobiert ob die Batch auch "mit ohne Dateien" funktioniert.

Du solltest daher einerseits sicherstellen, dass die korrekte ID-Datei im korrekten Pfad bereits erstellt wurde und eine ID enthält, während die Lock-Datei natürlich NICHT existieren darf, weil die Batch sich sonst im Kreis dreht, weil das Lock nicht weggeht.

Apropos Lock. Dieses hat natürlich den Nachteil, dass eine Batch nicht wirklich zuverlässig sicherstellen kann, dass das Lock am Ende des Durchlaufs auch wirklich wieder gelöst wird, also die Lock-Datein gelöscht wird. Bricht die Batch nämlich mittendrin ab oder wird gar mutwillig abeschossen, bleibt das Lock und niemand nimmt es je wieder weg. Im Falle eines Falles daher die Lock-Datei prüfen und falls nötig von Hand löschen.
 
sehr cool, es funktioniert ! :) ich hab einfach die lock datei gelöscht und den Punkt vor id.txt gesetzt. Die andere Datei:
Code:
echo 7372 > .id.txt
ist ja jetzt komplett überflüssig. kann ich diese dann löschen?

Jetzt nur noch eine Frage der Ästhetik:
Jedes mal wenn man den Befehl auslöst, öffnet sich ein CMD Fenster. Kann man statt einem CMD Fenster auch ein Windows Fenster öffnen lassen?

Danke schon mal!!
 
ThePoly123 schrieb:
ist ja jetzt komplett überflüssig. kann ich diese dann löschen?
Ich habe keine Ahnung wo diese Datei herkommt und warum sie da ist. Die ursprünglich gepostete Batch bzw. meine modifizierte Version erstellt und löscht die Lock-Datei, liest und schreibt die ID-Datei und das war's. Die Zeile, die du zitiert hast, schreibt hart codiert diese ID in die .id.txt. Vermutlich war das mal als Startwert gedacht? Kann man genauso gut auch händisch machen, .id.txt in notepad öffnen, STRG+A, 7372, STRG+S.

ThePoly123 schrieb:
Jetzt nur noch eine Frage der Ästhetik:
Jedes mal wenn man den Befehl auslöst, öffnet sich ein CMD Fenster. Kann man statt einem CMD Fenster auch ein Windows Fenster öffnen lassen?
Wie ich schon sagte, Batch is a Bitch. Batch ist wirklich nur eine Krücke von einer Skriptsprache und diese Bezeichnung ist eine Beleidung für alle richtigen Skriptsprachen. Weder kann man "hübsch" in Batch programmieren/skripten, noch kann man es wirklich hübsch aussehen lassen. Batch ist ein reines Nacheinander-Ausführen-von-Kommandozeilen-Kommandos.

Ja, es gibt durchaus Möglichkeiten, aus einer Batch ein "Windows-Fenster" zu öffnen, aber das geht dann über den Umweg eines vbscripts, in dem man eine MessageBox erzeugt. Dann kann man aber genauso gut gleich das ganze Skript als vbscript schreiben. Man kann auch via PowerShell eine MessageBox aufrufen.
Bei google wirst du zahlreiche Beispiele, die weitestgehend per Copy&Paste zu übernehmen sind, finden.
 
WUnderbar, danke!
Um mich gleich direkt auf die Google Suche zu begeben: was macht aus Deiner Sicht mehr Sinn, ein vsbcript oder Powershell?
 
Das ist eigentlich egal.

Kleiner Nachtrag: Mit msg * nachricht kannst du auch eine kleine MessageBox direkt in Batch aufrufen.

Mit vbscript liefe das sonst so:

Code:
echo msgbox"nachricht",vbExclamation , "titel"> msg.vbs
msgbox.vbs
del msgbox.vbs
 
Code:
echo msgbox"Text der MessageBox",vbInformation , "Titel der Messagebox"> %temp%\msg.vbs
%Temp%\msg.vbs
erase %temp%\msg.vbs
habe oben stehenden Code gefunden, eine MSG Box zu öffnen. Wo muss dieser in die Batch eingegeben werden?
Code:
@echo off
set idfile="%~dp0.id.txt"
set lockfile="%~dp0.lock"

:start
echo msgbox"Text der MessageBox",vbInformation , "Titel der Messagebox"> %temp%\msg.vbs
%Temp%\msg.vbs
erase %temp%\msg.vbs
if exist %lockfile% goto start
echo. 2>%lockfile%
set /p id=<%idfile%
set /a "new_id=%id+1"
echo %id%
echo %new_id% > %idfile%
del %lockfile%
pause
 
Zurück
Oben