copypaste
Goto Top

Batch: Syntaktischer Fehler in For-Schleife

Hallo,

ich hoffe, ihr könnt mir hier auf die Sprünge helfen.
Ich schreibe relativ viele Batchscripte um mir die tägliche Arbeit im Betrieb zu erleichtern, aber ich stoße in letzter Zeit immer wieder auf einen syntaktischen Fehler... wahrscheinlich seh ich den Wald vor lauter Bäumen nicht.

Das hier wäre jetzt eins dieser Scripte

@ECHO ON & SETLOCAL ENABLEDELAYEDEXPANSION

SET PROFILEDIR=\\THDAFS\PROFILE_V2

IF EXIST C:\PROFILE_LIST.TXT DEL /F C:\PROFILE_LIST.TXT
DIR %PROFILEDIR%>>C:\PROFILE_LIST.TXT

FOR /F "USEBACKQ TOKENS=4 DELIMS== " %%i IN (C:\PROFILE_LIST.TXT) DO (  
                   IF EXIST %PROFILEDIR%\%%i\UPM_Profile\AppData\Local\Mozilla RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\AppData\Local\Mozilla
)

führe ich diesen Code nun aus bekomme ich folgende Rückmeldung von der CMD:

")" kann syntaktisch an dieser Stelle nicht verarbeitet werden.

Ich versteh es einfach nicht...

VG
CopyPaste


back-to-topEDIT


Das gleiche Problem tritt wieder auf... neue Batch Datei, gleiche Meldung wie oben

back-to-top")" kann syntaktisch an dieser Stelle nicht verarbeitet werden.

Hier mal die komplette Batch
@ECHO ON & SETLOCAL ENABLEDELAYEDEXPANSION

SET PATHCSV="\\SERVER\ZUGANGS-CODES"  

FOR /F %%i IN ('DIR /B /A-D %PATHCSV%\Neue_Codelisten') DO (  

	IF EXIST "%PATHCSV%\Bearbeitete_Codelisten\%%i" GOTO NEXTFILE	  
	ECHO CODE>>%PATHCSV%\Bearbeitete_Codelisten\%%i
	FOR /F "TOKENS=1 DELIMS=;" %%j IN (%PATHCSV%\Neue_Codelisten\%%i) DO (  
		ECHO %%j >>%PATHCSV%\Bearbeitete_Codelisten\%%i 
	)
	:NEXTFILE 
)

PAUSE
ENDLOCAL

Die Dateien, die hier bearbeitet werden, sind CSV Dateien, mit mehreren durch Semikolon getrennte Spalten. Es wird eine Erste Zeile eingefügt und danach nur noch die Werte aus der ersten Spalte in die neue Datei geschrieben.
Vom logischen Aufbau her müsste das Script so funktionieren, darum geht es aber hier auch nicht.

back-to-topAber diese Fehlermeldung treibt mich in den Wahnsinn...

Content-ID: 237397

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

Ausgedruckt am: 25.11.2024 um 20:11 Uhr

emeriks
emeriks 07.05.2014 um 11:42:29 Uhr
Goto Top
Was ist, wenn Du Zeile 9 hinten an Zeile 8 hängst und die "()" beim "DO" weglässt?

E.
RaidMan
RaidMan 07.05.2014 um 11:43:37 Uhr
Goto Top
Hallo CopyPaste

bist du sicher das die "C:\PROFILE_LIST.TXT" nichts unverträgliches enthält?
CopyPaste
CopyPaste 07.05.2014 aktualisiert um 12:18:29 Uhr
Goto Top
@emeriks

ich habe jetzt hier für das Beispiel nur eine Zeile rein geschrieben, das volle Script ist wesentlich länger, läuft aber auf die gleiche Fehlermeldung hinaus.

Wenn ich es in eine Zeile schreibe läuft es durch.


@RaidMan
Der Inhalt passt

Auch wenn ich statt der Zeile "IF EXIST %PROFILEDIR%\%%i\UPM_Profile\AppData\Local\Mozilla RD /S /Q %PROFILEDIR%\%%i\UPM_Profile" nur "ECHO Geht" hinschreibe kommt die selbe Rückmeldung.
miniversum
miniversum 07.05.2014 um 13:03:36 Uhr
Goto Top
Hallo,

