jschneider
Goto Top

Irgendwo ein Syntaxproblem

Im folgenden Code habe ich offenbar ein Syntaxproblem, finde ihn aber nicht

Hallo liebe Gemeinde

ich habe hier etwas gecodet, wo ich ein Syntaxproblem drin habe. Ich habe mich zwar nach einem
Tool umgeschaut, welches ein Batch-Code-Highliting vornimmt - habe aber keines, welches mich
zufriedenstellt, gefunden.
Notepadd++ fand ich ganz nett, aber das geht mit Klammern komisch um und kann diese m.E. nicht sauebr interpretieren.

Ich poste mal den Code (bitte nicht über ihn lachen - da er sicher nicht super optimal ist) und
danke vorab fürs lesen.


Kurze Beschreibung was dieses Script macht:

Es sammelt User Homelaufwerke ein, legt die Verzeichnisse in der neuen Struktur an und
berechtigt sie auf die AD-User. Es findet absichtlich KEIN kopiervorgang der Inhalte statt.
Alle x MB wird ein neues Verzeichnis erstellt, welches dann später ein anderes Volume im
Storage entspricht. Je nach Definition in der Parameterdatei werden die Verzeichnisse auf
einem anderen Standort angelegt

1. Anhand einer ParameterDatei werden alle die in dieser Datei aufgeführten Shares durchsucht
nach Homelaufwerken von Benutzern.

2. Für jedes gefundene QuellVerzeichnis wird überprüft, ob der dazugehörige Benutzer im AD existiert.
Wenn nicht wird das Verzeichnis in einem Lost & found Container angelegt.

Wenn der User existiert wird die Größe des Laufwerks ermittelt und sein Verzeichnis je nach
Parameter aus der Parameterdatei auf einen Standortspeziefischen Filer geschrieben.

mit setacl wird dann gleich die entsprechende Berechtigung auf das Verzeichnis gesetzt.

3. Das anlegen eines Verzeichnisses (falls der user existiert) wird in einer Logdatei festgehalten
in der Username, Quellverzeichnis und neu erstelltes Verzeichnis festgehalten werden.
Anhand dieser nformationen wird dann spätet mir Robocopy ein Mirror durchgeführt
Weiterhin soll bei einem weiteren Lauf des Scriptes überprüft werden, ob der User bereits ein
definiertes neues Verzeichnis besitzt um Zeit zu psaren. Wenn der User bereits ein Verzeichnis
besitzt muss nicht nochmal geschaut werden wie groß sein Quellverzeichnis ist etc..) In diesem
Falle wird lediglich überprüft, ob das Verzeichnis für den User auch tatsächlich existiert und ggf.
erneut angelegt und berechtigt.

4. sobald der Counter, der je Standort und je anzulegenden User in diesem Standort ein Limit
überschritten hat wird ein neues Unterverzeichnis benutzt (später andere Partition)


Ein zwei strategische Ansätze laufen noch nicht ganz rund und müssen auch noch mit nachdenken
gelöst werden. Das Script wäre also selbst nach dem Syntaxproblem noch nicht fertig.

ToDo's:
- Counter je Standort, darf nicht je Zeile in der Parameterdatei auf Null gesetzt werden,
sondern muss irgendwie mitbekommen, wenn sich ein Standort tatsächlich ändert.

- Bei erneutem Lauf muss das Script schauen welche Unterverzeichnisse (durch Limitierung)
beim ersten mal angelegt wurden und dann ggf. neue anlegen
bsp Vol1, Vol2, Vol3 wurden beim ersten Lauf angelegt. Beim zweiten lauf muss Vol4 Vol5
etc genutzt werden

- Lodgatei für späteren Vergleich kann Volumen des Quellverzeichnises je user festhalten
um zu schauen wieviel potentiell je Volx noch frei wäre oder so


Sollte noch was unklar sein einfach melden

und nochmals danke fürs lesen und reindenken - wers macht face-wink


