Syntaxfehler in batch Datei

Lloydi

Cadet 1st Year
Registriert
Feb. 2020
Beiträge
10
Hey zusammen,

ich habe mithilfe von anderen Webseiten ein Skript erstellt. Leider kann man kaum von erstellen reden da ich dazu persönlich kaum etwas beigetragen habe dementsprechend bin ich mir mit dem Code auch nicht zu 100% sicher. Ich möchte dass das Skript die älteste Datei in einem Ordner auswählt, diese umbenennt danach in ein anderen Ordner verschiebt und schließlich ein weiteres mal umbenennt. Sprich die Datei soll insgesamt zwei mal umbenannt werden. Habe ich hier eventuell irgendetwas vergessen bzw. muss an der Stelle noch etwas ergänzt werden? Beim ausführen bdekomme ich lediglich ein Syntaxfehler... weiß jedoch nicht wo sich dieser befindet.. wäre super wenn mir jemand weiterhelfen könnte

@Echo off
setlocal enableextensions
pushd c:\ordner1
for /f "delims=" %%g IN ('DIR /b /a-d /o-d /tw') do (
set zold=%%g
set zoldname=%%~ng
)
move /y %zold% C:\ordner2\%zoldname%.bat

popd

pause

exit /b
 
Der Syntaxfehler könnte vom "move" stammen. Er tritt auf, wenn Leerzeichen im Dateinamen und damit auch im Ziel vorhanden sind. Das Verwenden von Anführungszeichen sollte da helfen.

Code:
move /y "%zold%" "C:\ordner2\%zoldname%.bat"
 
  • Gefällt mir
Reaktionen: Lloydi
Ein "Syntaxfehler" bei einer Batch kann auf einen eben solchen innerhalb der Batch selbst hindeuten (zB ein Fehler in der for-Schleife wie eine vergessene Klammer oder so) oder aber von einem darin aufgerufenen Befehl (zB move). Um herauszufinden wo der Fehler entsteht, einfach in sinnvoller Reihenefolge Zeile für Zeile mit :: oder REM auskommentieren. Ist der Fehler weg, hat man die fehlerhafte Zeile gefunden.

Darüber hinaus ist es bei der Erstellung einer Batch essentiell wichtig, dass man zwischendurch auch mal die aktuellen Variablen mit echo ausgibt. Batch is a bitch, weil es teilweise extrem unlogisch funktioniert. Deswegen immer Debug-Echos mit einbauen bis alles so funktioniert wie es soll. Damit sähe man beispielsweise auch etwaige Fehler im Pfad recht schnell.
 
  • Gefällt mir
Reaktionen: Lloydi und areiland
Zuletzt kann man den Ablauf eines Batches auch mit dem Befehl Pause in Abschnitte unterteilen, so dass man Stops hat und den Abschnitt oder die Zeile identifizieren kann, in der dieser Fehler passieren muss.
 
  • Gefällt mir
Reaktionen: Lloydi und rocketworm
areiland schrieb:
so dass man Stops hat und den Abschnitt oder die Zeile identifizieren kann, in der dieser Fehler passieren muss
Oder man nimmt das "@Echo off" raus, dann sieht man in der Ausgabe jeden step mit dem entsprechenden Fehler unmittelbar nach dem Aufruf.
 
  • Gefällt mir
Reaktionen: Lloydi und areiland
Erstmal Danke für eure Hilfe. Das Problem habe ich gefunden und behoben, dieser lag wie @Andreas_ richtig bemerkt hat beim setzen der Anführungszeichen.
Das Skript verschiebt jetzt die älteste Datei von einem Ordner zum anderen.
Nun habe ich zum umbenennen der Datei am Ende dieser Zeile "%zold%" "C:\test 2\%zoldname%.bat" vor dem .bat ein beliebiges Wort ergänzt. Es funktioniert. Das einzige was mir jetzt noch fehlt ist das umbenennen der Datei bevor dieser überhaupt verschoben wird. Was fehlt mir da?
 
