Was macht dieses Script?
Hallo Leute,
habe einen Codeschnipsel gefunden in dem ich aber nicht wirklich durchblicke.
Ich bin gerade dabei mir ein Script für eine Serverwartung zusammenzubauen.
In diesem Scriptabschnitt möchte ich das Profilverzeichnis leeren; d.h. alle Userprofile
ausser dem Admin, dem Tester, dem Default User und dem All Users sollen gelöscht werden.
Ich dachte eigentlich dass der unten beschriebene Code das machen würde. Wirklich kapieren
was das Script tut, weiss ich aber auch nicht. Kann mir da mal jemand auch die Sprünge helfen?
thx
Casper2k
habe einen Codeschnipsel gefunden in dem ich aber nicht wirklich durchblicke.
Ich bin gerade dabei mir ein Script für eine Serverwartung zusammenzubauen.
In diesem Scriptabschnitt möchte ich das Profilverzeichnis leeren; d.h. alle Userprofile
ausser dem Admin, dem Tester, dem Default User und dem All Users sollen gelöscht werden.
Ich dachte eigentlich dass der unten beschriebene Code das machen würde. Wirklich kapieren
was das Script tut, weiss ich aber auch nicht. Kann mir da mal jemand auch die Sprünge helfen?
FOR /F "Delims= Tokens=1*" %%a IN ('DIR /B "%systemdrive%\Dokumente und Einstellungen\"') DO (
IF /I NOT "%%a"=="Default User" FOR /F "Delims= Tokens=1*" %%b IN ('ECHO %%a') DO (
IF /I NOT "%%a"=="All Users" FOR /F "Delims= Tokens=1*" %%c IN ('ECHO %%a') DO (
IF /I NOT "%%a"=="Tester" FOR /F "Delims= Tokens=1*" %%c IN ('ECHO %%a') DO (
IF /I NOT "%%a"=="Administrator" RD /s /q "%systemroot%\Dokumente und Einstellungen\%%a" >> %LogPath%\Reboot.log
)
)
)
delprof.exe /Q /I
thx
Casper2k
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 76758
Url: https://administrator.de/forum/was-macht-dieses-script-76758.html
Ausgedruckt am: 28.04.2025 um 18:04 Uhr
11 Kommentare
Neuester Kommentar
Hi Casper,
war das Script wirklich so oder hast du dich schon dran versucht. Also wenn das Profile löschen soll, dann fress ich ein Besen. Erstmal hat die Variable "systemroot" da gar nicht verloren, denn die hat den Wert "C:\Windows", somit schon mal ganz falsche Spur.
Für was die Schleifen, hinter jeder Abfrage sinnvoll sein soll, kapiere ich auch noch nicht ganz. Denn eigentlich wird das mit der IF-Abfrage erschlagen.
Hier mal Script (leicht verändert):
Biber würde sowas als Onliner schreiben, nicht war?
Er schaut bestimmt noch vorbei....
Für was die delprof.exe da sein soll, darfst micht nicht fragen. Vom Namen her, würde ich sagen "Profil löschen". Jedoch würde das kein Sinn machen, da "rd" das schon macht.
Grüße
Dani
war das Script wirklich so oder hast du dich schon dran versucht. Also wenn das Profile löschen soll, dann fress ich ein Besen. Erstmal hat die Variable "systemroot" da gar nicht verloren, denn die hat den Wert "C:\Windows", somit schon mal ganz falsche Spur.
Für was die Schleifen, hinter jeder Abfrage sinnvoll sein soll, kapiere ich auch noch nicht ganz. Denn eigentlich wird das mit der IF-Abfrage erschlagen.
Hier mal Script (leicht verändert):
@echo off
for /f "delims=" %%a in ('dir /b "%systemdrive%\Dokumente und Einstellungen\"')do (
if /i "%%a" NEQ "Default User" (
if /i "%%a" NEQ "All Users" (
if /i "%%a" NEQ "Tester" (
if /i "%%a" NEQ "Administrator" echo /s /q "%systemdrive%\Dokumente und Einstellungen\%%a" >> c:\Reboot.log
)
)
)
)
Für was die delprof.exe da sein soll, darfst micht nicht fragen. Vom Namen her, würde ich sagen "Profil löschen". Jedoch würde das kein Sinn machen, da "rd" das schon macht.
Grüße
Dani
Hi,
Wann soll das Script ausgeführt werden bzw. wo? Domäne oder Arbeitsgruppe beim Starten oder Abmelden, etc...Fragen über Fragen.
Grüße
Dani
Ich möchte aber eigentlich erreichen dass alle Userprofile gelöscht werden
ausser die genannten. alles andere soll einfach weggelöscht werden.
Dies geschieht mit meinem Script oben. "rd" funktioniert sehr gut damit....ich habe nämlich außvversehen meine anderen User damit abgeschlossen. *g*ausser die genannten. alles andere soll einfach weggelöscht werden.
Wann soll das Script ausgeführt werden bzw. wo? Domäne oder Arbeitsgruppe beim Starten oder Abmelden, etc...Fragen über Fragen.
Grüße
Dani
Moin Casper2k,
ich schließe mich Danis Ausführungen an - das Skript ganz oben ist Blödsinn bzw. zu umständlich.
Folgende drei Varianten bringen das gewünsche Ergebnis (auf den Monitor statt in ein Logfile, kann also gefahrlos getestet werden):
Anmerkungen:
- Variante [1] wäre die einzige, bei der Du das Profil "Default User" überhaupt durch die FOR-Anweisung erwischt.
Denn "Default User" ist ein "verstecktes" Verzeichnis und wird weder beim normalen "Dir /a:d" noch bei einer FOR/D-Anweisung mit ausgegeben.
Erst der Zusatzschalter "DIR ../a:h" zieht auch dieses Verzeichnis/Profil mit an.
- Ich habe bei allen Varianten RELATIV gearbeitet - auf der Parallelebene von %USERPROFILE% oder %ALLUSERSPROFILE%. Ist mir lieber.
- die dritte Variante ist nicht kürzer, aber IMHO wartbarer - ich habe die Ausnahme-Profile im Blick.
- wie geschrieben, die Prüfung auf "..NEQ "Default User" ist bei [2] und [3] Wunschdenken. Dieses Profil siehst Du nicht.
- Zu ergänzen wäre aus meiner Sicht aber noch als 5. Profil das eigene, also "%username%". Das würde ich gern behalten.
Grüße
Biber
ich schließe mich Danis Ausführungen an - das Skript ganz oben ist Blödsinn bzw. zu umständlich.
Folgende drei Varianten bringen das gewünsche Ergebnis (auf den Monitor statt in ein Logfile, kann also gefahrlos getestet werden):
@for /f "delims=" %%a in ('dir /b /ah /ad "%USERPROFILE%\..\*"') do @(
if /i "%%a" NEQ "Default User" (
if /i "%%a" NEQ "All Users" (
if /i "%%a" NEQ "Tester" (
if /i "%%a" NEQ "Administrator" echo [1]rd /s /q "%USERPROFILE%\..\%%a"
)
)
)
)
@for /d %%a in ("%ALLUSERSPROFILE%\..\*") do @(
if /i "%%~nxa" NEQ "Default User" (
if /i "%%~nxa" NEQ "All Users" (
if /i "%%~nxa" NEQ "Tester" (
if /i "%%~nxa" NEQ "Administrator" echo [2]rd /s /q "%ALLUSERSPROFILE%\..\%%~nxa"
)
)
)
)
@for /f "delims=, tokens=1-4" %%i in (""Default User","All Users","Tester","Administrator"") do @(
@for /d %%a in ("%ALLUSERSPROFILE%\..\*") do @(
if /i "%%~nxa" NEQ %%i (
if /i "%%~nxa" NEQ %%j (
if /i "%%~nxa" NEQ %%k (
if /i "%%~nxa" NEQ %%l echo [3]rd /s /q "%ALLUSERSPROFILE%\..\%%~nxa"
)
)
)
)
)
- Variante [1] wäre die einzige, bei der Du das Profil "Default User" überhaupt durch die FOR-Anweisung erwischt.
Denn "Default User" ist ein "verstecktes" Verzeichnis und wird weder beim normalen "Dir /a:d" noch bei einer FOR/D-Anweisung mit ausgegeben.
Erst der Zusatzschalter "DIR ../a:h" zieht auch dieses Verzeichnis/Profil mit an.
- Ich habe bei allen Varianten RELATIV gearbeitet - auf der Parallelebene von %USERPROFILE% oder %ALLUSERSPROFILE%. Ist mir lieber.
- die dritte Variante ist nicht kürzer, aber IMHO wartbarer - ich habe die Ausnahme-Profile im Blick.
- wie geschrieben, die Prüfung auf "..NEQ "Default User" ist bei [2] und [3] Wunschdenken. Dieses Profil siehst Du nicht.
- Zu ergänzen wäre aus meiner Sicht aber noch als 5. Profil das eigene, also "%username%". Das würde ich gern behalten.
Grüße
Biber
Moin Casper2k,
Hmmja, das ist vielleicht einfacher am CMD-Prompt nachzuspielen als zu erklären...
[OT]Normalerweise hätte ich jetzt "nachzukaspern" geschrieben, aber in Anbetracht Deines Nicks...**gg [/OT]
Also, lass Dir am CMD mit "set ALLUSERS" mal den Variablenwert von %ALLUSERSPROFILE%" anzeigen.
Vorgeplänkel I:
Vorgeplänkel II
In der Laufvariablen %%a stehen nacheinander alle gefundenen Ordnernamen (mit Lw+Pfad+Ordnername), die auch bei einem
...gefunden worden wären.
Von diesen Ordnern will ich aber NUR die OrdnerNAMEN ( also %%~na) statt die Ordner-Lw+Ordner-Pfad+Ordnernamen, die ich mit %%a erhalten würde.
Denn diese Ordnernamen will ich ja mit "Administrator"/"Tester" etc. vergleichen können.
Wenn es noch nicht ganz klar ist, dann lass den Batch-Einzeiler mal laufen OHNE die ganzen "@", die die Anzeige unterdrücken. Dann kannst Du die ganzen aufgelösten Variablenwerte sehen.
Grüße
Biber
Verstehe ich das richtig, dass in der ersten Klammer (da wo auch Tester steht) die Ausnahmen definiert werden?
Jepp, exakt. Deshalb ist mir die auch am sympathischsten. Siehe oben, da habe ich geschrieben: "die dritte Variante ist nicht kürzer, aber IMHO wartbarer - ich habe die Ausnahme-Profile im Blick."Was ich allerdings nicht ganz verstehe, was macht die Variable %ALLUSERSPROFILE%\..\%%~nxa?
Hmmja, das ist vielleicht einfacher am CMD-Prompt nachzuspielen als zu erklären...
[OT]Normalerweise hätte ich jetzt "nachzukaspern" geschrieben, aber in Anbetracht Deines Nicks...**gg [/OT]
Also, lass Dir am CMD mit "set ALLUSERS" mal den Variablenwert von %ALLUSERSPROFILE%" anzeigen.
Vorgeplänkel I:
>set allusers
ALLUSERSPROFILE=C:\Dokumente und Einstellungen\All Users
In der Laufvariablen %%a stehen nacheinander alle gefundenen Ordnernamen (mit Lw+Pfad+Ordnername), die auch bei einem
>dir /b "%allusersprofile%\..\*"
Von diesen Ordnern will ich aber NUR die OrdnerNAMEN ( also %%~na) statt die Ordner-Lw+Ordner-Pfad+Ordnernamen, die ich mit %%a erhalten würde.
Denn diese Ordnernamen will ich ja mit "Administrator"/"Tester" etc. vergleichen können.
Wenn es noch nicht ganz klar ist, dann lass den Batch-Einzeiler mal laufen OHNE die ganzen "@", die die Anzeige unterdrücken. Dann kannst Du die ganzen aufgelösten Variablenwerte sehen.
Müsste doch eigentlich if /i "%%~nxa" NEQ %%l echo [3]rd /s /q "C:\Dokumente und Einstellungen\%%~nxa" heißen, oder?
Hmmm... heißt es auch ...eigentlich.... aber "...%ALLUSERSPROFILE%\..\%%~nxa " ist ein bisschen universeller...Grüße
Biber