fabian-haas
Goto Top

Zeilen aus Datei auf einem Netzwerkspeicher einlesen und NUMMERIERT auflisten in BATCH

Hallo,

Ich möchte mithilfe einer Batchdatei verschiedene Netzwerkfreigaben eines Benutzers nummeriert auflisten. Diese sind in einer Datei auf dem gleichen Server abgespeichert, worauf das Programm Zugriff hat, und die eingelesen wird und dann eben nummeriert aufgelistet werden sollte. Daraufhin darf der Benutzer entscheiden welche er öffnen will und die jeweilige Netzwerk Freigabe wird dann im Explorer geöffnet. Das ganze habe ich so versucht:

:: Sprungmarke, zu der nach dem Auswählen und Öffnen einer Freigabe zurückgekehrt wird
   :shares

:: legt den Titel als "Ihre Ordner" fest 
   title="Ihre Ordner"  

:: löscht den Bildschirminhalt 
   cls

:: gestaltet das Layout und listet die Freigaben "home" und "share" auf 
   echo.
   echo           -------------------
   echo           -                 -
   echo           -   Ihre Ordner   -
   echo           -                 -
   echo           -------------------
   echo.
   echo   1 --- Eigener Ordner
   echo.
   echo   2 --- Gemeinsamer Ordner
   echo.

:: liest die Datei des Benutzers zeilenweise ein und listet dessen Freigaben auf
   echo 2 > "%USERPROFILE%\NLTEMP.txt"  
   for /f %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do (
       set /p NLTEMP=<"%USERPROFILE%\NLTEMP.txt"  
       set /a NL=%NLTEMP%+1
       echo   %NL% --- %%i Ordner
       echo.
       echo %NL% > "%USERPROFILE%\NLTEMP.txt"  
       )

:: legt die zu öffnende Freigabe fest
   echo Bitte geben Sie die Nummer des zu oeffnenden Ordners an
   echo und bestaetigen Sie diese mit ENTER:
   echo.
   set /p NS=
   if "%NS%" == "1" goto home  
   if "%NS%" == "2" goto share  
   set /a NSTEMP=%NS%-3
   for /f "usebackq skip=%NSTEMP%" %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do (  
       echo %%i> "%USERPROFILE%\share.txt"  
       )

:: öffnet die ausgewählte Freigabe (ausgenommen "home" und "share") und kehrt zur Sprungmarke "shares" zurück 
   set /p SHARE=<"%USERPROFILE%\share.txt"  
   start explorer.exe "\\%SERVERIP%\%SHARE%"  
   goto shares

:: Sprungmarke, um das Homeverzeichnis des Benutzers zu öffnen und dann zur Sprungmarke "shares" zurückzukehren  
   :home
   start explorer.exe "\\%SERVERIP%\%USERNAME%"  
   goto shares

:: Sprungmarke, um die Freigabe "share" zu öffnen und dann zur Sprungmarke "shares" zurückzukehren  
   :share
   start explorer.exe "\\%SERVERIP%\share"  
   goto shares

:: kehrt zur Sprungmarke "shares" zurück 
   goto shares

Die ersten beiden Freigaben stehen dabei nicht in dieser Datei, da sie für jeden Benutzer existieren und in der Datei nur die individuellen Freigaben des Benutzers aufgelistet sind.


Dabei klappt alles super, jedoch werden außer der "1" und der "2" keine Nummern vor den aufgelisteten Freigaben angezeigt. Gibt der Benutzer aber die Nummer ein, die eigentlich dort stehen sollte öffnet das Programm auch die richtige Freigabe im Explorer.

Dementsprechend wäre meine Frage, wie die Auflistung klappen kann, liegt der Fehler vielleicht in der FOR-Schleife?

Vielen Dank im Voraus
Fabian Haas

Content-Key: 229219

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

Printed on: April 19, 2024 at 16:04 o'clock

Member: bastla
Solution bastla Feb 09, 2014, updated at Feb 10, 2014 at 23:44:05 (UTC)
Goto Top
Hallo Fabian-Haas und willkommen im Forum!