Wieso umbenennen bevor verschoben wird? move kann die Datei umbenennen während sie verschoben wird.

Code:
move c:\bla.txt c:\blubb.txt



Siehe auch

Code:
move /?
 
  • Gefällt mir
Reaktionen: rocketworm, Lloydi und areiland
Gute frage, die genaue Logik dahinter kann ich dir leider auch nicht beantworten. Ich habe die Anweisung von oben erhalten mich diesbezüglich im Internet schlau zu machen. Da steckt iwas sinnvolles dahinter, werd ich dann auch sehen sobald das Skript hoffentlich bald fertig ist.
 
Es macht überhaupt keinen Unterschied ob du:

  • die Datei C:\bla\bla.txt in c:\bla\blubb.txt umbennenst und anschließend in c:\blubb\ verschiebst
  • die Datei c:\bla\bla.txt in c:\blubb\blubb.txt verschiebst

Das heißt doch, es gibt einen Unterschied. Wenn in c:\bla\ eine bla.txt und eine blubb.txt existiert, wird es nicht funktionieren, weil du bla.txt vor dem Verschieben nicht in blubb.txt umbenennen kannst (ist ja schon belegt). Beim direkten Umbenenn-Verschieben ist es aber egal, weil direkt von der Quelle (c:\bla\bla.txt) ins Ziel (c:\blubb\blubb.txt) umbenannt wird.
 
  • Gefällt mir
Reaktionen: Lloydi
die Datei C:\bla\bla.txt in c:\bla\blubb.txt umbennen danach c:\bla\blubb.txt nach c:\blubb\blubb.txt verschieben und anschließend erneut umbennen in c:\blubb\random.txt
 
Lloydi schrieb:
Ich habe die Anweisung von oben erhalten
Was darf man sich darunter vorstellen? Ich hoffe es geht hier nicht um irgendwelche Hausaufgaben oder dergleichen? Dann wäre der Thread an dieser Stelle nämlich beendet, weil es gegen die Regeln verstößt.
 
  • Gefällt mir
Reaktionen: areiland
Nein, bin einfach dabei nebenbei was kleines zu erstellen. Mein Chef kam und hat mich gefragt ob ich in der Hinsicht evtl behilflich sein kann also habe ich mich einfach ein wenig schlau gemacht, habs geschafft diesen Code zusammenzustellen und habe jetzt lediglich ein Problem mit dem umbenennen womit ich nicht weiterkomme. Der Syntaxfehler wurde hier ja behoben
 
Wenn Dein Chef darum bat, dass Du dabei behilflich bist - dann ist ja nicht ausgeschlossen, dass er die Möglichkeit von Move, schon während des Verschiebens umzubenennen, gar nicht kannte. Also würde ich ihm das mal so präsentieren.
 
Nun gut..

Wie ich schon sagte, kannst du direkt mit move verschieben und umbenennen in einem. Es ist vollkommen unsinnig, das in zwei Schritten zu tun, aber es geht natürlich...


Code:
rename c:\bla\bla.txt blubb.txt
move c:\bla\blubb.txt c:\blubb\


oder der Knaller

Code:
move c:\bla\bla.txt c:\bla\blubb.txt
move c:\bla\blubb.txt c:\blubb\


oder einfach

Code:
move c:\bla\bla.txt c:\blubb\blubb.txt


Such's dir aus....
 
  • Gefällt mir
Reaktionen: Lloydi
Ich sehe das wie Areiland und Raijin.

Wenn es um umbenennen --> kopieren --> umbenennen gegangen wäre, hätte es einen sinn haben können.
Aber umbenennen --> verschieben --> umbenennen macht keinen Sinn. Da die Datei im Quellordner nicht verbleibt, warum sollte man sie dann dort umbenennen um sie später am Ziel nochmal anders zu benamen?
 
  • Gefällt mir
