Zum Inhalt springen

Batch Variablen Problem


Qwert4

Empfohlene Beiträge

Hallo, ich habe hier ein Problem mit einem Batch File.

set /p pcnr=PC-Nummer eingeben: 

set "WorstCaseLen=100"

For /L %%i in (%WorstCaseLen%,-1,1) do (

      if not defined myStrLen if "!pcnr:~%%i,1!" NEQ "" Set /a myStrLen=1+%%i

)

echo %myStrLen%

Ich möchte eine 6 Stellige PC Nr eingeben und diese dann überprüfen, nach dem einlesen kann ich diese auch mit if überprüfen wenn sie stimmt geht alles, aber wenn sie nicht stimmt und ich die eingabe wiederhole aktualisiert sich die Variable mit der der länge nicht, d.h. wenn ich bei ersten mal nur eine länge von 5 haben und beim zweiten mal 6 sagt er mir immer noch 5.

Weiß jemand weiter?

mfg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm ich postet mal das komplette Skript ich vermute mal das er die Variable festanlegt, selbst wenn ich anschließend versuche die Variable wieder auf 0 zusetzen passiert nichts muss das skript schließen und neu ausführen... und das ist blöd in diesem fall

@echo off & setlocal EnableDelayedExpansion

set days=30

:start

set myStrLen

cls

echo ----------------

echo 1 - kan

echo 2 - ger

echo 5 - Optionen

echo 0 - Beenden

echo ----------------

echo.

set /p choice=Kuerzel fuer Auswahl eingeben und mit Enter bestaetigen: 

if %choice%==1 goto kan

if %choice%==5 goto opt

if %choice%==2 goto ger

if %choice%==0 goto end

:opt

set /p days=Profile die aelter als x Tage sind werden geloescht (Standart=30): 

goto start


:kan

set /p pcnr=PC-Nummer eingeben: 

set "WorstCaseLen=100"

For /L %%i in (%WorstCaseLen%,-1,1) do (

      if not defined myStrLen if "!pcnr:~%%i,1!" NEQ "" Set /a myStrLen=1+%%i

)

echo %myStrLen%

pause

if not %myStrLen%==6 (goto failed) else (

delprof.exe /q /i /c:\\kan-pc%pcnr% /d:%days%

echo Profile auf kan-pc%pcnr% die aelter als %days% sind wurden geloescht!

pause

goto start

)


set /p pcnr=PC-Nummer eingeben: 

set "WorstCaseLen=100"

For /L %%i in (%WorstCaseLen%,-1,1) do (

      if not defined myStrLen if "!pcnr:~%%i,1!" NEQ "" Set /a myStrLen=1+%%i

)

if %myStrLen%==6 (goto ger6) else (goto failed)


:ger6

delprof.exe /q /i /c:\\ger-pc%pcnr% /d:%days%

echo Profile auf ger-pc%pcnr% die aelter als %days% sind wurden geloescht!

pause

goto start


:failed

echo Die eingegebene Nummer ist nicht verfügbar.

pause

goto start


:end

exit

Bearbeitet von Qwert4
Link zu diesem Kommentar
Auf anderen Seiten teilen

Komisch aber das !MyStrLen! ändert bei mir nichts? *confused*

Der Link erklärt das zwar und ist auch nachvollziehbar aber in meinem fall ändert das nichts.

:kan

set /p pcnr=PC-Nummer eingeben: 

set "WorstCaseLen=100"

For /L %%i in (%WorstCaseLen%,-1,1) do (

      if not defined myStrLen if "!pcnr:~%%i,1!" NEQ "" Set /a myStrLen=1+%%i

)

echo [COLOR="Red"]!myStrLen![/COLOR]

pause

if not [COLOR="Red"]!myStrLen![/COLOR]==6 (goto failed) else (

delprof.exe /q /i /c:\\kan-pc%pcnr% /d:%days%

echo Profile auf kan-pc%pcnr% die aelter als %days% sind wurden geloescht!

pause

goto start

)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Je mehr ich den Quelltext lese, desto weniger versteh ich Ihn. Egal.