@echo off & setlocal 
cls
rem ******************************************************************************
rem *** Script zur Anlage und Berechtigung aller Homeverzeichnisse
rem ***
rem *** Author       : *****
rem *** Kunde        : *****
rem *** Version      : 1.2
rem *** Datum        : 27.02.2008
rem ***
rem *** Beschreibung : 
rem ***     - Auslesen aller existierenden UserHomes 
rem ***       Volumes dafür werden in %ConfigFile% definiert
rem ***     - HomeDir Verzeichnisnamen werden als User interpretiert
rem ***       und überprüft, ob diese im ActiveDirectory existieren
rem ***     - wenn User existiert wird in neuer Struktur das HomeDir 
rem ***       angelegt und für User berechtigt
rem ***     - wenn User nicht existiert wird UserHome in einem
rem ***       Lost & Found Verzeichnis erstellt ohne Berechtigung
rem ***     - die jeweiligen Größen der HomeDirs werden überprüft
rem ***     - Die Volumina werden zusammengezählt und bei Überschreitung
rem ***       eines Limits ein neuer Ordner für Neuanlage erstellt/genutzt
rem ***     - Scriptlaufzeit wird festgehalten
rem *** 
rem *** 
rem ******************************************************************************


rem ***** Funktion für die Scriptlaufzeitmessung *********************************
rem *** Startzeit (in Hundertstelsekunden) holen und speichern
call :GetTime
set "Startzeit=%t%"  
set "Start=%TimeInHSec%"  
echo %Startzeit%
rem ******************************************************************************

rem ***** Konfiguration allgemeiner Parameter ************************************
rem *** ConfigFile für die Definition der zu durchsuchenden QuellShares/-Volumes
set ConfigFile=C:\scripting\20-scripts\Phase1-CreateStructure\Phase1-CreateHomeStructure_only_Res\HomeVolumes.txt

rem **** benutzte Tools werden definiert
rem *** SetAcl für die Verzeichnisberechtigung
set setacl_bin=C:\scripting\10-tools\setacl\setacl.exe

rem *** DirUse für die Ermittlung der Verzeichnisgrößen
set diruse_bin=C:\scripting\10-tools\dirUse\diruse.exe

rem *** Beep zur Akustischen Anzeige der Limitüberschreitung
set beep_bin=C:\scripting\10-tools\beep\beep.exe

rem *** Definition des Hauptverzeichnisses für die Erstellung der neuen HomeDirs
set MasterTDir=D:\Migration\Home
 if not Exist %MasterTDir% md %MasterTDir%

rem *** Definition des Lost und Found Verzeichnisses falls Benutzer im AD nicht gefunden wurde
set MasterNeDir=D:\Migration\Home_nonExistingUsers
 if not Exist %MasterNeDir% md %MasterNeDir%

rem *** Definition der ersten Logdatei für das reine FunktionsLog
rem *** wird bei jedem Lauf neu Überschrieben
set LogFile=C:\scripting\20-scripts\Phase1-CreateStructure\Phase1-CreateHomeStructure_only_Log\Phase1-CreateHomeStructure_only.log
 if exist %LogFile% (
 del %Logfile%
 )

rem *** Logdatei für Info über nicht existierende User
rem ***
set NeLogFile=C:\scripting\20-scripts\Phase1-CreateStructure\Phase1-CreateHomeStructure_only_Log\NotExistingUser.log


rem *** Definition der zweiten Logdatei für die User zu HomeDir Zuordnung
rem *** diese Logdatei wird beim späteren Kopieren sowie beim Schreiben der
rem *** ActiveDirectory UserProfile und TSUserProfiledir genutzt.
set User_HomeDirLog=C:\scripting\20-scripts\Phase1-CreateStructure\Phase1-CreateHomeStructure_only_Log\Phase1-UserHome.log
 if exist %User_HomeDirLog% (
 echo %User_HomeDirLog% wird benutzt und ggf. erweitert
 rem del %User_HomeDirLog%
 )
echo ---------------- neuer Lauf am %date% um %time% ---------------- >> %User_HomeDirLog% 


