madtrick
Goto Top

Gekürzte Dateinamen in Variablen und daraus Auswahlmenü (Abfrage) erzeugen?

Hallo mitteinander.

Es wäre klasse, wenn mir jemand auf die Sprünge helfen könnte.

Der nach den gesuchten Dateien abzufragende Ordner sieht so aus:

unbenannt

Ziel ist aus den einzelnen Dateinamen.d2s eine Liste im Batchfenster zu generieren, in der man den gewinschten Char über eine Ziffer auswählen kann.
Über eine Schleife könnte man an die gewünschten Dateinamen kommen. Die Dateien mit der Endung ".d2s" würden sich für die Suche eignen, weil sie der gemeinsame Nenner sind.
Vielleicht so ungefähr in der Form war mein Gedanke:

FOR %%f IN ("%DIRDIABLO%\%DATEINAME%.d2s") DO SET "%%~nf"  
(Mein Gedanke für die Schleife.)

Wenn nun beim Durchlaufen der Schleife die Dateinamen ohne Endung abfallen, wie bekommen ich es hin, daraus eine Liste mit Auswahlmöglichkeit anzeigen zu lassen?
Wenn ich es recht verstehe, nimmt nun bei jedem Durchlauf der Schleife %%f den entsprechenden, gekürtzten Dateinamen an. Und dieser müsste dann zur weiteren Verarbeitung einer neuen Variable (CHAR1, CHAR2, CHAR3, CHAR4, CHAR5, usw...) übergeben werden, damit daraus das Auswahlmenü entstehn kann.

An dieser Stelle komme ich einfach nicht weiter. Als weiteres Problem sehe ich dann noch, dass mal nur 2 Dateinamen und damit auch nur 2 dieser ich nenne sie mal Übergabe-Variablen geben kann. Und mal halt 4 oder 6, 7....

Könnte so das Auswahlmenü erzeugt werden?
.
..
...



REM #### Auswahlmenü ####
echo Bitte den Character auswaehlen?
echo -------------------------------
echo 1: %CHAR1%                         REM Andredatus
echo 2: %CHAR2%                         REM Bones
echo 3: %CHAR3%                         REM Mazekeen
echo 4: %CHAR4%                         REM Miracoli
echo -------------------------------
echo.
echo Bitte auswaehlen

REM #### Auswahl als Char-Name speichern ####
SET /p CHARNAME=

REM #### Ordnernamen und Pfade generieren ####
set	"ORDNERNAME=%DATUM%-%ZEIT%-%CHARNAME%"  
set "COPYPFADLOC=%DIRBACKUPLOC%\%DAT_YY%\%DAT_MM%\%ORDNERNAME%"  
cd %DIRDIABLO%
mkdir "%COPYPFADLOC%"  

REM #### Charakter in Verzeichnis sichern ####
FOR %%f IN ("%DIRDIABLO%\%CHARNAME%.*") DO COPY "%%f" "%COPYPFADLOC%"  

...
..
.

Wie könnten nun die Schritte davor aussehen? Oder wie könnte man das vielleicht anders oder gescheiter lösen?

