cced-de
Goto Top

Batch - Die ersten 3 Zeichen einer bestimmten Variablen oder einer TXT Datei auslesen

Hallo liebe Admins und Programmierer sowie alle anderen Wissenden face-smile
Ich bin ziemlich neu hier und habe ein Problem.

Ich brauche ein script, mit dem ich die ersten 3 Zeichen aus einer Variablen auslesen und in eine neue Variable schreiben kann.

Beispiel:

FOR /F "eol=;" %%i in ('find "07=" SConfig.ini') do set Quelle=%%i auslesen.
%Quelle% beinhaltet dann D:\inetpub\vhosts\xyz.de\subdomains\ort\httpdocs\

Ich benötige aber in der weiterführenden Verarbeitung das angegebene Laufwerk ohne Pfad also nur D:\
Wie lese ich diese 3 Zeichen aus und schreibe sie in die neue Variable %Drive% ?

Schonmal vielen Dank für eure Mühe!!
LG CCED

Content-Key: 99675

Url: https://administrator.de/contentid/99675

Printed on: April 18, 2024 at 21:04 o'clock

Member: bastla
bastla Oct 19, 2008 at 19:58:22 (UTC)
Goto Top
Hallo cced-de und willkommen im Forum!

Du kannst zwar die ersten 3 Zeichen einer Variablen mit
set "Drive=%Quelle:~,3%"
einer neuen Variablen zuweisen, was Du aber vorhast solltest Du besser so lösen:
FOR /F "eol=; delims=" %%i in ('find "07=" SConfig.ini') do "set Drive=%%~di"
Näheres dazu: "for /?" (ziemlich am Ende des, zugegeben, nicht ganz kurzen Textes)

Wenn Du tatsächlich auch den "\" dabei haben willst (ich bevorzuge es, Anführungszeichen und "\" nach Bedarf zu setzen und daher grundsätzlich nicht in Variable aufzunehmen), dann eben:
FOR /F "eol=; delims=" %%i in ('find "07=" SConfig.ini') do "set Drive=%%~di\"

Grüße
bastla
Member: cced-de
cced-de Oct 20, 2008 at 06:35:01 (UTC)
Goto Top
Wow.. das ging schnell.
Danke für die Prompte Antwort !
Die Nächste Frage steht auch schon im Raum face-smile

LG
CCED
Member: xachsewag
xachsewag Oct 21, 2008 at 11:48:56 (UTC)
Goto Top
Ich hätte da jetzt auch noch eine Frage zu dem Thema:

Ich will aus einer TXT File Zeile für Zeile auslesen und jede Zeile in eine Variable speichern.

TXT File:
h640 v480 b32 f60
h640 v480 b16 f75
h640 v480 b32 f60
h640 v480 b16 f75

Jetzt soll meine Batch die erste Zeile nehmen und in die Variable %res% schreiben. Danach führe ich etwas damit aus und dann soll die zweite Zeile in %res% geschreiben werden.

FOR /f %%f IN (resolutions.txt) DO echo %%f
soweit bin ich schonmal gekommen, aber er liest mir nur h640 aus und lässt den restlichen teil der Zeile weg.

set /a res=FOR /f %%f IN (resolutions.txt) DO echo %%f
so könnte ich das ja dann in %res% schreiben oder?

Kann mir da jemand helfen?
Danke schonmal
Member: bastla
bastla Oct 21, 2008 at 13:24:21 (UTC)
Goto Top
Hallo xachsewag!

Etwa so:
@echo off & setlocal
FOR /f "delims=" %%f IN (resolutions.txt) DO call :ProcessLine "%%f"  
goto :eof

:ProcessLine
echo Die Zeile: %~1
set "res=%~1"  
echo Variableninhalt: %res%
goto :eof
Mit "delims=" sorgst Du dafür, dass die Zeile nicht an den Leerzeichen getrennt werden (diese sind, zusammen mit TAB, die Standardtrennzeichen in einer "for"-Schleife).

Im Unterprogramm ":ProcessLine" kannst Du die entsprechenden Verarbeitungsschritte vornehmen, wobei die Zeile als %1 (in Anführungszeichen, damit wiederum nicht an den Leerzeichen getrennt wird) bzw als %~1 (ohne Anführungszeichen) zur Verfügung steht.

Grüße
bastla
Member: juergi69
juergi69 Dec 15, 2008 at 12:57:42 (UTC)
Goto Top
Hallo, ich hätte dazu auch eine Frage,
möchte mir ausnachname und vorname einen loginnamen basteln.
z.b test dummy d.test
dazu bräuchte ich das erste zeichen vom vornamen (bei mir %%j)
ich scheitere an dem Set "Rk-Loginname=%%%j:~,1%"
das input file schaut so aus:
Nachname;Vorname;Homeserver;Anmeldeskript;ServerProfil;Terminalprofil;Nebenstelle
Test;Dummy;Lvsfile01;login.bat;Ja;Ja;10888
Die Batch:
@echo Off & setlocal EnableDelayedExpansion

