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-Key: 164133

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

Printed on: April 19, 2024 at 02:04 o'clock

Member: Skyemugen
Skyemugen Apr 07, 2011 at 08:40:51 (UTC)
Goto Top
Aloha,

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

greetz André
Member: asd333
asd333 Apr 07, 2011 at 08:45:37 (UTC)
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
Mitglied: 99045
99045 Apr 07, 2011 at 08:48:47 (UTC)
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ß
Member: Skyemugen
Skyemugen Apr 07, 2011 at 08:57:04 (UTC)
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)
Member: asd333
asd333 Apr 07, 2011 at 09:13:19 (UTC)
Goto Top
Vielen Dank euch beiden, das hätte ich alleine niemals hinbekommen.
@99045: Werde mir beides merken, vielen Dank!
Member: Skyemugen
Skyemugen Apr 07, 2011 at 09:15:24 (UTC)
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é
Member: asd333
asd333 Apr 07, 2011 at 11:15:21 (UTC)
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%
Mitglied: 99045
99045 Apr 07, 2011 at 11:33:48 (UTC)
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ß
Member: Skyemugen
Skyemugen Apr 07, 2011 at 11:44:11 (UTC)
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)
Member: asd333
asd333 Apr 07, 2011 at 11:47:11 (UTC)
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
Member: jeb-the-batcher
jeb-the-batcher Apr 07, 2011 at 13:09:36 (UTC)
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
Member: asd333
asd333 Apr 07, 2011 at 13:19:41 (UTC)
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
Member: bastla
bastla Apr 07, 2011 at 14:59:01 (UTC)
Goto Top
@jeb
Funktioniert noch besser bei Verwendung einer geraden Anzahl von Anführungszeichen ... face-wink

Grüße
bastla
Member: Biber
Biber Apr 07, 2011 at 15:05:14 (UTC)
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
Member: bastla
bastla Apr 07, 2011 at 15:11:02 (UTC)
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]
Member: jeb-the-batcher
jeb-the-batcher Apr 07, 2011 at 15:11:57 (UTC)
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
Member: jeb-the-batcher
jeb-the-batcher Apr 07, 2011 at 15:18:46 (UTC)
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
Mitglied: 99045
99045 Apr 07, 2011 at 15:21:43 (UTC)
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?