rem *** Definition des ActiveDirectory Namens
set domain=ADS-MIG

rem *** Setzen von Startparameter für diverse Counter
set UnErfolgreicherCreateCounter=0
set ErfolgreicherCreateCounter=0
set CreateCounter=0
set UserInfoCnt=0
set setacl_error=0
set noADUserHomes=0
set existcounter=0
set /a gsum=0
set /a VolSum=0
set Userinfo=
set UserHomeDir=%temp%



rem *** Definition des Limits in MB !! für die einzelnen Volumes auf denen die
rem *** neuen HomeDirs erstellt werden - für den test auf 100 MB gesetzt) 
set VolLimit=100

rem ******************************************************************************



rem ***** HauptFunktion **********************************************************
rem *** aus dieser Hauptfunktion werden diverse Unterfunktionen aufgerufen
rem *** ConfigFile auslesen, HomeDirs ermitteln je Volume/Share
rem *** Größen der einzelnen HomeDirs ermitteln

for /f "tokens=1,2 delims=;" %%t in ('findstr "\\" %Configfile%') do (  
 set /a SubDirCnt=0
 echo %%t %%u
 set /a sum=0
 for /f "delims=" %%a in ('dir /b /ad  %%u') do (  
 echo -----------------------------------------------------------  >> %LogFile% 
 echo -----------------------------------------------------------   
 echo Info    -01- : Standort ist  %%t
 echo Info    -02- : QuellShare ist %%u
 echo Info    -03- : HomeVerzeichnis %%a auf %%u Server gefunden
 echo Info    -03- : Homeverzeichnis %%a auf %%u gefunden  >> %LogFile%

rem for /f "Tokens=1 Delims=." %%v in ('%diruse_bin% -s -m %%u\%%a^|find "SUB-TOTAL"') do (  
rem    call :Add %%v	
rem  )

 echo Aktion  -11- : Suche Benutzer  %%a im ActiveDirectory
 echo Aktion  -11- : Suche Benutzer  %%a im ActiveDirectory >> %LogFile%
 call :CheckForUserName %%a %%t %%u
 )
)
goto :fertig
rem ******************************************************************************




rem ****** Unterfunktion *********************************************************
rem *** Suche des Benutzers im AD, HomeDir anlegen und berechtigen

:CheckForUserName
set eUserHome=%1
set eUserHomeStandort=%2
set QuellShare=%3

Net User %eUserHome% /Domain >NUL 2>NUL
If %ErrorLevel% NEQ 0 (
 call :UserDontExistinAD %eUserHome%
) Else (
        call :UserExistinAD %eUserHome%
	
        call :UserHomeDirInfo %eUserHome%
)

alles was hier mit rem's versehen ist bringt das Syntax Problem. Wenn ich diesen Teil rausnehme läuft das Script zumindest raus

echo Anfang problematische  Funktion

