amontillado
Goto Top

Variablen in Datei schreiben, auslesen und verarbeiten, inkl. Struktur-Problem

Ich weiß, sowas wird nicht gern gesehen, jedoch...: Dringend!

Hallo zusammen,

ich bin gerade dabei ein Script in Batch zu schreiben, für eine gewisse Aufgabe im Programm fehlt es mir aber an Ideen:

:config
title=Startmen-Konfiguration
echo.
set /p server=Server angeben! (Z.B.: \\sstrf028\e010_hbr$\)
set /p ordner=Ordner angeben! (Z.B.: Startmen Raum 249)
dir %server% /s /b | find "%ordner%" | find /v "%ordner%\" > start.cfg  
echo %ordner% >> start.cfg
attrib +s +h start.cfg
goto eof

Man gibt den Server sowie Ordnernamen an, der Ordner wird gesucht und der Pfad in eine Konfigurationsdatei geschrieben. Wenn der Ordner allerdings gar nicht erst gefunden wird, soll ein Fehler ausgegeben werden. Wie stelle ich das denn am Besten an?
Wie das mit Errorleveln hier funktionieren könnte weiß ich nicht...

Gute Nacht zusammen,
h


edit:
entschuldigt das dringend, ist es jedoch leider ;(

Content-Key: 129919

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

Printed on: April 24, 2024 at 07:04 o'clock

Member: bastla
bastla Nov 20, 2009 at 23:13:48 (UTC)
Goto Top
Hallo amortillado und willkommen im Forum!

Wenn Deine Zeile 6 für Dich (auch ohne "/i") funktioniert, könntest Du es so versuchen:
:config
title=Startmen-Konfiguration
echo.
set /p server=Server angeben! (Z.B.: \\sstrf028\e010_hbr$\)
set /p ordner=Ordner angeben! (Z.B.: Startmen Raum 249)

set "Pfad="  
for /f "delims=" %%i in ('dir %Server% /s /b 2^>nul^|find "%Ordner%"^|find /v "%Ordner%\"') do set "Pfad=%%i"  
if defined Pfad (
    >start.cfg  echo %Pfad%
    >>start.cfg echo %Ordner%
    attrib +s +h start.cfg
) else (
    echo %ordner% nicht gefunden!
)
goto :eof
Grüße
bastla
Member: amontillado
amontillado Nov 30, 2009 at 16:50:12 (UTC)
Goto Top
Hallo und vielen Dank für die schnelle Hilfe!

Deine Lösung funktioniert super, allerdings habe ich noch ein paar Fragen dazu:
  • Was bedeutet hier [ dir %Server% /s /b 2^>nul^ ] das ^ und wieso gibst du es in "nul" aus?
  • Welche Funktion hat das ' Zeichen [ find /v "%Ordner%\"' ]


Und dann habe ich noch eine anderes Thema, womit ich nicht weiter weiß:
Ich will ein Batchprogramm schreiben, das beim Ausführen bestimmte Netzlaufwerke verbindet. Die "Werte" der Netzlaufwerke sollen aus einer Konfigurationsdatei ausgelesen werden. Ist diese Datei gar nicht erst vorhanden, wird nach der Anzahl der Laufwerke sowie deren Kenndaten gefragt, woraufhin diese Daten in die Konfigurationsdatei geschrieben werden. Dabei ist es wichtig, dass die Informationen beim Abarbeiten zeilenweise aus der Konfig ausgelesen werden, da in dieser Datei auch noch andere Werte gespeichert sind. Darüber hinaus soll auch die Konfig extern verändert werden können, ohne dass damit irgendwelche Fehler auftreten.
...pff, das wird was ;)

Am besten ich informiere kurz über das gesamte Programm, denn die Laufwerksgeschichte ist nur Teil eines größeren Projekts. Es soll ein Programm geschrieben werden, das beim Autostart einen Ordner aus dem Netzwerk in den Startmenü-Ordner des Benutzers kopiert. Dabei soll dieses Programm für beliebige "Admins" anwendbar sein, d.h. alle Werte sind variabel und müssen jedes Mal aus der Konfigurationsdatei ausgelesen werden, mit dieser funktioniert soweit auch alles gut.
Hier das Programm:
@echo off
if exist start.cfg (goto start) else (goto config)