Mal allgemein gefragt, Warum benutzt du USEBACKQ?
Ich würde auch das einlesen der Verzeichnisse eher so machen:
dir /b /AD > C:\PROFILE_LIST.TXT
und dann die Tikens in der Forschleife entsprechend anpassen.
Damit sparst du dir zum Einen das löschen falls bereits vorhanden, zum Andern macht es das ganze übersichtlicher und weniger Fehleranfällig.
bastla
bastla 07.05.2014 um 13:06:42 Uhr
Goto Top
Hallo copypaste!

Wenn der Pfad/Dateiname von "C:\PROFILE_LIST.TXT" keine Leerzeichen enthält, brauchst Du kein "USEBACKQ"; wenn Du es trotzdem verwendest, setze "C:\PROFILE_LIST.TXT" unter Anführungszeichen - wobei: Hast Du noch eine andere Verwendung für diese Datei? Wenn nicht kannst Du ja auch einfach (unter der Annahme, dass Dich ohnehin nur die Ordner in %PROFILEDIR% interessieren)
FOR /F "DELIMS=" %%i IN ('dir /b/ad "%PROFILEDIR%"') DO (
oder
FOR /D %%i IN ("%PROFILEDIR%\*") DO (
verwenden, wobei in letzterem Fall in %%i der gesamte Pfad, nicht nur der Ordnername, steht ...

Grüße
bastla
CopyPaste
CopyPaste 07.05.2014 aktualisiert um 13:50:36 Uhr
Goto Top
Erstmal ein Danke an euch für die schnellen Antworten.

Ich hatte bis jetzt noch garnicht in die Syntax von DIR geguckt, gefällt mir gut mit dem /B und /A:D. Auch es direkt in die FOR-Schleife zu schreiben, warum ich da nicht drauf gekommen bin...face-smile
Auch das FOR /D hatte ich zwar mal gelesen aber nie verwendet, erfüllt aber auch seinen Zweck *THUMBS UP*

Nun noch mal zum eigentlichen Problem zurück.
Leider klappt das Ausführen der Batch auch mit direkt rein geschriebenem Befehl nicht mit mehreren Zeilen.
Auch mir FOR /D kommt der selbe Fehler...
Ich werd noch verrückt, was kann dass denn sein :D

EDIT:
Ich habe es jetzt versucht mit verschiedenen Benutzern auf verschiedenen PCs/Servern auszuführen, überall bekomme ich die gleiche Meldung
CopyPaste
CopyPaste 13.05.2014 um 08:44:07 Uhr
Goto Top
Hat keiner mehr eine Idee? face-confused
bastla
bastla 13.05.2014 aktualisiert um 11:16:27 Uhr
Goto Top
Hallo CopyPaste!

Poste doch bitte nochmals Deinen aktuellen Code und die damit erzeugte Ausgabe.
Dass bei der "for /d"-Variante die Zeile 9 etwa so
IF EXIST "%%i\UPM_Profile\AppData\Local\Mozilla" RD /S /Q "%%i\UPM_Profile\AppData\Local\Mozilla"
oder auf das Nötige reduziert so
RD /S /Q "%%i\UPM_Profile\AppData\Local\Mozilla" 2>nul
aussehen muss, hast Du berücksichtigt?

Ansonsten stellt sich natürlich auch die Frage nach den Rechten für "\\THDAFS\PROFILE_V2" ...

Grüße
bastla
CopyPaste
CopyPaste 13.05.2014 um 13:45:02 Uhr
Goto Top
Hallo Bastla,

danke für deine Rückmeldung!
Auf das Verzeichnis besteht Vollzugriff, für alle Benutzer mit denen getestet wurde.

Ich habe es allerdings gerade noch mal versucht und genau den Quelltext von oben, mit dem ich das Problem hatte ausgeführt und es funktioniert auf einmal problemlos....
Falls ich noch mal auf das Problem stoße gebe ich wieder Bescheid, ich hoffe es allerdings nicht^^

Viele Grüße
CopyPaste
Biber
Biber 13.05.2014 um 14:24:27 Uhr
Goto Top
[OT] Moin CopyPaste
Zitat von @CopyPaste:

Hat keiner mehr eine Idee? face-confused

Und ich wollte vorhin schon als Antwort schreiben "Einfach noch mal mit einer frischen Kopie versuchen!".

Aber ich hab befürchtet, so eine Antwort könnte als "nicht konstruktiv" bewertet werden.

Meine Bitte: Sollte dein Codeschnipsel jetzt laufen, dann poste den funktionierenden Stand in einem Stück für diejenigen, die etwas ähnliches umsetzen wollen.

Grüße
Biber
[/OT]
CopyPaste
CopyPaste 13.05.2014 um 15:44:58 Uhr
Goto Top
Kein Problem, hier ist das ganze Script. Da hast du recht, vielleicht hilft es jemand.

Die Kommentare sollten den Rest erklären..

Viele Grüße
CopyPaste


@ECHO ON & SETLOCAL ENABLEDELAYEDEXPANSION

REM Profilpfad zu den Roaming Profiles eintragen

SET PROFILEDIR=\\SERVER\FREIGABE


REM Da in unserer Infrastruktur zwei Typen von Roaming Profiles ( Windows Roaming Profiles & Citrix User Profile Management ) genutzt werden und ich nur möchte, dass die Citrix Profile angefasst werden, Filtere ich die Ausgabe auf die Verzeichnissnamen, die ein .CPM enthalten

FOR /F "TOKENS=1 DELIMS=*" %%i IN ('DIR /B /A:D %PROFILEDIR% ^| FINDSTR /I .CPM') DO (  

REM !!!ACHTUNG!!! Bitte die Verzeichnisse individuell anpassen
REM Folgende Verzeichnisse werden dann aus dem Citrix Profil gelöscht. Zuvor wurden von mir händisch diese Verzeichnisse in dem GPO für das Citrix UPM eingetragen. 
REM Dieses Script sollte am besten Nachts ausgeführt werden, wenn die User nicht angemeldet sind.

RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\AppData\Local\Mozilla
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\AppData\Local\Citrix\GoToMeeting
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\AppData\Local\Microsoft\Windows\WebCache
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\AppData\Local\Microsoft\Windows\Temporary Internet Files
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\AppData\Local\Google
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\AppData\Roaming
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\AppData\TEMP
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\Desktop
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\Downloads
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\Documents
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\Favorites
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\Pictures
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\Music
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\Links
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\Videos
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\Saved Games
RD /S /Q %PROFILEDIR%\%%i\UPM_Profile\Searches

)
CopyPaste
CopyPaste 03.07.2014 um 11:01:08 Uhr
Goto Top
Es scheint mit dem IF und der ) zusammen zu hängen. Füge ich in meinem letzterem Script nach dem :NEXTFILE in der nächsten Zeile ein ECHO. ein funktioniert das Script problemlos.
Also So:
	)
	:NEXTFILE
	ECHO.
 )

