reisszahn2009
Goto Top

Batch - Dateinamen mit Zahl (nummeriert) anzeigen, um die Datei nachher über diese Zahl auszuwählen

Hi zusammen,
ich möchte für ein kleines Script eine Backupdatei zurückspielen, indem man nicht den Namen angibt sondern die Nummer.

Die Anzeige einer Zahl vor dem Backup habe ich bereits geschafft. Ich schaffe es aber nicht aus der Zahl einen Rückschluss auf den Dateinamen zu machen.
Habt ihr vielleicht Ideen?

Hier der Core für den "Zahlenanzeige":
pushd "C:\Backup\"  
set /a counter=10000
for /f "delims=" %%i in ('dir /b /O-D C:\Backup\Backup-*.zip') do call :ProcessDir "%%i"  
popd
goto :chooseFile

:ProcessDir
set /a counter+=1
echo %counter:~-4% %1
goto :eof


:chooseFile
echo.
echo Waehlen Sie ein Backup-Archiv aus:
set/a filenumber= >nul

..
..
..


Die bisherige Ausgabe:

Ermittelte Backups

0001 "Backup-05.02.2010-09.20.03-c1.2.147-p1.1.5.zip"
0002 "Backup-05.02.2010-09.15.05-c1.2.147-p1.1.5.zip"
0003 "Backup-05.02.2010-09.10.18-c1.2.147-p1.1.5.zip"
0004 "Backup-05.02.2010-08.57.18-c1.2.147-p1.1.5.zip"
0005 "Backup-05.02.2010-08.56.13-c1.2.147-p1.1.5.zip"
0006 "Backup-05.02.2010-08.54.53-c1.2.147-p1.1.5.zip"
0007 "Backup-05.02.2010-08.54.06-c1.2.147-p1.1.5.zip"

Waehlen Sie ein Backup-Archiv aus:


Der Rest will mir bisher nicht gelingen.
Vielen Dank für eure Vorschläge!

Gruß Reisszahn

Content-Key: 135845

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

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

Member: bastla
bastla Feb 12, 2010 at 20:12:47 (UTC)
Goto Top
Hallo Reisszahn!

Da Du ja durch das sortierte "dir" eine definierte Reihenfolge erhältst, kannst Du schematisch etwa so vorgehen:
:chooseFile
echo.
set "filenumber="  
set /p filenumber=Waehlen Sie ein Backup-Archiv aus (Q fuer Abbruch): 
if not defined filenumber echo Ungueltige Wahl! & goto :chooseFile
if /i "%filenumber:~,1%"=="q" popd & goto :eof  
set /a number=filenumber
if %number% leq 0 echo Ungueltige Wahl! & goto :chooseFile
if %number% gtr %MaxNumber% echo Ungueltige Wahl! & goto :chooseFile

set "Filename="  
set /a number-=1
for /f "delims=" %%i in ('dir /b /O-D Backup-*.zip^|more +%number%') do if not defined Filename set "Filename=%%i"  
if not defined Filename echo Fehler! & popd & goto :eof
echo Gewaehlt: %Filename%
Anmerkungen:
Wenn Du ja per "pushd" bereits im richtigen Ordner bist, brauchst Du diesen im "dir"-Befehl nicht nochmals anzugeben (ansonsten verwende zumindest eine Variable dafür); mit einem "dir /s /b" erhältst Du übrigens einen vollständigen Pfad ("Backup-*.zip"-Dateien in Unterordnern würden dann zwar auch berücksichtigt, aber die wird es ja vermutlich ohnehin nicht geben ...).

Mit dem "popd" könntest Du bis zum Ende der ganzen Aktion warten (habe ich bei der "for"-Schleife in Zeile 13 unterstellt).

Den "Umweg" über "more +n" habe ich gewählt, weil ein "skip=0" nicht klappt ...
Eine Alternative wäre die Verwendung eines "Pseudoarrays" aus Variablen mit den Namen %Datei0001%, %Datei0002%, etc für die einzelnen Dateien.

Grüße
bastla

[Edit] Vergleich von "==0" auf "leq 0" geändert - sicher ist sicher face-wink [/Edit]
Member: Reisszahn2009
Reisszahn2009 Feb 13, 2010 at 08:24:17 (UTC)
Goto Top
Hi,
vielen Dank für die super antwort!
Darum zur Vollständigkeit hier der komplette Auszug:

:getBackupFileFromUser
echo.
echo - - - - - - - - - - - - - - - - - - - - - - - - - 
echo Ermittelte Backups (Dateiname Backup-*.zip)
echo.
pushd "%recoverdir:~1,-1%"  
set /a filecounter=0
for /f "delims=" %%i in ('dir /b /O-D "%recoverdir:~1,-1%\Backup-*.zip"') do call :makeFileList "%%i"  
popd
goto :chooseFileFromList

:makeFileList
set /a filecounter+=1
if %filecounter% LSS 10 (
	echo     %filecounter% - %1
) else (
	echo    %filecounter% - %1
)	
goto :eof

:chooseFileFromList

echo.
set "filenumber="  
echo Waehlen Sie ein Backup-Archiv anhand der Nummer aus (Q fuer Abbruch): 
set /p filenumber= >NUL
if not defined filenumber echo Ungueltige Wahl! & goto :chooseFileFromList
if /i "%filenumber:~,1%"=="q" popd & goto :eof  
set /a number=filenumber
if %number% LEQ 0 echo Ungueltige Wahl! & goto :chooseFileFromList
if %number% GTR %filecounter% echo Ungueltige Wahl! & goto :chooseFileFromList

set "filename="  
set /a number-=1
for /f "delims=" %%i in ('dir /b /O-D "%recoverdir:~1,-1%\Backup-*.zip"^|more +%number%') do if not defined filename set "filename=%%i"  
if not defined filename echo Fehler! & popd & goto :eof
echo.
echo Gewaehlt: %filename%
echo.
set filename="%recoverdir:~1,-1%\%filename%"  

Danke und Gruß Reisszahn!