An der roten Stelle ist die For-Schleife bereits beendet. Also ist es an der Stelle egal ob mit % oder mit ! gearbeitet wird. das ergebnis bleibt sich gleich. Wenn du aber das Echo in der Schleife haben willst und pro durchlauf eine ausgabe ist das ! pflicht und die Klammerung muss geändert werden. Aber wie gesagt, ich versteh grad den Quelltext immer weniger...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mmm im prinzip möchte ich nur eine PC-Nummer einlesen prüfen ob diese 6 Zeichen lange ist wenn ja dort die alten Profile löschen, wenn nicht Fehler Meldung und wieder ins Hauptmenü damit der Vorgang wiederholt werden kann. Also dann wieder Nummer eingeben und das selbe wieder...

Hilft dir das weiter?

Sry ich weiß mein Skript aufbau ist etwas chaotisch ;-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmm. Ich frage mich warum das dann so kompliziert sein muss.

ein solches script wäre damit vermutlich schneller:

set days=30

echo off

cls

:start

set /p Clientname=Clientnamen eingeben.

net use L: \\%clientname%\c$

L:

cd "l:\documents and settings"

for /f "tokens=1-4 delims= " %%i in ('dir /ta') do (

if %%i==%days% del /s /q %%l

If %%i==%days% echo %%l wurde gelöscht weil seit %%i nicht mehr genutzt.

)

c:

net use L: /delete

set /p qry=Noch mal Y/N

if %qry%==Y goto start

Die Optionen usw. kann man natürlich auch mit einbauen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sorry das es so lange gedauert hat bis ich mich wieder gemeldet habe...

Danke für die antwort. Du möchtest die Profile ja direkt aus dem Benutzer und Einstellungs Verzeichnis löschen, Problem dabei ist, es soll sauber gelöscht werden als auch Registrys usw. daher benutze ich den delprof von Microsoft dem kann ich sagen welcher PC wie viel Tage alte Profile usw...

Also einfach die entsprechenden Verzeichnisse löschen reicht leider nicht aus.

Habe jetzt noch weiter an meiner Datei rumprobiert, zuerst mal die Variable auf Null zu setzen usw. aber keine Chance das was ich einmal in die Variable rein gebe gibt sie mir immer aus egal wie oft ich das überschreibe.

@ lupo49

Aber das "SETLOCAL ENABLEDELAYEDEXPANSION" am Anfang des Skripts.

Sry ich raff jetzt grad nicht so recht was du mir damit sagen möchtest? das habe ich ja am anfang drinnen und das brauche ich auch sonst geht gar nichts mehr?!

Mm kann doch nicht so schwer sein, ich schaffe es nicht eine verdammte Variable zu überschreiben...

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich kenne am ende noch das

...

endlocal
Aber das ändert auch nix daran, das die Zeilen
echo !myStrLen!

pause

if not !myStrLen!==6 (goto failed) else (

delprof.exe /q /i /c:\\kan-pc%pcnr% /d:%days%

echo Profile auf kan-pc%pcnr% die aelter als %days% sind wurden geloescht!

pause

goto start

 
alle ausserhalb der For-Schleife stehen. Also brauchst du dort die ! nicht setzten, da an der Stelle die gleichen Ergebnisse rauskommen wie bei den %. Innerhalb deiner For-Schleife steht nur:
if not defined myStrLen if "!pcnr:~%%i,1!" NEQ "" Set /a myStrLen=1+%%i
Also erst wenn alles runtergezählt wurde folgt dann die Ausführung von
echo !myStrLen!

pause

if not !myStrLen!==6 (goto failed) else (

delprof.exe /q /i /c:\\kan-pc%pcnr% /d:%days%

echo Profile auf kan-pc%pcnr% die aelter als %days% sind wurden geloescht!

pause

goto start

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...