rem If %Userinfo% EQU yes ( 

rem echo Userinfo ist vorhanden
rem  echo userhoedir ist %UserHomeDir%
rem   if Exist %UserHomeDir% ( 
 rem   echo Warnung -21- : Homeverzeichnis %eUserHome% existiert bereits im ADS - Standort: %eUserHomeStandort%
 rem   echo Warnung -21- : Homeverzeichnis %eUserHome% existiert bereits im ADS - Standort: %eUserHomeStandort% >> %Logfile%
 rem   set /a "existCounter=Existcounter+1"  
 rem   echo Counter      : %Existcounter% bereits existierende Homeverzeichnise
rem     )
rem  if not Exist %UserHomeDir%\ (
rem     echo %UserHomeDir% nicht existent
rem     for /f "Tokens=1 Delims=." %%v in ('%diruse_bin% -s -m %QuellShare%\%eUserHome%^|find "SUB-TOTAL"') do @call :Add %%v	  
   

rem     set /a "CreateCounter=CreateCounter+1"  
rem     echo Aktion  -13- : Homeverzeichnis %eUserHome% in ADS, %eUserHomeStandort% anlegen >> %LogFile%
rem    echo Aktion  -13- : Homeverzeichnis %eUserHome% in ADS, %eUserHomeStandort% anlegen
rem     echo Counter      : %CreateCounter% Homeverzeichnisse angelegt
rem     md %MasterTDir%\%eUserHomeStandort%\Home%SubdirCnt%\%eUserHome%
  
rem    if %ERRORLEVEL%==0 (
rem      echo Info    -05- : HomeVerzeichnis %eUserHome% erfolgreich angelegt am Standort %eUserHomeStandort% >> %LogFile%
 rem     set /a "ErfolgreicherCreateCounter=ErfolgreicherCreateCounter+1"  
 rem     echo Counter      : %ErfolgreicherCreateCounter% erfolgreich angelegte HomeVerzeichnisse
rem      echo Aktion  -14- : schreibe User_HomeDir_Log für %eUserHome% >> %LogFile%
rem      rem echo %eUserHome%;%MasterTDir%\%eUserHomeStandort%\Home%SubdirCnt%\%eUserHome% >> %User_HomeDirLog% 
rem      echo Aktion  -15- : setze Verzeichnisberechtigung auf Homeverzeichnis %eUserName%
rem      %setacl_bin% -on %MasterTDir%\%eUserHomeStandort%\Home%SubdirCnt%\%eUserHome% -ot file -actn setowner -ownr n:%domain%\%eUserHome% -actn ace -ace n:%domain%\%eUserHome%;p:full -ace n:%domain%\Grp_Sec_HomeDir_Admins;p:full -ace n:System;p:full  -actn clear -clr dacl,sacl -actn setprot -op dacl:p_nc
   
rem      if NOT %errorlevel%==0 (
rem       set "setacl_error=setaclerror+1"    
rem       echo Fehler  -42- : Verzeichnisberechtigung konnte nicht sauber durchgefuert werden-
rem       echo Fehler  -42- : Verzeichnisberechtigung konnte nicht sauber durchgefuert werden >> %LogFile%
rem      )
rem     )
 
rem     if NOT %ERRORLEVEL%==0 (
 rem     set /a "UnErfolgreicherCreateCounter=UnErfolgreicherCreateCounter+1"  
 rem     echo - %UnErfolgreicherCreateCounter% erfolgreich angelegte HomeVerzeichnisse
rem      echo Fehler -43-  : HomeVerzeichnis von %eUsername% in ADS am Standort %eUserHomeStandort% wurde nicht angelegt
rem      echo Fehler -43-  : HomeVerzeichnis von %eUsername% in ADS am Standort %eUserHomeStandort% wurde nicht angelegt >> %LogFile%
rem    )
rem ) 
rem )

ab hier scheint wieder alles sauber zu sein

