highend01
Goto Top

IF Bedingung - GOTO kann syntaktisch an dieser Stelle nicht verarbeitet werden

Hi zusammen,

ich schwöre, vorgestern lief dieses Script noch ohne Fehlermeldung und jetzt steigt es mir bei einer IF Abfrage immer aus face-sad

@ECHO off
REM #######################################################
REM ### Declare Variables #################################
REM #######################################################
REM ### Store Directory Paths				###
SET WorkingDir=%~pd0
SET WorkingDir=%WorkingDir:~0,-1%

REM ### Store Tool Paths	 			###
SET XQGetOSVer=%WorkingDir%\.Tools\xqgetosver.exe
SET ISAdmin=%WorkingDir%\.Tools\isadmin.exe
SET SetEnv=%WorkingDir%\.Tools\setenv.exe
SET CECHO=%WorkingDir%\.Tools\cECHO.exe

REM ### Evaluate OS Version	 			###
"%XQGetOSVer%" /B /N  
IF %ERRORLEVEL%==99 SET OSVer={0c}Unknown{07}
IF %ERRORLEVEL%==11 SET OSVer=Windows 7
IF %ERRORLEVEL%==10 SET OSVer=Windows 2008 Server
IF %ERRORLEVEL%==9 SET OSVer=Windows Vista
IF %ERRORLEVEL%==8 SET OSVer=Windows 2003 Server
IF %ERRORLEVEL%==7 SET OSVer=Windows XP
IF %ERRORLEVEL%==6 SET OSVer=Windows ME
IF %ERRORLEVEL%==5 SET OSVer=Windows 2000
IF %ERRORLEVEL%==4 SET OSVer=Windows 98
IF %ERRORLEVEL%==3 SET OSVer=Windows NT
IF %ERRORLEVEL%==2 SET OSVer=Windows 95
IF %ERRORLEVEL%==1 SET OSVer=Windows 3.1

IF "%OSVer%"=="Windows 7" SET RegPath=Windows_7  
IF "%OSVer%"=="Windows XP" SET RegPath=Windows_XP  
IF "%OSVer%"=="Windows 2000" SET RegPath=Windows_2000  
IF "%OSVer%"=="Windows Vista" SET RegPath=Windows_Vista  
IF "%OSVer%"=="Windows 2003 Server" SET RegPath=Windows_2003  
IF "%OSVer%"=="Windows 2008 Server" SET RegPath=Windows_2008  

REM ### Check for 32 or 64 Bit OS			###
IF EXIST %windir%\SysWoW64\NUL (
SET RegAdd64=WOW6432node
) ELSE (
SET RegAdd64=
)

REM ### Check for Admin Rights				###
"%ISAdmin%" -s  
IF %ERRORLEVEL%==1 (
SET AdminRights=False
) ELSE (
SET AdminRights=True
)

SET ValidPath=HKCU

REM ### End Variables #####################################



REM ###	Main Menu					###

:MainMenu

REM ###	Check for Environment Variables			###
SET RegEnvPath=HKLM\System\CurrentControlSet\Control\Session Manager\Environment

REG QUERY "%RegEnvPath%" /v StorageDrive >NUL 2>NUL  
IF %ERRORLEVEL%==0 (
SET CheckEnvStatus={0b}[Done]
FOR /F "tokens=2*" %%A IN ('REG QUERY "%RegEnvPath%" /v StorageDrive') DO SET StorageDrive=%%B  
SET StorageDriveExist=
) ELSE (
SET CheckEnvStatus={0c}[Missing]
SET StorageDrive=D:
SET StorageDriveExist=[Attention: Default Setting!]
)
REG QUERY "%RegEnvPath%" /v UserProfilePath >NUL 2>NUL  
IF %ERRORLEVEL%==0 (
FOR /F "tokens=2*" %%A IN ('REG QUERY "%RegEnvPath%" /v UserProfilePath') DO SET UserProfilePath=%%B  
SET UserProfilePathExist=
) ELSE (
SET UserProfilePath=Users
SET UserProfilePathExist=[Attention: Default Setting!]
)

REM Check for Directories
SET "CheckDir=%StorageDrive%\%UserProfilePath%"  
IF EXIST %CheckDir%\NUL (
SET CheckDirStatus={0b}[Done]
) ELSE (
SET CheckDirStatus={0c}[Missing]
)

