asd333
Goto Top

Einfache Batch-Datei funktinoert nicht mehr wg Syntaxfehler

Hallo,

habe diese Batch-Datei, die sowohl unter Vista als auch jetzt in Windows7 bis heute tadellos ihren Dienst verrichtet hat.
Seit heute morgen kein kopieren, stattdessen ein Syntaxfehler. Was mache ich falsch?

Grüße und vielen Dank!
Andreas


@echo off
set datei=c:\Users\Andreas\Desktop\Text\Alles\Struktur.doc
set zielprefix=c:\Users\Andreas\Desktop\Text\Alles\Backups\
set zielext=doc

set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%

set std=%time:~-11,2%
set min=%time:~-8,2%
set sek=%time:~-5,2%

copy %datei% %zielprefix%%jahr%-%monat%-%tag%-%std%-%min%-%sek%-Text.doc
start %datei%


EDIT: ohne mein zutun klappt es nun auch wieder. Könnt ihr nachvollziehen warum dies ganz plötzlich mal funktioniert und mal nicht?
OS ist Win7 Prof, beinahe neues System (Office und Firefox), keine OS-Einstellungsänderungen gemacht etc.

Content-ID: 164133

Url: https://administrator.de/contentid/164133

Ausgedruckt am: 25.11.2024 um 00:11 Uhr

Skyemugen
Skyemugen 07.04.2011 um 10:40:51 Uhr
Goto Top
Aloha,

ganz einfach, vor 10 Uhr bekommst du als std Leerzeichen+Stundenzahl ...

greetz André
asd333
asd333 07.04.2011 um 10:45:37 Uhr
Goto Top
Lieber André,

vielen Dank für Deine Antwort. Das scheint mir logisch, dass das dann nicht zu verarbeiten ist.
Gibt es da einen workaround, damit dennoch ein Dateiname mit Zeitstempel des Kopiervorgangs erstellt werden kann, 24 Std. am Tag?

Beste Grüße,
Andreas
99045
99045 07.04.2011 um 10:48:47 Uhr
Goto Top
Zitat von @asd333:
Was mache ich falsch?

Hallo und Willkommen im Forum.

Kleiner Tipp zur Fehlersuche:
fang mal mit
@echo on

an und sieh dir den Ablauf deiner Batch in der Konsole an, dann siehst du die Zeile, in der ein Fehler auftritt.

Und bitte zukünftig beim Posten von Programmzeilen die < Code>- Formatierung in der Formatierungshilfe benutzen, das liest sich einfacher.

Gruß
Skyemugen
Skyemugen 07.04.2011 um 10:57:04 Uhr
Goto Top
Aloha,

klar:

set "jahr=%date:~-4%"  
set "monat=%date:~3,2%"  
set "tag=%date:~0,2%"  

if %time:~0,2% lss 10 (set "std=0%time:~1,1%") else (set "std=%time:~0,2%")  
set "min=%time:~3,2%"  
set "sek=%time:~6,2%"  

greetz André

edit: nicht wundern, ich mochte dein „minus” nicht in den Variablen *gg*

P.S.: Die Zieldatei in Zollzeichen zu setzen wäre generell auch nicht verkehrt (genau so wie sämtliche Pfade im Allgemeinen)
asd333
asd333 07.04.2011 um 11:13:19 Uhr
Goto Top
Vielen Dank euch beiden, das hätte ich alleine niemals hinbekommen.
@99045: Werde mir beides merken, vielen Dank!
Skyemugen
Skyemugen 07.04.2011 um 11:15:24 Uhr
Goto Top
Aloha,

zusätzlich noch eine Anmerkung:

Wenn zum Testen echo on aktiv ist, dann entweder die zu testende batch aus dem cmd aufrufen oder zumindest eine pause setzen, sonst siehst du auch nichts, wenn gleich alles geschlossen wird ^_^ und irgendwann fangen wir auch hier an goto :eof zu setzen *lach*

greetz André
asd333
asd333 07.04.2011 um 13:15:21 Uhr
Goto Top
Hallo,

habe nun alles genauso eingetragen, dennoch erscheint in dieser Zeile ein Syntaxfehler aufgrund von Leerzeichen.

copy %datei% %zielprefix%%jahr%-%monat%-%tag%-%std%-%min%-%sek%-Text.doc

nämlich: Ursprungsordner>copy Urpsrungsdatei Zieltordner\2011 -04 -07 -13-09 -44-Text.doc Syntaxfehler.

Hier nochmal der ganze Code:

@echo off
set datei=c:\Users\Andreas\Desktop\Text\Alles\Struktur.doc
set zielprefix=c:\Users\Andreas\Desktop\Text\Alles\Backups\
set zielext=doc

set jahr=%date:~-4% 
set monat=%date:~3,2% 
set tag=%date:~0,2% 

if %time:~0,2% lss 10 (set std=0%time:~1,1%) else (set std=%time:~0,2%) 
set min=%time:~3,2% 
set sek=%time:~6,2%

copy %datei% %zielprefix%%jahr%-%monat%-%tag%-%std%-%min%-%sek%-Text.doc
start %datei%
99045
99045 07.04.2011 um 13:33:48 Uhr
Goto Top
Hi,

Zitat von @asd333:
habe nun alles genauso eingetragen, dennoch erscheint in dieser Zeile ein Syntaxfehler aufgrund von Leerzeichen.
copy %datei% %zielprefix%%jahr%-%monat%-%tag%-%std%-%min%-%sek%-Text.doc