Wenn Du innerhalb einer Klammer Variablenwerte änderst, brauchst Du "delayedExpansion", um diese geänderten Werte gleich verwenden zu können - daher vorweg (noch vor der Sprungmarke ":shares")
setlocal enabledelayedexpansion
und dann
set /a NL=!NLTEMP!+1
echo !NL! --- %%i Ordner
echo.
echo !NL! > "%USERPROFILE%\NLTEMP.txt  
Das Zwischenspeichern des Zählers in einer Datei wäre übrigens nicht nötig - Du könntest das auch einfach so lösen:
set /a NL=2
for /f %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do (
    set /a NL+=1
    echo !NL! --- %%i Ordner
    echo.
)
Damit es auch mit der Eingabe 3 klappt, könntest Du noch den Auswahlteil etwa so ändern:
set /p NS=
if "%NS%" == "1" goto home  
if "%NS%" == "2" goto share  
set /a NSTEMP=%NS%-3
set "SHARE="  
for /f %%i in ('more +%NSTEMP% \\%SERVERIP%\shares\%USERNAME%.txt') do if not defined SHARE set "SHARE=%%i"  
Grüße
bastla

P.S.: "Code"-Blöcke müssen mit einem Ende-Tag </code> beendet werden ...
Member: Fabian-Haas
Fabian-Haas Feb 09, 2014 at 20:00:34 (UTC)
Goto Top
Hallo bastla,

erstmal vielen Dank für die schnelle Antwort.
Wenn ich jetzt weiterhin die Variable zwischenspeichere (der Gewohnheit halber und weil mir vorher gesagt wurde, dass das sonst nicht mit der FOR-Schleife funktionieren würde), muss der Code dann so aussehen:
   echo 2 > "%USERPROFILE%\NLTEMP.txt"  
   for /f %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do (
       set /p NLTEMP=<"%USERPROFILE%\NLTEMP.txt"  
       set /a NL=!NLTEMP!+1
       echo   !NL! --- %%i Ordner
       echo.
       echo !NL! > "%USERPROFILE%\NLTEMP.txt"  
       )
oder müsste ich nicht eigentlich ebenfalls die Variable "USERPROFILE" mit Ausrufezeichen umgeben?, also so:
   echo 2 > "%USERPROFILE%\NLTEMP.txt"  
   for /f %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do (
       set /p NLTEMP=<"!USERPROFILE!\NLTEMP.txt"  
       set /a NL=!NLTEMP!+1
       echo   !NL! --- %%i Ordner
       echo.
       echo !NL! > "%USERPROFILE%\NLTEMP.txt"  
       )

Schon mal danke
Fabian Haas
Member: Fabian-Haas
Fabian-Haas Feb 09, 2014 at 21:49:20 (UTC)
Goto Top
Okay ich habs verstanden, es geht ja nur um die variablen, die in Klammern GEÄNDERT werden. ;) Es hat also genau so geklappt, wie du es meintest.

Nochmals Danke
Fabian Haas
Member: Fabian-Haas
Fabian-Haas Feb 10, 2014 updated at 20:48:43 (UTC)
Goto Top
Jetzt tritt bei mir doch noch ein Problem auf leider :/. Ich habe die Hilfen so versucht umzusetzen, dass meine Batch-Datei jetzt so aussieht:
:: erlaubt Variablen in Klammern zu ändern
   setlocal enabledelayedexpansion

:: Sprungmarke, zu der nach dem Auswählen und Öffnen einer Freigabe zurückgekehrt wird
   :shares

:: legt den Titel als "Ihre Ordner" fest 
   title="Ihre Ordner"  

:: löscht den Bildschirminhalt 
   cls

:: gestaltet das Layout und listet die Freigaben "home" und "share" auf 
   echo.
   echo           -------------------
   echo           -                 -
   echo           -   Ihre Ordner   -
   echo           -                 -
   echo           -------------------
   echo.
   echo   1 --- Eigener Ordner
   echo.
   echo   2 --- Gemeinsamer Ordner
   echo.

:: liest die Datei des Benutzers zeilenweise ein und listet dessen Freigaben auf
   echo 2 > "%USERPROFILE%\NLTEMP.txt"  
   for /f "tokens=2 delims=:" %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do (  
       set /p NLTEMP=<"%USERPROFILE%\NLTEMP.txt"  
       set /a NL=!NLTEMP!+1
       echo   !NL! --- %%i Ordner
       echo.
       echo !NL! > "%USERPROFILE%\NLTEMP.txt"  
       )
       