Die "Grund"-Batch steht soweit und läuft so wie ich es mir denke. Nur eben eine Batch für jeden einzelnen Dateinamen (Charakter). Und jedes Mal muss eben noch händisch der Dateiname in der Batchdatei angepasst werden. Und das soll halt durch die Menüauswahl weg fallen. Auch den Namen über eine Abfrage einzutippen ist keine wirkliche Lösung, weil einfach ein Tippfehler reicht und schon Läuft die Batch ins Leere und legt keine Sicherung an.
Mit dem Menü hat es weiterhin den Vorteil, dass die Batch allgemeine Gültig erreicht und so einfach auf jedem Rechner und von jedem genutzt werden kann, egal wie die eigenen Dateinamen sind. Bei 5 Rechnern sind es momentan insgesamt knapp 30 Dateien (also Charaktäre, die Dateien mit der "*.d2s" Endung. Für jede müsste ich nun eine eigene Batch anlegen. Das würde dann alles weg fallen und wäre eine saubere Lösung.

Ich hoffe ihr versteht wie ich es mir vorstelle oder was ich meine. Sonst fragt einfach nach.
Bastel da schon ein wenig dran rum, aber so recht gelingt mir nicht der Durchbruch. Vielleicht könnt ihr mich darin unterstützen. Das wäre wirklich klasse!!

Content-Key: 459157

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

Printed on: April 28, 2024 at 09:04 o'clock

Member: Madtrick
Madtrick Jun 07, 2019 at 08:11:14 (UTC)
Goto Top
Hier ist meine Batch, welche bisher ohne ein Auswahlmenü für immer einen Charakter (=die zu sichernde Datei) gut arbeitet.

Reiche sie einfach mal mit rein. Vielleicht wird dann verständlicher was ich meine.


@echo Off

REM EINSTELLUNGEN ANFANG

REM Charakter-Name
set CHARNAME=Andredatus

REM Diablo Save-Verzeichnis eintragen (Das Verzeichnis wo Diablo die Chars speichert
set DIRDIABLO=D:\Saved Games\Diablo II

REM Backup Zielverzeichnis eintragen (Locales Backup-Verzeichnis auf Rechner)
set DIRBACKUPLOC=D:\Diablo\CharBackup

REM Backup Zielverzeichnis eintragen (Backup Verzeichnis auf dem Server)
set DIRBACKUPLAN=\\192.168.169.10\Diablo II\CharBackup

REM Pfad zu robocopy
set DIRROBOCOPY=\\192.168.169.10\Diablo II\Software\Robocopy

REM Windows\System32 Verzeichnis für Robocopy
set DIRWINROBO=C:\Windows\System32

REM Installations-Pfad für robocopy
set DIRINSTALLROBO=C:\Programme (noInstall)\robocopy

REM EINSTELLUNGEN ENDE


REM Playernamen setzen
set u=%USERNAME%
if "finn"=="%u%" set PLAYER=Finn  
if "dirk"=="%u%" set PLAYER=Dirk  
if "dani"=="%u%" set PLAYER=Dani  
if "nils"=="%u%" set PLAYER=Nils  
if "jerry"=="%u%" set PLAYER=Jerry  

REM Datum abrufen
set d=%date%
set DAT_YY=%d:~6,4%
set DAT_MM=%d:~3,2%
set DAT_DD=%d:~0,2%
set DATUM=%DAT_YY%%DAT_MM%%DAT_DD%

REM Zeit abrufen
set t=%time%
set ZEIT_HH=%t:~0,2%
if %ZEIT_HH% lss 10 (set ZEIT_HH=0%time:~1,1%)
set ZEIT_MM=%t:~3,2%
set ZEIT_SS=%t:~6,2%
set ZEIT=%ZEIT_HH%%ZEIT_MM%%ZEIT_SS%

REM Eingabe einer Besonderheit des Charakters
cls
echo.
echo.
echo.
echo    Hier kannst du einen Hinweis zu deinem Charakter
echo.   eingeben. Zum Beispiel den Grund dieser Sicherung.
echo    
echo       Beispiele:      Level XY
echo                       Fähigkeiternupdate
echo                       Sockelgeschenk
echo                       Inventarumstellung
echo                       usw...
echo.
echo    Dieser Text wird dem Ordnernamen hinzugefuegt und hilft
echo    spaeter beim Wiederfinden bestimmter Backups des Chars...
echo.
echo    Ist nicht zwingend erforderlich
echo.
echo.
set EINGABE=
set /p EINGABE=   Deine Eingabe:     
echo.
cls

REM Ordnernamen und Pfade generieren
if defined EINGABE (
	set	"ORDNERNAME=%DATUM%-%ZEIT%-%CHARNAME%-%EINGABE%"  
) else (
	set	"ORDNERNAME=%DATUM%-%ZEIT%-%CHARNAME%"  
)
set "COPYPFADLOC=%DIRBACKUPLOC%\%DAT_YY%\%DAT_MM%\%ORDNERNAME%"  
cd %DIRDIABLO%
mkdir "%COPYPFADLOC%"  

REM Dateien in Verzeichnisse kopieren
FOR %%f IN ("%DIRDIABLO%\%CHARNAME%.*") DO COPY "%%f" "%COPYPFADLOC%"  

REM Verfügbarkeit Diablo-Server abfragen
if exist "%DIRBACKUPLAN%" (  
	goto ROBOCOPY
) else (
	goto END
)

:ROBOCOPY
REM Robocopy kopieren und Path setzen.
if not exist "%DIRWINROBO%\robocopy.exe" (  
	if not exist "%DIRINSTALLROBO%\robocopy.exe" (  
		mkdir "%DIRINSTALLROBO%"  
		copy "%DIRROBOCOPY%\robocopy.exe" "%DIRINSTALLROBO%"  
		path "%DIRINSTALLROBO%"  
	) else ( 
		echo Robocopy ist in "%DIRINSTALLROBO%" vorhanden!  
	)
) else ( 
	path "%DIRWINROBO%"  
	echo Robocopy ist in "%DIRWINROBO%" vorhanden!  
)

REM Kopieren mit Robocopy auf Diablo-Server 
set "COPYPFADLAN=%DIRBACKUPLAN%\%PLAYER%"  
robocopy "%DIRBACKUPLOC%" "%COPYPFADLAN%" /E  
goto END

:END
exit
Member: colinardo
Solution colinardo Jun 08, 2019 updated at 11:08:30 (UTC)
Goto Top
Servus.
z.B. so
@echo off & setlocal ENABLEDELAYEDEXPANSION
set "folder=D:\DeinOrdnerMitDenDateien"  
:menu
set cnt=0
echo --------- Auswahlmenue ------------
echo.
for /f "delims=" %%a in ('dir /b /A-D /ON "%folder%\*.d2s"') DO (  
	set /a cnt +=1
	set "file!cnt!=%%~na"  
	echo 	!cnt!^) %%~na
	echo.
)

set /p response=Bitte Nummer eingeben ^(mit ENTER bestaetigen^):
if "%response%" == "" (cls &goto :menu)  
if %response% LEQ 0 (cls &goto :menu)
if %response% GTR !cnt! (cls &goto :menu)

echo.
echo Die Dateien Ihrer Wahl lauten:
echo.
dir /b /a-d "%folder%\!file%response%!.*"  
Mit der Variable !file%response%! nach der Auswahl und einem hinzugefügten Wildcard .* am Ende kannst du ja dann Robocopy oder das Copy-Tool deiner Wahl füttern.

Ein Glück das ich schon lange über Batch hinaus bin und mich dafür nicht mehr so verbiegen muss ... face-wink. Würde dir heutzutage eine modernere wärmstens Skriptsprache wie z.B. Powershell/Python & Co. ans Herz legen. Irgendwann muss mit diesen alten Kamellen Schluss sein.

Grüße Uwe
Member: Madtrick
Madtrick Jun 08, 2019 at 13:08:58 (UTC)
Goto Top
Hallo Uwe.

WOW. Ganz herzlichen Dank.

Das war genau das was mir fehlte. Vom Gedanken her hatte ich die Logik so ungefähr auch schon entwickelt, aber sie dann doch nicht richtig umgesetzt bekommen. Zu selten habe ich halt mit Progrmierung zu tun. Und es fehlt oft einfach das Wissen der Syntax oder der Möglichkeiten. Also viel Halbwissen.

Du hast recht, mit den moderneren Skriptsprachen. Finde ich auch sehr reizvoll. Nur stehe ich da noch auf dem Stand von vor 30 Jahren. Für ein hin und wieder benötigtes Skript weiß ich nicht, ob es sich lohnt in eine neue Sprache einzusteigen.

Welche Sprache würdest du deiner Meinung empfehlen, die halt moderner ist, aber vielleicht doch noch viele Ähnlichkeiten mit dieser Batch-Programmierung hat? Also vielleicht für einen Einstieg zu empfehlen ist.
Als Übung könnte ich ja dann möglicherweise mal dieses Skript in die für mich neue Sprache bringen... Vielleicht auch einfach um die Unterschiede zu sehen...

Noch einmal Dank. Deinen Code-Schnippsel habe ich eben eingearbeitet und es klappt super!!

Für mich ist damit meine Frage beantwortet und dieses Postig zu 100% gelöst!

Viele Grüße, Dirk
Member: colinardo
colinardo Jun 08, 2019 updated at 13:55:46 (UTC)
Goto Top
Hallo Dirk,
Welche Sprache würdest du deiner Meinung empfehlen, die halt moderner ist, aber vielleicht doch noch viele Ähnlichkeiten mit dieser Batch-Programmierung hat? Also vielleicht für einen Einstieg zu empfehlen ist.
also wenn es die Windows Schiene sein soll dann sind natürlich als erstes mal die Powershell, VBS und JavaScript die ersten Kanidaten die ohne weitere Maßnahmen auf dem OS laufen. Mit Zusatz zum empfehlen ist auch Python, gerade weil es auch auf sämtlichen Plattformen läuft wenn gefordert und von der Syntax her leicht zu erlernen ist. Powershell kann man natürlich in keinster Weise mit Batch vergleichen, da liegen Welten dazwischen und durch den Zugriff auf das .NET-Framework steht einem quasi eine komplette objektorientierte Programmiersprache inkl. Windows Forms und WPF Oberflächen Support offen ohne die elendigen Bugs von Batch. Sogar selbst laufende Anwendungen als EXE kompiliert kannst du damit erstellen.
Wenn man aber die Powershell einmal verinnerlicht hat stehen einem ganz neue Möglichkeiten offen. Ich persönlich würde mir also unter Windows mal die Powershell oder VBS ansehen. Soll es plattformübergreifender sein ist heute Python für Anfänger aber auch Fortgeschrittene das Mittel der Wahl.
Schau sie dir einfach mal an, da ist jeder einfach unterschiedlich gestrickt.
Als Übung könnte ich ja dann möglicherweise mal dieses Skript in die für mich neue Sprache bringen... Vielleicht auch einfach um die Unterschiede zu sehen...
Kann ich dir hier gerne direkt auch mal als Alternative aufzeigen (Kommentare inkl.)
# Dateien nach Basename gruppieren und in Variable speichern
$filedata = dir 'D:\DeinOrdner' -File | group Basename  
# Menü so lange in einer Schleife anzeigen bis der Benutzer einen gültigen Wert eingegeben hat
do{
    # Überschrift erzeugen (mit Trick, du siehst du kannst Strings einfach mit einem Integer multiplizieren um sie zu duplizieren;-))
    write-host "$('-'*10) Menü $('-'*10)"  
    # für jeden Eintrag in der Gruppierung gebe einen Menüeintrag aus (%{} ist ein Alias für eine For-Each Schleife)
    1..$filedata.Count | %{write-host "`t$_.) $($filedata[$_-1].Name)"}  
    # Benutzer nach Eintrag fragen
    $response = Read-Host "Ihre Auswahl"  
}until($response -in 1..$filedata.Count)

# Ausgabe der passenden Dateien:
write-host "Ihre gewählten Dateien lauten:"  
$filedata[$response-1].Group.Fullname
Du siehst, Powershell arbeitet objektorientiert und es gibt eine ganze Reihe an Abkürzungen mit denen man auch schnell Dinge abkürzen kann.

Weitere Infos bekommst du Schubkarrenweise im Web:


Grüße Uwe