Wenn in einem Pfad ein Leerzeichen enthalten ist, musst du den Pfad in Anführungszeichen setzen.
copy %datei% "%zielprefix%%jahr%-%monat%-%tag%-%std%-%min%-%sek%-Text.doc"  

Bist du sicher, dass hinter den Zahlen jeweils ein Leerzeichen steht?
nämlich: Ursprungsordner>copy Urpsrungsdatei Zieltordner\2011 -04 -07 -13-09 -44-Text.doc Syntaxfehler

Gruß
Skyemugen
Skyemugen 07.04.2011 um 13:44:11 Uhr
Goto Top
Aloha,

my mistake, ich habe den Bug der Forensoftware nicht bedacht und glatt die sonst immer gesetzten Zollzeichen bei den set var=wert vergessen hinzuzufügen; habe dies nun nachgeholt.

greetz André

@99045, ja ich denke, er ist sich sicher, denn die Forensoftware schiebt gerne noch ein Leerzeichen hinterher (kannst du auch im Code überprüfen ^_^ bei ihm sind es dann schon zwei Leerzeichen, hehe)

interessant, dass hinter den Sekunden kein Leerzeichen gesetzt wurde (bzw. hinter set sek soundso)
asd333
asd333 07.04.2011 um 13:47:11 Uhr
Goto Top
Hallo,
ja, Leerzeichen stehen zwischen Jahr, Monat, Tag und Minute ein Leerzeichen.
Da das aber ein rein kosmetisches Problem ist, wenn man die Dateinamen in "" setzt, passt das.
Mich wunderte es nur, vor allem, weil es bei Stunden und Sekunden nicht der Fall ist.
Aber gut, ich bin zufrieden, das erleichtert mir sooo viel Arbeit. Vielen Dank.
Andreas
jeb-the-batcher
jeb-the-batcher 07.04.2011 um 15:09:36 Uhr
Goto Top
Hallo,

noch eine Anmerkung, bei unerwarteten Leerzeichen ist vermutlich der Leerspeicher übergelaufen face-smile

Um dies zu verhindern empfiehlt es sich Zuweisungen immer in Anführungszeichen zu setzen.

Also
set "monat=%date:~3,2%"  

Das vermeidet ein ungewolltes anhängen von Leerzeichen die (unsichtbar) hinter dem letzten % liegen könnten.
Bei der Variante mit Anführungszeichen wird nur alles bis zum letzten " in die Variable geschoben, was nach dem letzten " wird automatisch entfernt

Gruß
jeb
asd333
asd333 07.04.2011 um 15:19:41 Uhr
Goto Top
Herzlichen Dank für euere Mühen, mit den Leerzeichen hat alles geklappt und ich steig jetzt bei Batch&Shell voll durch. ;)
Grüße,
Andreas
bastla
bastla 07.04.2011 um 16:59:01 Uhr
Goto Top
@jeb
Funktioniert noch besser bei Verwendung einer geraden Anzahl von Anführungszeichen ... face-wink

Grüße
bastla
Biber
Biber 07.04.2011 um 17:05:14 Uhr
Goto Top
@bastla
Zitat von @bastla:
@jeb
Funktioniert noch besser bei Verwendung einer geraden Anzahl von Anführungszeichen ... face-wink
Genauer gesagt, bei einer geraden Anzahl größer als 1.
Nun aber genug der versteckten Hinweise... face-wink

Grüße
Biber
bastla
bastla 07.04.2011 um 17:11:02 Uhr
Goto Top
[OT]
@Biber
Genauer gesagt, bei einer geraden Anzahl größer als 1.
Dass Du schon wieder alle schmutzigen Details verraten musst ... face-wink

Grüße
bastla
[/OT]
jeb-the-batcher
jeb-the-batcher 07.04.2011 um 17:11:57 Uhr
Goto Top
@bastla, biber

Jaja ich habs gesehen und editiert

Aber genau genommen kommt es nur darauf an, dass vor dem Variabelnamen das erste Anführungszeichen ist,
dann gilt die Regel:
Es wird alles bis zum letzen Anführungszeichen genommen, aber das letzte gehört nicht mehr zum String.

Funktioniert also auch bei ungerader Anzahl

set "var1=ausgeglichen wie ich bin"  ab hier wird alles geschluckt  
set "var2=unausgeglichen wie eine "Frau" und dies hier wird auch geschluckt  
echo #%var1%#
echo #%var2%#
-- OUTPUT ---
#ausgeglichen wie ich bin#
#unausgeglichen wie eine "Frau#  

Grüße
jeb
jeb-the-batcher
jeb-the-batcher 07.04.2011 um 17:18:46 Uhr
Goto Top
Und weils so schön ist, noch ein weiteres offensichtliches Beispiel

setlocal DisableDelayedExpansion
set "var1=#a^"  
set "var2=#^" !  
setlocal EnableDelayedExpansion
set "var3=#^"  
set "var4=#^" !  

set var
--- OUTPUT ---
var1=#^
var2=#^
var3=#^
var4=#
Man beachte var4

Gruß
jeb
99045
99045 07.04.2011 um 17:21:43 Uhr
Goto Top
Zitat von @Biber:
Genauer gesagt, bei einer geraden Anzahl größer als 1.

Einen hätte ich da als Korinthenkacker auch noch:
Eine gerade Anzahl ist immer größer 1. Denn 0 ist eben keine Anzahl. face-devilish
irgendwelche Einwände?