cls
Set WorkDir=H:\NewUser
Set InputFile=newuser.txt
Set OutputDir=Output
Set TempDir=Temp

Set Def_Gruppe=Domänen_Benutzer

If Not Exist %WorkDir%\Output Md %OutputDir%
If Not Exist %WorkDir%\%TempDir% Md %TempDir%

for /f "delims=; tokens=1,2,3,4,5,6,7 skip=1" %%i in (%WorkDir%\%InputFile%) Do (
Echo Benutzerdaten:
Echo Nachname=%%i
Echo Vorname=%%j
Set "Rk-Loginname=%%%j:~,1%"
Echo Rk-Loginname=%Rk-Loginname%
Echo Anzeigename=%%i %%j
Echo E-Mail=%%j.%%i@st.roteskreuz.at
Echo Gruppen=%Def_Gruppe%
Echo Homedrive=H:
Echo Homeverz=\\%%k\users\%Rk-Loginname%
Echo Passwort=zufall
Echo ServerProfile=%%m
Echo Terminalserverprofile=%%n
Echo Loginscript=%%l
Echo Nebenstelle=%%o
Echo.


Echo Set RK-Nachname=%%i >%Workdir%\%OutPutDir%\%%i.bat
Echo Set RK-Vorname=%%j >>%Workdir%\%OutPutDir%\%%i.bat

)

danke
jürgen
Member: bastla
bastla Dec 15, 2008 at 13:42:39 (UTC)
Goto Top
Hallo juergi69 und willkommen im Forum!

Du hast zwar "DelayedExpansion" eingeschaltet, verwendest sie aber nicht - dies und die Berücksichtigung der Tatsache, dass aus Laufvariablen der "for"-Schleifen keine Teilstrings gebildet werden können, sollte zu etwa folgendem (ungetesteten) Ansatz führen:
@Echo Off & setlocal EnableDelayedExpansion

cls
Set WorkDir=H:\NewUser
Set InputFile=newuser.txt
Set OutputDir=Output
Set TempDir=Temp

Set Def_Gruppe=Domänen_Benutzer

If Not Exist %WorkDir%\Output Md %OutputDir%
If Not Exist %WorkDir%\%TempDir% Md %TempDir%

for /f "delims=; tokens=1,2,3,4,5,6,7 skip=1" %%i in (%WorkDir%\%InputFile%) Do (  
    Echo Benutzerdaten:
    Echo Nachname=%%i
    Echo Vorname=%%j
    Set "Vorname=%%j"  
    Set "Rk-Loginname=!Vorname:~,1!%%i"  
    Echo Rk-Loginname=!Rk-Loginname!
    Echo Anzeigename=%%i %%j
    Echo E-Mail=%%j.%%i@st.roteskreuz.at
    Echo Gruppen=%Def_Gruppe%
    Echo Homedrive=H:
    Echo Homeverz=\\%%k\users\!Rk-Loginname!
    Echo Passwort=zufall
    Echo ServerProfile=%%m
    Echo Terminalserverprofile=%%n
    Echo Loginscript=%%l
    Echo Nebenstelle=%%o
    Echo.

    Echo Set RK-Nachname=%%i >%Workdir%\%OutPutDir%\%%i.bat
    Echo Set RK-Vorname=%%j >>%Workdir%\%OutPutDir%\%%i.bat
)
Grüße
bastla
Member: juergi69
juergi69 Dec 15, 2008 at 14:12:09 (UTC)
Goto Top
hallo bastla,
danke für die schnelle antwort!
die EnableDelayedExpansion brauch ich glaube ich für die folgende if abfrage:
hab dabei noch ein kleines problem

Echo Nachname=%%i
Echo Vorname=%%j
Set "Vorname=%%j"
Set "Rk-Loginname=!Vorname:~,1!.%%i"
Echo Rk-Loginname=!Rk-Loginname!
net user !Rk-Loginname! >nul
If !ERRORLEVEL! EQU 0 Echo Error User !Rk-Loginname! bereits vorhanden!!!
Echo Anzeigename=%%i %%j
das funktionert, ich möchte nun aus der for schleife raus, wenn der benutzer vorhanden ist

ziel des ganzen ist es, wie du sicher schon bemerkt hast, user mittels dsadd anzulegen,
z.b. Echo dsadd -samid !Rk-Loginname! -fn %%j -ln %%i -pwd zufall usw >>new_user.bat
nachdem die new_user.bat durch ist
noch ein zufälliges passwort setzen mit z.b. net user !Rk-Loginname! /random
homeverz anlegen + acl usw....

noch ne frage
was ist der unterschied zw. %OutputDir% und !Rk-Loginname! (einmal% einmal!)

lg
jürgen
Member: bastla
bastla Dec 15, 2008 at 14:33:52 (UTC)
Goto Top
Hallo juergi69!