If %UserInfo% EQU no (
 echo mache nu mit %QuellShare% gegen %eUserHome% 
  for /f "Tokens=1 Delims=." %%v in ('%diruse_bin% -s -m %QuellShare%\%eUserHome%^|find "SUB-TOTAL"') do (  
  call :Add %%v	
 )
 set /a "CreateCounter=CreateCounter+1"  
 echo Aktion  -13- : Homeverzeichnis %eUserHome% in ADS, %eUserHomeStandort% anlegen >> %LogFile%
 echo Aktion  -13- : Homeverzeichnis %eUserHome% in ADS, %eUserHomeStandort% anlegen

 md %MasterTDir%\%eUserHomeStandort%\Home%SubdirCnt%\%eUserHome%
  if %ERRORLEVEL%==0 (
  echo Info    -05- : HomeVerzeichnis %eUserHome% erfolgreich angelegt am Standort %eUserHomeStandort% >> %LogFile%
  set /a "ErfolgreicherCreateCounter=ErfolgreicherCreateCounter+1"  
  echo Counter      : %ErfolgreicherCreateCounter% erfolgreich angelegte HomeVerzeichnisse
  echo Aktion  -14- : schreibe User_HomeDir_Log für %eUserHome% >> %LogFile%
  echo %eUserHome%;%MasterTDir%\%eUserHomeStandort%\Home%SubdirCnt%\%eUserHome%;%QuellShare%\%eUserHome% >> %User_HomeDirLog% 
  echo Aktion  -15- : setze Verzeichnisberechtigung auf Homeverzeichnis %eUserName%
  %setacl_bin% -on %MasterTDir%\%eUserHomeStandort%\Home%SubdirCnt%\%eUserHome% -ot file -actn setowner -ownr n:%domain%\%eUserHome% -actn ace -ace n:%domain%\%eUserHome%;p:full -ace n:%domain%\Grp_Sec_HomeDir_Admins;p:full -ace n:System;p:full  -actn clear -clr dacl,sacl -actn setprot -op dacl:p_nc
 
  if NOT %errorlevel%==0 (
   set "setacl_error=setacl_error+1"    
   echo Fehler  -42- : Verzeichnisberechtigung konnte nicht sauber durchgefuert werden
   echo Fehler  -42- : Verzeichnisberechtigung konnte nicht sauber durchgefuert werden >> %LogFile%
  )
 )
 if NOT %ERRORLEVEL%==0 (
  set /a "UnErfolgreicherCreateCounter=UnErfolgreicherCreateCounter+1"  
  echo - %UnErfolgreicherCreateCounter% erfolgreich angelegte HomeVerzeichnisse
  echo Fehler -43-  : HomeVerzeichnis von %eUsername% in ADS am Standort %eUserHomeStandort% wurde nicht angelegt
  echo Fehler -43-  : HomeVerzeichnis von %eUsername% in ADS am Standort %eUserHomeStandort% wurde nicht angelegt >> %LogFile%
 )
)


echo -----------------------------------------------------------
echo.
goto :eof
rem ******************************************************************************



rem ******* Unterfunktion ********************************************************
rem *** Zusammenfassung 

:fertig
rem ****** Ende der Scriptlaufzeit ermitteln 
rem *** Endzeit (in Hundertstelsekunden) holen und speichern
call :GetTime
set "Endzeit=%t%"  
set "End=%TimeInHSec%"  
rem echo %EndZeit%

rem *** Ermittlung und Zerlegung/Formatierung der Differenz
set /a Diff=%End%-%Start%
:: Tageswechsel beachten
if %Diff% lss 0 set /a Diff+=8640000

set DiffRem=%Diff%
rem ***  Hundertstelsekunden holen
call :GetPart 100
set hs=%Part%
rem ***  Sekunden holen
call :GetPart 60
set s=%Part%
rem ***  Minuten holen
call :GetPart 60
set m=%Part%
rem ***  Stunden bleiben als Rest
set h=%DiffRem%



rem *** Zusammenfassung ausgeben
echo ----------------------------------------------------------
echo === Start: %Startzeit% Uhr === Ende: %Endzeit% Uhr 
echo ----------------------------------------------------------
echo === Fertig nach %h%:%m%:%s%,%hs% ==============================================
echo.
echo  bereits bekannte Homeverzeichnisse                 : %UserInfoCnt%
echo  Homeverzeichnisse, die bereits existierten         : %existcounter%
echo.
echo  Homeverzeichnisse, neu zu erstellen                : %createCounter%  
echo.
echo   - Homeverzeichnisse, die erstellt wurden          : %ErfolgreicherCreateCounter% 
echo   - Homeverzeichnisse, die nicht erstellt wurden    : %UnErfolgreicherCreateCounter%
echo   - Homeverzeichnisse, ohne ADS Benutzer            : %noADUserHomes% 
echo   - Homeverzeichnisse, die nicht berechtigt wurden  : %setacl_error% 
echo.
echo   - Summe aller neuen Homeverzeichnisse in Megabyte :  %gsum%
echo.
echo ======================================================================
pause
goto :eof

rem ****** Unterfunktion *********************************************************
rem *** wird von Funktion zur Scriptlaufzeitmessung genutzt