REM ###	Display Main Menu				###
CLS
ECHO.
ECHO [Main Menu]
ECHO.

IF %AdminRights%==False (
"%CECHO%" {07}OS: %OSVer%{07}  
ECHO.
ECHO Registry Path: HKLM\Software\%RegAdd64%
"%CECHO%" {07}Reg Files: %WorkingDir%\%RegPath%{07}  
ECHO.
ECHO.
"%CECHO%" {07}Current Username: %username% {0c}[YOU HAVE NO ADMIN RIGHTS]{07}  
ECHO.
ECHO.
"%CECHO%" {07}1 - Create User Directories %CheckDirStatus%{07}  
ECHO.
ECHO 2 - Create User Registry Entries
ECHO 3 - Additional Tasks
ECHO 4 - Exit
ECHO.

SET /p "choice=Make your selection: "  

IF %choice% == 1 GOTO CreateDirectories
IF %choice% == 2 GOTO CreateRegistryEntries
IF %choice% == 3 GOTO AdditionalTasks
IF %choice% == 4 GOTO Exit
GOTO MainMenu

) ELSE (

"%CECHO%" {07}OS: %OSVer%{07}  
ECHO.
ECHO Registry Path: HKLM\Software\%RegAdd64%
"%CECHO%" {07}Reg Files: %WorkingDir%\%RegPath%{07}  
ECHO.
ECHO.
"%CECHO%" {07}Current Username: %username% {0b}[ADMIN RIGHTS GRANTED]{07}  
ECHO.
ECHO.
"%CECHO%" {07}1 - Set Environment Variables %CheckEnvStatus%{07}  
ECHO.
"%CECHO%" {07}2 - Create Directories %CheckDirStatus%{07}  
ECHO.
ECHO 3 - Create Registry Entries
ECHO 4 - Additional Tasks
ECHO 5 - Exit
ECHO.

SET /p "choice=Make your selection: "  

IF %choice% == 1 GOTO SetEnvironmentVariables
IF %choice% == 2 GOTO CreateDirectories
IF %choice% == 3 GOTO CreateRegistryEntries
IF %choice% == 4 GOTO AdditionalTasks
IF %choice% == 5 GOTO Exit
GOTO MainMenu
)

:CreateDirectories

:CreateRegistryEntries

:AdditionalTasks

:SetEnvironmentVariables

:AdditionalTasks

:Exit

Ich hab mal alles "überflüssige" an Code rausgeworfen (was in den verschiedenen anderen Menüs gemacht wird, z.B.) um das Posting im Rahmen zu halten.

Wenn ich das Script starte, erhalte ich (nur noch) diesen Output:

[Main Menu]

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

