CMD-Batch, Stringzerlegung, String in Token teilen und letztes Token bei unbekannter Anzahl von Token finden
Guten Morgen allseits,
ich hänge irgendwie fest und wäre für ein paar Ideen dankbar. Sorry vorweg. Es wird vermutlich keine Live-Diskusion. Ich sitze hier auf einer EDGE-Leitung in UTC+7. Gut das ich kein Administrator bin.
Meine Frage basiert auf der extrem komfortablen Ausgabe von "icacls.exe". Ich möchte den Inhalt der Ausgabe nach logischen Token trennen. Die Verarbeitung des Strings ist mir im Original nicht eindeutig genug.
USER:[GroupLast]
2. [Group1]; kann existieren
3. [Group2] ... [Group*]; kann existieren
4. [GroupLast]; existiert immer (als Voraussetzung)
- Die Pfadausgabe wird eleminiert durch Variablenmanipulation
- Variablenersetzung mit "][" fuehrt nicht zum Ziel
- Ausgabe von *:*"[GroupLast]" erfolgt immer und an letzter Stelle
- Anzahl von [Group*] variiert
- Inhalt von [Group*] ist variabel
- Inhalt von [GroupLast] ist variabel
- "tokens=*" liefert Reststring (Rest nach Leerzeichenorgie)
- "delims=:" liefert originale Tokens
- "[GroupLast]" soll separiert werden
Es geht ausschliesslich um das Separieren von "[GroupLast]" zur Weiterverarbeitung.
Die Rechte sollen von der Rechteverteilung getrennt werden.
Hoffentlich habe ich alle Prämissen genannt und es kostet nicht zu viele Nerven.
mfg Viewfinder
ich hänge irgendwie fest und wäre für ein paar Ideen dankbar. Sorry vorweg. Es wird vermutlich keine Live-Diskusion. Ich sitze hier auf einer EDGE-Leitung in UTC+7. Gut das ich kein Administrator bin.
Meine Frage basiert auf der extrem komfortablen Ausgabe von "icacls.exe". Ich möchte den Inhalt der Ausgabe nach logischen Token trennen. Die Verarbeitung des Strings ist mir im Original nicht eindeutig genug.
Ziel
Zerlegung der Ausgabe "icacls "Objekt"" in Tokens mit logisch zusammen hängendem Inhalt. Das letzte Token bildet die Rechte zum Objekt ab und wird in Folge "[GroupLast]" genannt. Es soll leicht erkennbar und moeglichst performant getrennt werden. Grundlage ist die Ausgabe von "icacls.exe". Loesung muss auf CMD.exe basieren.Stringbeispiele
F:\testbasis\script-local\exembles USER:[Group1][Group2][Group3][Group4][GroupLast]USER:[GroupLast]
Logisch abgeschlossene Komponenten
1. USER: existiert immer (als Voraussetzung)2. [Group1]; kann existieren
3. [Group2] ... [Group*]; kann existieren
4. [GroupLast]; existiert immer (als Voraussetzung)
Anmerkung
- Ueberfluessiges MS-Gelaber wird gefiltert- Die Pfadausgabe wird eleminiert durch Variablenmanipulation
- Variablenersetzung mit "][" fuehrt nicht zum Ziel
- Ausgabe von *:*"[GroupLast]" erfolgt immer und an letzter Stelle
- Anzahl von [Group*] variiert
- Inhalt von [Group*] ist variabel
- Inhalt von [GroupLast] ist variabel
- "tokens=*" liefert Reststring (Rest nach Leerzeichenorgie)
- "delims=:" liefert originale Tokens
- "[GroupLast]" soll separiert werden
Es geht ausschliesslich um das Separieren von "[GroupLast]" zur Weiterverarbeitung.
Die Rechte sollen von der Rechteverteilung getrennt werden.
Loesungsansatz
@echo off
setlocal
pushd %~dp0
setlocal enabledelayedexpansion
set "object=F:\Public\Projects\WWW\testbasis\script-local\exembles"
FOR /F "tokens=* useback" %%B in (`icacls "%object%"^|findstr /R /C:":(.*.)"`) DO (
set B=%%B
set B=!B:%object% =!
set B=!B:^(=[!
set B=!B:^)=]!
echo Ausgabe: !B!
echo Gruetze ist jetzt Pudding mit Nuessen und Rosinen.
echo Wunsch: Nuesse links und Rosinen rechts raus.
For /F "tokens=1-2 delims=:" %%C in ('echo !B!') DO (
echo Pudding %%C
echo Nuesse und Rosinen %%D
echo WIE weiter oder anderst^?
))
setlocal disabledelayedexpansion
popd
endlocal
goto :eof
Hoffentlich habe ich alle Prämissen genannt und es kostet nicht zu viele Nerven.
mfg Viewfinder
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 195899
Url: https://administrator.de/contentid/195899
Ausgedruckt am: 24.11.2024 um 19:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo Viewfinder!
Soferne ich das richtig intrepretiere, soll doch aus der von "
der User/die Gruppe aus der letzten Zeile ermittelt werden:
Wenn ich wirklich aus dem String
nur "GroupLast" erhalten wollte, würde ich das so versuchen (unter der Voraussetzung, dass "GroupLast" keine Leerzeichen enthält):
Grüße
bastla
Soferne ich das richtig intrepretiere, soll doch aus der von "
icacls
" erzeugten User-/Gruppenliste - Beispiel am Prompt:C:\Users\Admin>icacls C:\Windows
C:\Windows NT SERVICE\TrustedInstaller:(F)
NT SERVICE\TrustedInstaller:(CI)(IO)(F)
NT-AUTORITÄT\SYSTEM:(M)
NT-AUTORITÄT\SYSTEM:(OI)(CI)(IO)(F)
VORDEFINIERT\Administratoren:(M)
VORDEFINIERT\Administratoren:(OI)(CI)(IO)(F)
VORDEFINIERT\Benutzer:(RX)
VORDEFINIERT\Benutzer:(OI)(CI)(IO)(GR,GE)
ERSTELLER-BESITZER:(OI)(CI)(IO)(F)
1 Dateien erfolgreich verarbeitet, bei 0 Dateien ist ein Verarbeitungsfehler auf
getreten.
C:\Users\Admin>
for /F "delims=: " %%B in ('icacls "%object%"^|findstr /R /C:":(.*.)"') do set "GroupLast=%%B"
F:\testbasis\script-local\exembles USER:[Group1][Group2][Group3][Group4][GroupLast]
set "Zeile=F:\testbasis\script-local\exembles USER:[Group1][Group2][Group3][Group4][GroupLast]"
set "Zeile=%Zeile:USER:=%"
for %%i in (%Zeile:[= %) do for /f "delims=]" %%B in ("%i") do set "GroupLast=%%B"
bastla