:GetTime
rem ***  Aktuelle Zeit verwenden ...
set t=%time%
rem ***  ... zerlegen ...
for /f "tokens=1-4 delims=:," %%i in ("%t%") do set "h=%%i" & set "m=%%j" & set "s=%%k" & set "hs=%%l"  
rem ***  ... Oktalzahlklippen umschiffen ...
if %m:~0,1%==0 set m=%m:~1%
if %s:~0,1%==0 set s=%s:~1%
if %hs:~0,1%==0 set hs=%hs:~1%
rem ***  ... und in Hundertstelsekunden-Wert umrechnen.
set /a TimeInHSec=((%h%*60+%m%)*60+%s%)*100+%hs%
goto :eof

:GetPart
rem *** Anhand des Aufrufparameters (60 oder 100) aufspalten ...
set /a Part=%DiffRem%%%%1
rem ***  ... und mit fuehrender Null formatieren sowie ...
if %Part% lss 10 set Part=0%Part%
rem ***  ... noch aufzuteilenden Rest der Differenz ermitteln.
set /a DiffRem=%DiffRem%/%1
goto :eof

rem ****** Unterfunktion *********************************************************
rem *** Zählen der HomeDir Größen 
:Add 
set /a sum+=%1 
set /a gsum+=%1
set /a VolSum+=%1
echo Counter -51- : HomeVerzeichnis hat %1 MB
echo Counter -51- : HomeVerzeichnis hat %1 MB >> %LogFile%
echo Counter -52- : ZwischenSumme aller Homes am Standort ist %sum% MB 
echo Counter -52- : ZwischenSumme aller Homes am Standort ist %sum% MB >> %Logfile%
echo Counter -53- : Summe aller Homes ist %gsum% MB 
echo Counter -53- : Summe aller Homes ist %gsum% MB >> %Logfile%


if %VolSum% GTR %VolLimit% (
 echo ########################################################
 set /a "SubdirCnt=SubdirCnt+1"  
 echo # SubdirCounter %SubdirCnt%
 %beep_bin% 3 
 echo # Achtung !!!
 echo #    Volumengrenze %VolLimit% wurde mit %VolSum% MB erreicht.
 echo #    Es wird ein neues Volume fuer die naechsten Homedirs
 echo #    genutzt bis das Limit erneut erreicht wurde
 echo #
 echo # Hinweis !!! VolSum mit Wert %Volsum% wird wiederauf 0 gesetzt.
 set /a VolSum=0
 )
echo ########################################################
echo # Hinweis !!!
echo # Volumen ist derzeit %VolSum% MB fuer aktuelles Volume
echo # SubDirCounter ist nun %SubdirCnt%
echo ########################################################

Goto :eof


rem *** Unterfunktion, wenn User im AD gefunden wurde ***
:UserExistinAD
echo Info    -04- : Benutzer %1 im AD gefunden 
echo Info    -04- : Benutzer %1 im AD gefunden >> %LogFile%
Goto :eof


rem *** Unterfunktion, wenn User nicht im AD gefunden wurde ***
:UserDontExistinAD
echo Fehler  -41- : Benutzer %1 konnte im AD nicht gefunden werden
echo Fehler  -41- : Benutzer %1 konnte im AD nicht gefunden werden >> %LogFile%
echo Aktion  -12- : lege Homeverzeichnis %eUserHome% in %MasterNeDir%\__%eUserHome%__ ohne Berechtigung an
echo Aktion  -12- : lege Homeverzeichnis %eUserHome% in %MasterNeDir%\__%eUserHome%__ ohne Berechtigung an >> %LogFile%
echo %1;%MasterNeDir%\__%eUserHome%__ >> %NeLogFile%
set /a "noADUserHomes=noADUserHomes+1"  
md %MasterNeDir%\__%eUserHome%__ 
Goto :eof