:config
title=Startmen-Konfiguration
cls
echo.
set /p server=Server angeben! (Z.B.: \\sstrf028\e010_hbr$\)
set /p ordner=Ordner angeben! (Z.B.: Startmen Raum 249)
for /f "delims=" %%i in ('dir %server% /s /b 2^>nul^|find "%ordner%"^|find /v "%ordner%\"') do set "pfad=%%i  
echo.
if defined pfad (>start.cfg echo %pfad%
	>>start.cfg echo %ordner%
	attrib +s +h start.cfg
	echo Konfiguration erfolgreich!) else (echo "%ordner%" konnte nicht gefunden werden!  
	echo Bitte berprfen Sie ihre Eingabe. & echo.
	pause
	call :config)
pause
goto :eof

:start
title=Aktualisierung des Starmens
for /f "delims=" %%a in ('findstr "\Startmen" start.cfg') do set pfad=%%a  
for /f "delims=" %%b in ('findstr "Startmen" start.cfg') do set ordner=%%b  
for /f "delims=" %%c in ('findstr "Debug" start.cfg') do set debug=%%c  
if exist "%pfad%" (goto upgrade) else (goto debug)  

:upgrade
rd /q /s "%userprofile%\Startmen\%ordner%"  
xcopy /e /r /i /y /q "%pfad%" "%userprofile%\Startmen\%ordner%"  

:debug
if %debug%==Debug1 (goto ausgabe) else (goto :eof)

:ausgabe
cls
echo.
echo Inhalt der start.cfg:
type start.cfg & echo.
echo.
echo Werte der eingelesenen Variablen:
echo Startmen-Pfad:	"%pfad%"  
echo Ordnername:	"%ordner%"  
echo ______________
echo.
if exist "%pfad%" (echo Der Ordner "%ordner%" ist erreichbar) else (echo Der Ordner "%ordner%" ist nicht erreichbar)  
echo.
pause

Nun wurde mir heute mitgeteilt, dass am Besten die Konfigurationsdatei auf dem Server liegen soll und jeder User am Terminal seine Werte aus dieser auslesen soll. Okay, soweit kein Problem dachte ich mir, dann gibt es eben eine Administrator-Version zur Erstellung der Konfigurationsdatei sowie eine Benutzer-Version, welche die Werte aus der Konfig holt. Aber wie wird am Besten eine Benutzer-Version erstellt, direkt über den Admin und die Konfigdatei? Ich bin ehrlich gesagt etwas überfordert und weiß nicht ganz welches letztendlich die einfachste und "beste" Lösung wäre.

Könnt ihr mir weiterhelfen?
Member: bastla
bastla Nov 30, 2009 at 18:37:36 (UTC)
Goto Top
Hallo amontillado!

Vorweg ein Hinweis: Auch wenn Du den Titel dem erweiterten Inhalt angepasst hast, wäre es sinnvoller, einen neuen Thread zu erstellen - damit erreichst Du mehr potenzielle Helfer ...
Zu Deinen Fragen:
* Was bedeutet hier [ dir %Server% /s /b 2^>nul^ ] das ^ und wieso gibst du es in "nul" aus?
Da innerhalb der "for /f"-Schleife temporär eine neue CMD-Instanz aufgerufen wird, müssen einige Sonderzeichen "maskiert" werden, damit sie (noch) nicht als Steuerzeichen interpretiert, sondern unverändert "weitergereicht" werden.

Nach "nul" umgeleitet wird nur (der Ordnung halber) die auf Kanal 2 (STDERR) ausgegebene Fehlermeldung, wenn %Server% nicht gefunden werden konnte (diese Meldung soll ja auf keinen Fall weiterverarbeitet werden).

* Welche Funktion hat das ' Zeichen [ find /v "%Ordner%\"' ]
Damit wird das am Beginn des Befehlsblocks in der Klammer gesetzte andere ' geschlossen - die zwischen diesen Zeichen stehenden Anweisungen werden in der schon beschriebenen weiteren CMD-Instanz ausgeführt und deren Ergebnis wird zeilenweise von der "for /f"-Schleife übernommen.

Grüße
bastla
Member: amontillado
amontillado Nov 30, 2009 at 18:42:47 (UTC)
Goto Top
Danke für deine ausführliche Erläuterung! Ich werde für meine (neue) Frage einen anderen Thread erstellen.

Mit besten Grüßen