Aber verstehen würde ich das noch gerne.
Ich habe diesen Beitrag gefunden http://www.supportnet.de/t/2454232 . Aber ich kann in dem IF /? nicht die nötigen Informationen über die Klammern finden.

Weiss irgendjemand warum das so ist?
bastla
Lösung bastla 03.07.2014 aktualisiert um 15:28:20 Uhr
Goto Top
Hallo CopyPaste!

Einen Sprung innerhalb eines IF-Blocks solltest Du eigentlich nicht benötigen - Dein ursprünglicher Ansatz könnte ja (unabhängig von den Vorschlägen oben) auf
@ECHO ON & SETLOCAL ENABLEDELAYEDEXPANSION

SET PATHCSV="\\SERVER\ZUGANGS-CODES"  

FOR /F %%i IN ('DIR /B /A-D %PATHCSV%\Neue_Codelisten') DO (  

    IF NOT EXIST "%PATHCSV%\Bearbeitete_Codelisten\%%i" (  
        ECHO CODE>>%PATHCSV%\Bearbeitete_Codelisten\%%i
        FOR /F "TOKENS=1 DELIMS=;" %%j IN (%PATHCSV%\Neue_Codelisten\%%i) DO (  
            ECHO %%j >>%PATHCSV%\Bearbeitete_Codelisten\%%i 
        )
    )
)
geändert werden ...

Grüße
bastla
CopyPaste
CopyPaste 03.07.2014 um 15:34:58 Uhr
Goto Top
Servus Bastla!

da war mein Denkfehler. Das GOTO kann an der Stelle einfach nicht korrekt verarbeitet werden und ist ja auch wirklich komplett überflüssig^^

Falls ich mal wieder das Problem habe, denk ich dran face-wink

Cheers
CP