rem *** Unterfunktion UserHomeDirInfo 
rem ***
:UserHomeDirInfo
echo suche userinfo
set UserInfo=no
for /f "Tokens=1,2 Delims=;" %%p in ('findstr "%1" %User_HomeDirLog%') do (  
    set UserInfo=yes
    set /a UserInfoCnt=Userinfocnt+1
    echo UserInfoCnt durch %%p auf 1 hochgezaehlt
    echo User %%p hat bereits eine Homeverzeichnisinformation %%q
    set UserHomeDir=%%q
   )

Goto :eof



[Edit Biber] Originaltitel "Irgendwo ein Syntaxproblem - zu Hülfää" in die Erwachsenensprache transformiert. [/Edit]

Content-Key: 81856

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

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

Member: bastla
bastla Feb 28, 2008 at 09:28:39 (UTC)
Goto Top
Hallo jschneider!

Beim schnellen Drüberschauen sind mir zumindest Zeilen der folgenden Art aufgefallen:
set /a "existCounter=Existcounter+1"  
Die Schreibweise hierfür müsste entweder
set /a Existcounter=%Existcounter%+1
oder kürzer
set /a Existcounter+=1
lauten ...
Dass Deine (Verzeichnis-)Pfade grundsätzlich nicht unter Anführungszeichen stehen (und es auch nicht müssen, solange sie keine Leerzeichen enthalten), könnte auch eine Rolle spielen. Auch wenn derzeit kein Fehler daraus resultiert, würde ich die entsprechenden Anführungszeichen (zur Sicherheit, etwa im Hinblick auf zukünftige Anpassungen) doch setzen.