Reaktionen: Lloydi und areiland
Wenn es um kopieren und unter einem geänderten Dateinamen abzulegen ginge, könnte man das auch per copy machen. Denn auch der lässt die Ablage unter einem anderen Dateinamen zu. Move entfernt nur nach dieser Aktion die ursprünglichen Dateien aus der Quelle.
 
  • Gefällt mir
Reaktionen: Lloydi, Raijin und rocketworm
Ich würde noch eine weitere Änderung empfehlen. Du durchläufst eine Schleife über alle Dateien im Verzeichnis, obwohl Du nur die älteste Datei benötigst. Da wäre es sinnvoller, die Sortierung umzukehren und nach dem ersten Wert die Schleife zu verlassen ...

Code:
@Echo off
setlocal enableextensions

pushd c:\ordner1 

for /f "delims=" %%g IN ('DIR /b /a-d /od /tw') do (
  set zold=%%g
  set zoldname=%%~ng
  goto movefile
)

:movefile
move /y "%zold%" "C:\ordner2\%zoldname%.bat"

popd

pause

exit /b
 
  • Gefällt mir
Reaktionen: Lloydi
Erstmal kurz vorweg ein wirklich großes Lob an diese Community, ich war nun schon auf mehreren Foren unterwegs, darunter auch auf ein paar englischen und hier wurde mir echt super weitergeholfen!

Ich weiß das mit dem umbenennen verwirrt alle, mich nämlich auch. Mein Chef hat es mal kurz angeschnitten gehabt wieso und weshalb aber viel verstanden hab ich davon jetzt ehrlich gesagt nicht... also mach ich einfach dat was er mir sagt mit der Hoffnung im nachhinein zu sehen was er mit der Datei eigentlich vor hat.

Jetzt habe ich erstmal soweit alles und zeig ihm das einfach erstmal um zu schauen obs ihm reicht. Wenn ich dadurch schlauer werde und noch etwas anstehen sollte melde ich mich hier einfach nochmal :)
 
  • Gefällt mir
Reaktionen: rocketworm und Raijin
Ich habe mir das ganze nochmal genauer angeschaut und getestet um zu schauen ob alles so funktioniert wie es soll. Ich habe jetzt die verschiedenen Methoden ausprobiert die @Raijin aufgelistet hat. Nur wird die Datei vor dem verschieben leider nicht umbenannt... jemand eine Idee woran das liegen könnte? Habe noch ein timeout Befehl hinzugefügt um zu testen ob es dann geht leider passiert da auch nichts..


Code:
@Echo off
setlocal enableextensions

pushd c:\ordner 

for /f "delims=" %%g IN ('DIR /b /a-d /od /tw') do (
  set zold=%%g
  set zoldname=%%~ng
  goto movefile
)

ren "C:\ordner\"%zold%" C:\ordner\umbenennen"

timeout \t 10

:movefile
move /y "%zold%" "C:\ordner 2\%zoldname%.bat"

popd

pause

exit /b

So siehts aktuell aus..
 
Achte auf die Verwendung von "

Der komplette Pfad muss in " stehen, wenn Leerzeichen drin vorkommen bzw. vorkommen können. Bei dir sind die " wild durcheinander. Das gilt für jeden Pfad separat. Das heißt der Quellpfad muss in " und der Zielpfad in ", nicht das Gesamtkonstrukt.


Bei dir sähe der tatsächliche Befehl nach Einsetzung der Variablen so aus:

ren "c:\ordner\"bla.txt" c:\ordner\umbenennen"

Für Windows wären das dann drei Parameter

1: "c:\ordner\"
2: bla.txt
3: " c:\ordner\umbenennen"


So sollte der Befehl aussehen:

Code:
rename "pfadmitalterdatei" "pfadmitneuerdatei"
 
  • Gefällt mir
Reaktionen: Lloydi, pcblizzard, rocketworm und eine weitere Person
Zurück
Oben