:: legt die zu öffnende Freigabe fest
   echo Bitte geben Sie die Nummer des zu oeffnenden Ordners an
   echo und bestaetigen Sie diese mit ENTER:
   echo.
   set /p NS=
   if "%NS%" == "1" goto home  
   if "%NS%" == "2" goto share  
   set /a NSTEMP=%NS%-3
   if NOT %NSTEMP% == "0" (  
       for /f "usebackq skip=%NSTEMP% tokens=2 delims=:" %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do (  
           echo %%i> "%USERPROFILE%\share.txt"  
           goto openshare1
           )
       ) else (
         pause
         for /f %%i in ('more +%NSTEMP% \\%SERVERIP%\shares\%USERNAME%.txt') do (  
             set SHARE=""  
             if not defined SHARE set SHARE=%%i
             goto openshare2
             )
       )

:: öffnet die ausgewählte Freigabe (ausgenommen "home" und "share") und kehrt zur Sprungmarke "shares" zurück 
   :openshare1
   set /p SHARE=<"%USERPROFILE%\share.txt"  
   :openshare2
   start explorer.exe "\\%SERVERIP%\%SHARE%"  
   goto shares

:: Sprungmarke, um das Homeverzeichnis des Benutzers zu öffnen und dann zur Sprungmarke "shares" zurückzukehren  
   :home
   start explorer.exe "\\%SERVERIP%\%USERNAME%"  
   goto shares

:: Sprungmarke, um die Freigabe "share" zu öffnen und dann zur Sprungmarke "shares" zurückzukehren  
   :share
   start explorer.exe "\\%SERVERIP%\share"  
   goto shares

:: kehrt zur Sprungmarke "shares" zurück 
   goto shares
Dabei klappt das Aufrufen der dritten Freigabe jedoch immer noch nicht ;(. und mir fällt absolut keine Erklärung dazu ein. Weiß jemand da vielleicht Rat?

Vielen Dank im Vorraus
Fabian Haas

PS: Leider weiß ich nicht, wie man eine Frage wieder als ungelöst markieren kann.
Member: bastla
Solution bastla Feb 10, 2014 updated at 23:43:40 (UTC)
Goto Top
Hallo Fabian-Haas!

Mit vertauschten Zeilen 51 und 52 (und der Angabe von tokens und delims wie in Zeile 45) sollte das klappen ...

Grüße
bastla
Member: Fabian-Haas
Fabian-Haas Feb 10, 2014 at 22:05:18 (UTC)
Goto Top
Hallo Bastler,

danke für die Antwort. Leider funktioniert es auch dann nicht. Außerdem komme ich nie bei einer Pause an (die Pause in Zeile 50). Funktioniert dann die If-Abfrage nicht?

Schon mal Danke
Fabian Haas
Member: bastla
Solution bastla Feb 10, 2014 updated at 23:43:32 (UTC)
Goto Top
Hallo Fabian-Haas!

Die Anführungszeichen in der Zeile 44 hatte ich leider übersehen face-sad - entweder verwendest Du sie auf beiden Seiten oder auf keiner, daher zB
if NOT "%NSTEMP%"=="0" (
Grüße
bastla
Member: Fabian-Haas
Fabian-Haas Feb 11, 2014 at 16:51:29 (UTC)
Goto Top
Hallo Bastla,

das habe ich jetzt auch ausprobiert, leider ohne Erfolg :/. Allerdings wird mir jetzt die Pause in Zeile 50 angezeigt. Müsste der Fehler dann nicht in den Zeilen 51-56 liegen?

Viele Grüße
Fabian Haas
Member: bastla
Solution bastla Feb 11, 2014 updated at 20:02:08 (UTC)
Goto Top
Hallo Fabian-Haas!

Ersetze die Zeilen 51 - 54 durch
set "SHARE="  
for /f "usebackq tokens=2 delims=:" %%i in (\\%SERVERIP%\shares\%USERNAME%.txt) do if not defined SHARE set "SHARE=%%i"  
goto openshare2
Grüße
bastla
Member: Fabian-Haas
Fabian-Haas Feb 11, 2014 at 20:05:28 (UTC)
Goto Top
Okay jetzt klappt alles genauso, wie ich es wollte. Perfekt! face-smile

Also nochmals Vielen Dank für die schnellen und aufschlussreichen Antworten (auf meine zum Teil vielleicht etwas dämlichen Fragen face-wink ) und aber auch für die herzliche Aufnahme ins Forum. face-big-smile

Nochmals Danke
Fabian Haas