Der Fehler muss irgendwo in der IF %AdminRights%==False (
Bedingung (und deren nachfolgendem Code) stecken, aber ich seh ihn partout nicht. Anmerkung: Das script wird aus einer cmd, die nicht mit Adminrechten
gestartet wurde, aufgerufen. D.h. Die Variable %AdminRights% ist auch wirklich False.

Kommentiere ich die "IF %AdminRights%==False (" Anweisung (+") ELSE (") + der schließenden Runden Klammer aus, bekomme ich die Fehlermeldung nicht mehr.
Im Code sind das die Zeilen 98, 123 und 151.

Sieht jemand etwas offensichtliches, was ich aber nicht sehe?

Wenn mehr Infos oder Erläuterungen benötigt werden, einfach nachfragen, ich liefere dann alles notwendige nach.

Danke und Gruß,
Highend

Content-Key: 117513

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

Printed on: April 24, 2024 at 15:04 o'clock

Mitglied: 77559
77559 Jun 04, 2009 at 17:34:39 (UTC)
Goto Top
Was verstehst du unter False ?

Wenn die Variable %AdminRights% leer ist, ist es klar das ein Fehler kommt.
Füge auf beiden Seiten der Abfrage etwas hinzu, so dass sie niemals leer ist.

Gruß
LotPings
Member: Highend01
Highend01 Jun 04, 2009 at 18:08:36 (UTC)
Goto Top
False bedeutet in diesem Zusammenhang, dass keine Adminrechte vorhanden sind.

Das Tool isadmin.exe liefert per "errorlevel" die Aussage darüber zurück, ob Adminrechte vorhanden sind (oder auch nicht).
errorlevel==1 -> keine Adminrechte, errorlevel!=1 -> Adminrechte.

Das werte ich aus und setze die Variable %AdminRights% entsprechend. Diese ist niemals leer, entweder erhält sie den
Werte False oder True.

Ich kann auch vor der Zeile IF %AdminRights%==False (
ein Echo Wert der Variable AdminRights: %AdminRights% einbauen, was im Output dann auch ein:
Wert der Variable AdminRights: False
...
liefert.

Die Bedingung sollte also zutreffen.

Gruß,
Highend
Mitglied: 76109
76109 Jun 04, 2009 at 18:43:16 (UTC)
Goto Top
Hallo Highend01!

Ich denke, LotPings will damit sagen, ob die Variablen True und False auch definiert sind?

Gruß Dieter
Member: Highend01
Highend01 Jun 04, 2009 at 18:54:54 (UTC)
Goto Top
Hallo Dieter,

es sind doch nur Stringvergleiche, die ich da durchführe, True und False sind nicht als Variablen deklariert worden.
Ich kann auch "False" mit dem Namen "Schlecht" ersetzen (wenn es hier ein Problem mit irgendwelchen in der Scriptumgebung vordefinierten Variablen gehen könnte). Das ändert aber nichts daran, dass der Code nach der Bedingung irgendwie nicht korrekt ausgeführt wird. Scheint meiner Auffassung nach aber nicht am Vergleich %AdminRights%==False zu scheitern, da ich es gerade auch noch mal mit einem anderen Variablennamen probiert habe.

Gruß,
Highend
Mitglied: 76109
76109 Jun 04, 2009 at 19:06:00 (UTC)
Goto Top
Hallo Highend01!

Du hast natürlich Recht. Mein Fehler!

Gruß Dieter
Member: Ignitor
Ignitor Jun 05, 2009 at 08:09:17 (UTC)
Goto Top
Also nur mal zwei prinzipielle Dinge, aber vielleicht hilft ja eins davon:

1. Stringvergleiche sollte man so durchführen:
IF "%AdminRights%"=="False" ...  
Denn wie LotPings schon gesagt hat:
Wenn die Variable %AdminRights% leer ist, ist es klar das ein Fehler kommt.
Sonst sieht das für den Interpreter nämlich so aus:
IF ==False
Mit Anführungszeichen kommt aber ein korrekter Vergleich zustande:
IF ""=="False"  

2. Bin mir nicht sicher ob das was ausmacht, aber sollten die Leerzeichen in den Vergleichen von Zeile 117-120 etc. nicht weg?
Also so:
IF %choice%==1 GOTO CreateDirectories 
IF %choice%==2 GOTO CreateRegistryEntries 
IF %choice%==3 GOTO AdditionalTasks 
IF %choice%==4 GOTO Exit 
#

Gruß, Jochen
Member: Highend01
Highend01 Jun 05, 2009 at 08:26:47 (UTC)
Goto Top
Hallo Jochen,

Wie gesagt, %AdminRights% kann prinzipiell nicht leer sein, weil in
REM ### Check for Admin Rights				###
"%ISAdmin%" -s  
IF %ERRORLEVEL%==1 (
SET AdminRights=False
) ELSE (
SET AdminRights=True
)

ja in jedem Fall ein nichtleerer Ausdruck zugewiesen wird.

Ein zusätzlich eingebautes
ECHO Wert der Variable AdminRights: %AdminRights%

direkt vor der IF Bedingung liefert im Output ja auch ein
Wert der Variable AdminRights: False

zurück und der Vergleich
IF False==False (

dürfte an sich nicht scheitern.

Grundsätzlich habt ihr natürlich recht, es ist ein Stringvergleich und sollte daher besser in Anführungsstrichen stehen.

Ich hab deine Vorschläge deshalb übernommen und

IF "%AdminRights%"=="False" (  

so wie

IF %choice%==1 GOTO CreateDirectories  
IF %choice%==2 GOTO CreateRegistryEntries  
IF %choice%==3 GOTO AdditionalTasks  
IF %choice%==4 GOTO Exit

entsprechend geändert.

Leider ändert es nichts an der eigentlichen Fehlermeldung, wenn das Script ausgeführt wird.

Ich bin irgendwie ziemlich ratlos mittlerweile...

Gruß,
Highend