Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Batch Variablen Problem

Empfohlene Antworten

Veröffentlicht

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

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

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

)

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...

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 ;-)

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.

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...

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

 

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.