die EnableDelayedExpansion brauch ich glaube ich für die folgende if abfrage:
Dafür eigentlich nicht (aber für die Bildung des Loginnamens face-wink) - Du kannst auch folgende Varaiante verwenden:
for /f "delims=; tokens=1,2,3,4,5,6,7 skip=1" %%i in (%WorkDir%\%InputFile%) Do (
    net user %%i >nul 2^>^&1 && (
        echo Error User !Rk-Loginname! bereits vorhanden
    ) || (
        echo Echo Anzeigename=%%i %%j
        echo ...
    )
)
Noch als Anmerkung: Wenn Du "delayedExpansion" verwendest, wird "!" als Variablenbegrenzer interpretiert und "verschwindet" daher (und bei paarweiser Verwendung auch alles dazwischen, wenn es nicht zufälliger Weise der Name einer existierenden Variable ist - es ist daher jedes einzelne Rufzeichen am Ende Deiner Fehlermeldung vergebene Liebesmüh ... face-wink
noch ne frage
was ist der unterschied zw. %OutputDir% und !Rk-Loginname! (einmal% einmal!)
Um innerhalb eines Blockes (Schleife, Klammern) in Batch veränderte Variableninhalte sofort ausgeben zu können, muss "delayedExpansion" erfolgen - und dann wird eben (siehe oben) anstelle von "%" das Rufzeichen als Variablenbegrenzer verwendet. %OutputDir% hast Du schon vor der Schleife festgelegt und es wird in der Schleife nicht verändert - es genügt daher die "Auflösung" (das Auslesen des Wertes) zu Beginn der Schleife (und muss nicht "delayed" vorgenommen werden).

Grüße
bastla
Member: juergi69
juergi69 Dec 16, 2008 at 09:20:59 (UTC)
Goto Top
Hallo,
hab mir den Beitrag "Batch XP Zwei echos in einer Zeile in Datei umleiten" jetzt schon zig mal durchgelesen, ich bekomms aber nicht hin:

Echo If Not Exist \\%%k\user\!Rk-Loginname! Md \\%%k\user\!Rk-Loginname!>>%OutPutDir%\%OutputFile%

Echo Echo j|CACLS \\%%k\user\!Rk-Loginname! /G Domänen-Admins:F !Rk-Loginname!:C >>%OutPutDir%\%OutputFile%

Echo Das Passwort für !Rk-Loginname! ist !Def_Passwort! >>%OutPutDir%\%Passwd_File%

Zeile 1 und 3 klappen, Zeile 2 geht nicht, habs auf alle möglichen Arten versucht.
Member: bastla
bastla Dec 16, 2008 at 09:34:57 (UTC)
Goto Top
Hallo juergi69!

Gehört zwar eigentlich nicht mehr in diesen Thread, aber gut ...

Wenn Du bestimmte Sonderzeichen in Batch nur ganz gewöhnlich ausgeben willst, musst Du diese mit einem vorangestellten "^" maskieren. Außerdem wird aus "%%" in Batch ein "%". Demzufolge:
Echo Echo j^|CACLS \\%%%%k\user\!Rk-Loginname! /G Domänen-Admins:F !Rk-Loginname!:C >>%OutPutDir%\%OutputFile%
Grüße
bastla
Member: PinkFLuffyUnicorn
PinkFLuffyUnicorn Apr 29, 2016 at 09:57:08 (UTC)
Goto Top
Hi bastla, ich habe ein ähnliches vorhaben, ich will einen satz vom benutzer mit
 set /p eingabe="Eingabe: "  
eingeben lassen. der kann so lange sein wie er will.
nun kann ich ja mit
set "EingabeNeu=%eingabe1:~,5%  
die ersten 5 buchstaben auslesen.

also als beispiel
%eingabe1% = Hallo ich heise PFU
%EingabeNeu% = Hallo

wie kann ich jetzt die ersten 5 buchstaben aus der variabel %eingabe1% löschen?
Member: Biber
Biber Apr 29, 2016 at 11:18:02 (UTC)
Goto Top
Moin PinkFLuffyUnicorn,

ich weiss ja nicht, ob es dafür nötig war, einen seit 6 Jahren erledigten Beitrag zu reanimieren.

Beispiel anm CMD-Prompt:
C:\Users\Biber>set /p eingabe="Eingabe: "
Eingabe: hallo ich gebe irgendeinen langen String ein

C:\Users\Biber>set ei
eingabe=hallo ich gebe irgendeinen langen String ein

C:\Users\Biber>set "eingabe=%eingabe:~5%"

C:\Users\Biber>set ei
eingabe= ich gebe irgendeinen langen String ein


Grüße
Biber
Member: bastla
bastla Apr 29, 2016 updated at 14:36:56 (UTC)
Goto Top
... wobei ja auch heute noch mit
set /?
(besonders interessant wird's in diesem Zusammenhang nach
Das Ersetzen von Umgebungsvariablen wurde folgendermaßen erweitert:
) die Online-Hilfe zur Verfügung stehen sollte ...

Grüße
bastla
Member: PinkFLuffyUnicorn
PinkFLuffyUnicorn Apr 29, 2016 at 16:20:56 (UTC)
Goto Top
wollte halt keinen neuen thread öffnen :D
aber thx, dein systempfad ist nur da wegen @echo off, den kann ich einfach weghauen oder?