Übergabe einer Zeile die vor der per findstr gefundenen Zeile liegt
Aaaalso erstmal ein freundliches Hallo und wie gehts.
Ich nutze euer Forum seit ein paar Tagen für Recherchen bezüglich Batch und Shell und bin jetzt leider an einem Problem angelangt, dass ich allein nicht lösen kann. Ich bin auch ein relativ blutiger Anfänger im cmd Coding aber versuche mein bestes, mich hineinzulesen.
Da ich aktuell bis zur Freischaltung meines Account im Ticketsystem unserer Firma noch ein wenig Freizeit habe, habe ich eine kleine Batch zur Sicherung eines Userprofils, die wir per Remote lokal auf dem User-PC ausführen können geschrieben, sprich Nutzerdaten kopieren, C:\Users\Userx löschen, restore.bat im Backupverzeichnis erstellen, mit der nach den notwendigen Änderungen die Daten wiederhergestellt werden können und Selbstlöschung zum Abschluss. Soweit funktioniert das auch alles hervorragend.
Jetzt möchte ich allerdings auch, dass gleichzeitig der Registrierungsschlüssel des Nutzers mit gelöscht wird, damit beim Neustart des Rechners die per Richtlinien gesetzten User Policys (die häufiger mal eine Fehlerquelle sind) neu gezogen werden.
Dieser Schlüssel liegt unter "HKLM\software\microsoft\windows nt\currentversion\profilelist\xyz"
XYZ hat hierbei keinerlei Bezug zum Username / Tag. Unter XYZ wiederum finde ich aber einen Schlüssel "profileimagepath" in dem der Wert das Usertags enthalten ist.
Da ich zu Beginn der Batchdatei diesen Tag eingebe um das Löschen anderer Profile auf dem Rechner zu vermeiden, suche ich mithile dieses Wertes den zugehörigen Schlüssel.
Ich möchte jetzt aber den wiederum übergeordneten Schlüssel XYZ finden und löschen. Und genau da liegt mein Problem, denn per findstr finde ich nur die Zeile, die den Wert "usertag" enthält, nicht aber die darüber liegende, die den Pfad zum übergeordneten Schlüssel angibt.
Faktum Code:
Bsp für den Inhalt der temp.txt:
HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-18
ProfileImagePath REG_EXPAND_SZ %systemroot%\system32\config\systemprofile
HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-19
ProfileImagePath REG_EXPAND_SZ C:\Windows\ServiceProfiles\LocalService
HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-20
ProfileImagePath REG_EXPAND_SZ C:\Windows\ServiceProfiles\NetworkService
HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-21-2010745621-3381963674-1579942189-1806914
ProfileImagePath REG_EXPAND_SZ C:\Users\stuebnpa
HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-21-2010745621-3381963674-1579942189-2145428
ProfileImagePath REG_EXPAND_SZ C:\Users\bielagT
Ich möchte nun mithilfe des Tags "stuebnpa" die Zeile
"HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-21-2010745621-3381963674-1579942189-1806914"
an temp2.txt ausgeben um sie von dort auf die Variable %Key% zu schicken.
Bin leider echt am Ende meines Lateins angelangt und würde mich über Hilfe sehr freuen. Mir ist auch bewusst, dass mein Coding sicherlich sehr umständlich ist, aber wie gesagt, ich bin noch blutiger Anfänger.
lg
Franco
edit: Aufgrund der Firmenrichtlinien sind leider weder externe Tools, noch Powershell möglich. Einzig und allein in cmd ausführbare Bordmittel. Benutzt wird Win7 / Win8.
Ich nutze euer Forum seit ein paar Tagen für Recherchen bezüglich Batch und Shell und bin jetzt leider an einem Problem angelangt, dass ich allein nicht lösen kann. Ich bin auch ein relativ blutiger Anfänger im cmd Coding aber versuche mein bestes, mich hineinzulesen.
Da ich aktuell bis zur Freischaltung meines Account im Ticketsystem unserer Firma noch ein wenig Freizeit habe, habe ich eine kleine Batch zur Sicherung eines Userprofils, die wir per Remote lokal auf dem User-PC ausführen können geschrieben, sprich Nutzerdaten kopieren, C:\Users\Userx löschen, restore.bat im Backupverzeichnis erstellen, mit der nach den notwendigen Änderungen die Daten wiederhergestellt werden können und Selbstlöschung zum Abschluss. Soweit funktioniert das auch alles hervorragend.
Jetzt möchte ich allerdings auch, dass gleichzeitig der Registrierungsschlüssel des Nutzers mit gelöscht wird, damit beim Neustart des Rechners die per Richtlinien gesetzten User Policys (die häufiger mal eine Fehlerquelle sind) neu gezogen werden.
Dieser Schlüssel liegt unter "HKLM\software\microsoft\windows nt\currentversion\profilelist\xyz"
XYZ hat hierbei keinerlei Bezug zum Username / Tag. Unter XYZ wiederum finde ich aber einen Schlüssel "profileimagepath" in dem der Wert das Usertags enthalten ist.
Da ich zu Beginn der Batchdatei diesen Tag eingebe um das Löschen anderer Profile auf dem Rechner zu vermeiden, suche ich mithile dieses Wertes den zugehörigen Schlüssel.
Ich möchte jetzt aber den wiederum übergeordneten Schlüssel XYZ finden und löschen. Und genau da liegt mein Problem, denn per findstr finde ich nur die Zeile, die den Wert "usertag" enthält, nicht aber die darüber liegende, die den Pfad zum übergeordneten Schlüssel angibt.
Faktum Code:
set /p "User="Please enter UserTag:""
reg query "HKLM\software\microsoft\windows nt\currentversion\profilelist" /s /v "profileimagepath" >>c:\temp\temp\temp.txt
findstr /I /C:%user% c:\temp\temp\temp.txt >>c:\temp\temp\temp2.txt
(Hier liegt mein Problem)
SET /p Key=<c:\temp\temp2.txt
REG DELETE "%Key%" /v "profileimagepath" /f
Bsp für den Inhalt der temp.txt:
HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-18
ProfileImagePath REG_EXPAND_SZ %systemroot%\system32\config\systemprofile
HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-19
ProfileImagePath REG_EXPAND_SZ C:\Windows\ServiceProfiles\LocalService
HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-20
ProfileImagePath REG_EXPAND_SZ C:\Windows\ServiceProfiles\NetworkService
HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-21-2010745621-3381963674-1579942189-1806914
ProfileImagePath REG_EXPAND_SZ C:\Users\stuebnpa
HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-21-2010745621-3381963674-1579942189-2145428
ProfileImagePath REG_EXPAND_SZ C:\Users\bielagT
Ich möchte nun mithilfe des Tags "stuebnpa" die Zeile
"HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\profilelist\S-1-5-21-2010745621-3381963674-1579942189-1806914"
an temp2.txt ausgeben um sie von dort auf die Variable %Key% zu schicken.
Bin leider echt am Ende meines Lateins angelangt und würde mich über Hilfe sehr freuen. Mir ist auch bewusst, dass mein Coding sicherlich sehr umständlich ist, aber wie gesagt, ich bin noch blutiger Anfänger.
lg
Franco
edit: Aufgrund der Firmenrichtlinien sind leider weder externe Tools, noch Powershell möglich. Einzig und allein in cmd ausführbare Bordmittel. Benutzt wird Win7 / Win8.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 295747
Url: https://administrator.de/forum/uebergabe-einer-zeile-die-vor-der-per-findstr-gefundenen-zeile-liegt-295747.html
Ausgedruckt am: 20.05.2025 um 17:05 Uhr
9 Kommentare
Neuester Kommentar
Hi,
es ist zwar nich Deine Frage, aber ...
Aber auch hier:
E.
es ist zwar nich Deine Frage, aber ...
habe ich eine kleine Batch zur Sicherung eines Userprofils, die wir per Remote lokal auf dem User-PC ausführen können geschrieben, sprich Nutzerdaten kopieren, C:\Users\Userx löschen, restore.bat im Backupverzeichnis erstellen, mit der nach den notwendigen Änderungen die Daten wiederhergestellt werden können und Selbstlöschung zum Abschluss.
Klassische Roaming Pofiles sind nichst für Euch?Jetzt möchte ich allerdings auch, dass gleichzeitig der Registrierungsschlüssel des Nutzers mit gelöscht wird, damit beim Neustart des Rechners die per Richtlinien gesetzten User Policys (die häufiger mal eine Fehlerquelle sind) neu gezogen werden.
User Policies werden niemals beim Neustart eines Computers "gezogen". Du meinst sich "bei nächster Anmeldung"?Aber auch hier:
- Im Zusammenhang mit Roaming Profiles und der GPo zum Löschen der lokalen Kopie des Profiles bei Abmeldung könntest Du das Löschen der Registry-Einträge auch erschlagen.
- Das erneute Anwenden von GPO - auch wenn diese sich nicht geändert haben - kann man ganz einfach mit "gpupdate /force" erzwingen.
E.
wir nutzen bereits Roaming Profiles die per Smartcard mitgenommen werden
Darin sind allerdings nur die absoluten Basics festgelegt wie bestellte Software, Policies usw.
Error! Hier verwechselst Du garantiert etwas. Oder meinst Du etwa "verbindliche Profile"?Darin sind allerdings nur die absoluten Basics festgelegt wie bestellte Software, Policies usw.
Viele User nutzen zum sichern ihrer Daten leider auch nicht das bereitgestellte Netzlaufwerk sondern "Eigene Dokumente" u.ä.
Dafür gibt es dann ja die Ordnerumleitung per GPO.Nun treten in letzter Zeit allerdings oft Fehler mit neu bestellter Software auf, die auf fehlende/falsch gesetzte lokale Rechte zurückzuführen sind.
Da ich im 2nd Level Support tätig bin und wir gerade einen globalen Rollout anschieben, habe ich keine Zeit, mich jedes Mal auf individuelle Fehlersuche zu begeben. Aktuell lassen sich 99,9% dieser Fehler durch einen Profilreset beheben, daher auch die Batch zum Backup. Ich möchte mir einfach das manuelle Suchen per regedit ersparen und in die Batch implementieren.
Da ich im 2nd Level Support tätig bin und wir gerade einen globalen Rollout anschieben, habe ich keine Zeit, mich jedes Mal auf individuelle Fehlersuche zu begeben. Aktuell lassen sich 99,9% dieser Fehler durch einen Profilreset beheben, daher auch die Batch zum Backup. Ich möchte mir einfach das manuelle Suchen per regedit ersparen und in die Batch implementieren.
Ich weiß, das ist nicht sonderlich elegant, aber momentan ziemlich effizient.
Roaming Profiles + Löschen der lokalen Kopien bei Abmeldung + VSS auf dem Servervolume, wo die Roaming Profiles gespeichert sindWenn ein Profil Ärger macht:
- Benutzer abmelden
- VSS auf dem Server anstossen oder darauf verzichten, wenn die letzte zeitgesteuerte VSS-Kopie ausreichend ist
- Profil auf dem Server löschen
- Benutzer anmelden --> hat jetzt wieder ein frischen Profil
- bei Benutzerabmeldung wird das Roaming Profile wieder auf dem Server kopiert
- sollte das alte Profil nochmal benötigt werden, dann ist es eine Weile noch im VSS --> könnte man per Script auf dem Server sichern
Wieso? Du hast doch als 2nd Level sicher auch Zugriff auf das Roaming Profile, denn sonst könntest Du doch dem Benutzer kein neues Profil verschaffen?
Falls ja, dann kannst Du das Profil auch klassisch vom Server kopieren. Oder einfach nur den Pfad umbennen. Bei nächster Anmeldung des Benutzers wird dieser sofort wieder erstellt.
Und wie gesagt: Ordnerumleitungen sind Dein Freund, wenn Du das Benutzerprofil schlank halten und verhindern willst, dass Benutzerdaten durch Löschen des Profiles verloren gehen könnten.
(Wohlgemerkt: Alles immer im Rahmen der Idee mit dem Roaming Profiles und dem löschen der lokalen Kopien bei Abmeldung.)
Falls ja, dann kannst Du das Profil auch klassisch vom Server kopieren. Oder einfach nur den Pfad umbennen. Bei nächster Anmeldung des Benutzers wird dieser sofort wieder erstellt.
Und wie gesagt: Ordnerumleitungen sind Dein Freund, wenn Du das Benutzerprofil schlank halten und verhindern willst, dass Benutzerdaten durch Löschen des Profiles verloren gehen könnten.
(Wohlgemerkt: Alles immer im Rahmen der Idee mit dem Roaming Profiles und dem löschen der lokalen Kopien bei Abmeldung.)

Powershell:
Batch
Gruß jodel32
$user = Read-Host 'User eingeben'
gci "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\ProfileList" | ?{$_.GetValue('ProfileImagePath') -eq "C:\Users\$user"} | select -Expand Name
@echo off & setlocal
set /p user=Usertag eingeben:
set REGPATH=
for /f "skip=1 delims=" %%a in ('reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList" /d /s /f "C:\Users\%user%"') do (
echo %%a| findstr /ic:"HKEY_LOCAL_MACHINE" >nul && (if not defined REGPATH set "REGPATH=%%a")
)
echo %REGPATH%

de rien mon ami 