Grüße
bastla
Member: miniversum
miniversum Feb 28, 2008 at 10:12:04 (UTC)
Goto Top
In der zweiten Hälfte des Teils der zu Problemen Fürht ist zweimal (verschachtelt) eine Kontruktion drin ala:
if %ERRORLEVEL%==0 (
...
)
if NOT %ERRORLEVEL%==0 (
...
)
Zum einen füre ich da das == durch equ ersetzen (wie bei den ifs drüber auch). Ist einfach nicht so Fehleranfällig, bilde ich mir zumindest ein ;) .
Außerdem würde ich diese Konstruktion durch eine IF .. Else ersetzen.
if %ERRORLEVEL%==0 (
...
) else (
...
)
Denn wenn ein anderes Program in den klammern aufgerufen wird wird der errorlevel davon überschrieben und das if NOT %ERRORLEVEL%==0 ( würde dann was falsches außwerten. Daher würd ich den errorlevel nur einmal direkt nach dem zu kontrollierenden Programm abfragen und zur not in einer Andern Variabeln zwischenspeichern um sicherzugehen das er nicht ungewollt durch einen anderen Befehl verändert wird.

Allgemein zu fehlersuche kannst du ja ein echo on zu begin des abschnittes machen und ein echo off danach. So siehst du diesen bereich und die Weerte der Variabeln. Vielelcith noch ein paar echos zusätzlich um die bestimtme Fariabeln anzuzeigen. mache auch imem rein zeichen vor und nach der Variabeln um zu sehen ob nicht eine Leerstelle davor oder danach vielleicht für Probleme sorgt. also z.B.:
echo Userinfo=[%Userinfo%]
Member: jschneider
jschneider Feb 28, 2008 at 10:34:47 (UTC)
Goto Top
Hallo Bastla,

ich habe bisher immer wieder verschiedene Arten des Zählens gefunden.
Meine Art funktioniert aber "irgendwie" kannst du mir dazu ein klein wenig Hintergrundinfo geben ?

Ich bin aber immer froh meinen Code so sauber als möglich zu gestalten.

Jan, der lernende

mit den anführungszeichen gehe ich an wenn die Logik insgesamt soweit stimmig ist

bis dahin danke

ich werde noch etwas die Tips bis dahin durchtesten und dann ggf. Erfolg vermelden hier.

Beim schnellen Drüberschauen sind mir
zumindest Zeilen der folgenden Art
aufgefallen:
set /a
> "existCounter=Existcounter+1"  
> 
Die Schreibweise hierfür müsste
entweder
set /a
> Existcounter=%Existcounter%+1
> 
oder kürzer
set /a Existcounter+=1
> 
lauten ...
Dass Deine (Verzeichnis-)Pfade
grundsätzlich nicht unter
Anführungszeichen stehen (und es auch
nicht müssen, solange sie keine
Leerzeichen enthalten), könnte auch eine
Rolle spielen. Auch wenn derzeit kein Fehler
daraus resultiert, würde ich die
entsprechenden Anführungszeichen (zur
Sicherheit, etwa im Hinblick auf
zukünftige Anpassungen) doch setzen.
Member: jschneider
jschneider Feb 28, 2008 at 10:37:20 (UTC)
Goto Top
Hallo Miniversum

ich bin gerade dabei jeden kleinen Pups mit nem Echo zu versehen. Der Tipp mit dem
[%Wert%] ist dabei Goldwert

das if else werde ich auch mal umsetzen und noch mehr code in Funktionen stecken

wie bereits bastla gesagt - melde ich mich heute och und melde ggf. Erfolg

In der zweiten Hälfte des Teils der zu
Problemen Fürht ist zweimal
(verschachtelt) eine Kontruktion drin ala:
> if %ERRORLEVEL%==0 (
> ...
> )
> if NOT %ERRORLEVEL%==0 (
> ...
> )
Zum einen füre ich da das == durch equ
ersetzen (wie bei den ifs drüber auch).
Ist einfach nicht so Fehleranfällig,
bilde ich mir zumindest ein ;) .
Außerdem würde ich diese
Konstruktion durch eine IF .. Else ersetzen.
> if %ERRORLEVEL%==0 (
> ...
> ) else (
> ...
> )
Denn wenn ein anderes Program in den
klammern aufgerufen wird wird der errorlevel
davon überschrieben und das if NOT
%ERRORLEVEL%==0 ( würde dann was
falsches außwerten. Daher würd ich
den errorlevel nur einmal direkt nach dem zu
kontrollierenden Programm abfragen und zur
not in einer Andern Variabeln
zwischenspeichern um sicherzugehen das er
nicht ungewollt durch einen anderen Befehl
verändert wird.

Allgemein zu fehlersuche kannst du ja ein
echo on zu begin des abschnittes machen und
ein echo off danach. So siehst du diesen
bereich und die Weerte der Variabeln.
Vielelcith noch ein paar echos
zusätzlich um die bestimtme Fariabeln
anzuzeigen. mache auch imem rein zeichen vor
und nach der Variabeln um zu sehen ob nicht
eine Leerstelle davor oder danach vielleicht
für Probleme sorgt. also z.B.:
> echo Userinfo=[%Userinfo%]

Member: bastla
bastla Feb 28, 2008 at 11:21:28 (UTC)
Goto Top
Hallo jschneider!

Sorry für den Fehlalarm - durch die Verwendung der Anführungzeichen funktionieren Deine "set /a"-Anweisungen wie beabsichtigt (bzw würde zB ein Schreibfehler bei einem Variablennamen zwar zu einem falschen Ergebnis, nicht aber zu einem Syntaxfehler führen). Aus der Hilfe zu "set":

Wenn Sie einen der arithmetischen oder Moduloperatoren verwenden, müssen Sie die Zeichenfolge für den Ausdruck in Anführungszeichen setzen. Alle nicht-nummerischen Zeichenfolgen im Ausdruck werden als Zeichenfolgen von Umgebungsvariablen behandelt, deren Werte vor der Verwendung in Zahlen konvertiert werden. Wenn eine Umgebungsvariable angegeben wird, die nicht definiert ist, wird für diese der Wert Null verwendet. Somit können Sie mit Umgebungsvariablen Berechnungen vornehmen, ohne %-Zeichen einzugeben, um deren Werte zu erhalten.

Grüße
bastla
Member: jschneider
jschneider Mar 03, 2008 at 10:36:15 (UTC)
Goto Top
das wars..

vielen dank


Gruß, Jan