evaeden
Goto Top

Batch soll erkennen - Datei oder Verzeichnis

Liebe Spezialisten,

ich habe da ein Problem: Ich möchte mein Batch insofern erweitern, dass es zwischen Dateien und Verzeichnissen unterscheiden kann. Im Augenblick können nur Verzeichnisse bearbeitet werden. Also wenn es eine Datei einliest, soll xcopy ohne /i ausgeführt werden und das robocopy soll nicht laufen.

Vielen herzlichen Dank mit ebensolchen Grüßen
Eva~

@echo off&setlocal&chcp 1252>nul&pushd=\
if not exist %windir%\system32\robocopy.exe set Robo=No&echo Robocopy nicht gefunden, keine Synchronisierung m”glich!&echo.&pause
REM ———————————————————————————
REM Hierhin wird gesichert
REM ———————————————————————————
set Backup=S:\


if %Backup:~-1%==\ set Backup=%Backup:~0,-1%
if %1!==! (
REM ———————————————————————————
REM Zu sichernde Dateien...
REM ———————————————————————————
REM Achtung: Ein Laufwerk ohne Verzeichnis (z.B. D:\) darf nur alleine in der Liste stehen!
REM Ansonsten würden weitere schon gesicherte Daten (von anderen Laufwerken)
REM gelöscht werden, da sie auf diesem Laufwerk ja nicht vorhanden sind.
for %%n in (

"%USERPROFILE%\Favorites"
"%USERPROFILE%\Links"
D:\Bilder
D:\Dokumente
D:\Musik
D:\Videos


)do call:save %%n
)else (
REM ———————————————————————————————————————————————————————————
REM ...oder Parameterübergabe von zu sichernden Dateien
REM (bis zu 9 Datenquellen markieren, senden an Backup.bat
REM - setzt voraus: Backup.bat im Verzeichnis
REM C:\Users\..\AppData\Roaming\Microsoft\Windows\SendTo)
REM ———————————————————————————————————————————————————————————
for %%n in (%1 %2 %3 %4 %5 %6 %7 %8 %9)do call:save %%n)
popd&endlocal&chcp 850>nul&goto:eof
:save
set From=%~1
if %From:~-1%==\ set From=%From:~0,-1%
echo.&echo %From%
set To=%From%
if %To:~1,1%==: set To=%To:~3%&if %To:~2,1%! neq \! set To=%To:~2%
if "%To%" neq "" set To=\%To%
xcopy/m/e/i/h/r/k/y "%From%" "%Backup%%To%"
REM Sichert alle Dateien mit Archive-Attribut (auch geänderte Dateien mit identischer/m Größe/Zeitstempel)
if not defined Robo robocopy/dcopy:t /mir /r:0 /njh /njs "%From%" "%Backup%%To%"
REM Synchronisiert (Verzeichnis-Zeitstempel und Löschen von Dateien, die in der Quelle nicht mehr vorhanden sind)

Content-Key: 197407

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

Printed on: April 23, 2024 at 06:04 o'clock

Member: bastla
bastla Jan 22, 2013 updated at 07:24:36 (UTC)
Goto Top
Hallo EvaEden!

Um festzustellen, ob sich zB in %Ziel% ein gültiger Pfad zu einem Verzeichnis befindet, könntest Du etwa
dir /b/ad "%Ziel%" >nul 2>nul && echo Verzeichnis
verwenden ...

Grüße
bastla
Member: EvaEden
EvaEden Jan 22, 2013 at 10:59:33 (UTC)
Goto Top
Super! Hät' ich auch selber drauf kommen können...

Vielen Dank & 1000 Grüße an bastla

 (\_/)
 (^.^)
(")_(")
Member: pieh-ejdsch
pieh-ejdsch Jan 23, 2013 updated at 18:23:04 (UTC)
Goto Top
moin,

Du könntest die Variablenerweiterung bzw. Parametererweiterung auch für das Erstellen des ZielPfades benutzen.
Die Backslashes am Ende werden somit auch gleich entfernt:
set Backup=S:\

if "%~1" equ "" goto :Einzeln  
for %%A in ( 

 "%USERPROFILE%\Favorites"  
 "%USERPROFILE%\Links"  
 D:\Bilder
 D:\Dokumente
 D:\Musik
 D:\Videos

) do call :save %%A "%Backup%%%~pnxA"  
exit /b

:Einzeln
 rem den Paramer ein Backslahs sowie Punkt anhängen
call :save "%~1\." "%Backup%%~pnx1\."  
if "%~2" neq "" shift &goto :Einzeln  
exit /b

:save
 rem die Parameter lassen sich nun zum Vollständigen Pfad auflösen ohne Backslash am Ende
xcopy /m/e/i/h/r/k/y "%~f1" "%~f2"  

 rem xcopy meldet dann aber auch einen Fehlerhaften Ordner bei Dateien\.
xcopy /m/e/i/h/r/k/y %1 "%~f2" ||goto :Files  

 
 rem robocoby bekommt nun keine Backslashes
robocopy /dcopy:t /mir /r:0 /njh /njs "%~f1" "%~f2"  
exit /b

:files
xcopy /m/e/h/r/k/y "%~f1" "%~dp2"  
 rem robocoby jammert rum wegen des letzten angehängten Backslashes
 rem aber nicht, wenn ein Punkt hinter dem Backslash ist
robocopy /dcopy:t /mir /r:0 /njh /njs "%~dp1." "%~dp2." "%~nx1"  
exit /b

Gruß Phil
Member: EvaEden
EvaEden Feb 08, 2013 at 14:05:35 (UTC)
Goto Top
Hi Phil,

vielen vielen Dank für Deinen Code-Review und die Verbesserungen <viele Ausrufezeichens>

Ich hab's gleich eingebaut und auch sonst noch verbessert/erweitert...

Herzlichst, Eva~ <°)))><

@echo off&setlocal&pushd=\
if exist %windir%\system32\robocopy.exe (set Skip=Xcopy&if %1! neq ! set Skip=)else (set Skip=Robo&echo Robocopy nicht gefunden, keine Synchronisierung ^(Verzeichnis-Zeitstempel und&echo L”schen von Dateien, die in der Quelle nicht mehr vorhanden sind^) m”glich!&echo.&pause)
setlocal EnableDelayedExpansion&call:exclude read
if %Skip%! neq Xcopy! if exist %~dpn0.exclude (for /f "delims=" %%L in (%~dpn0.exclude) do set FiledList=!FiledList! "%%L"
if !FiledList! neq !List! call>%~dpn0.exclude&call:exclude write
if defined List (set ExcludeList=/exclude:%~dpn0.exclude)else set ExcludeList=&del %~dpn0.exclude)else call:exclude write
setlocal DisableDelayedExpansion&chcp 1252>nul
:: ——————————————————————————
:: Hierhin wird gesichert
:: ——————————————————————————
set Backup=S:


if %1! neq ! goto:send
:: —————————————————————————
:: Zu sichernde Daten...
:: —————————————————————————
:: Achtung: Ein Laufwerk ohne Verzeichnis (z.B. D:\) darf nur alleine in der Liste stehen!
:: Ansonsten würden weitere schon gesicherte Daten (von anderen Laufwerken)
:: gelöscht werden, da sie auf diesem Laufwerk ja nicht vorhanden sind.
for %%D in (

"%USERPROFILE%\Desktop"
"%USERPROFILE%\Documents"
"%USERPROFILE%\Downloads"
"%USERPROFILE%\Favorites"
"%USERPROFILE%\Links"
"%USERPROFILE%\Music"
"%USERPROFILE%\Pictures"
"%USERPROFILE%\Videos"
D:\Outlook-Dateien\*.pst
D:\Treiber


)do call:save "%%~D." "%Backup%%%~pnxD."
goto:end
:: ————————————————————————————————————————————————————————
:: ...oder Parameterübergabe von zu sichernden Daten
:: (Kopiert zusätzlich Dateien mit Archiv-Attribut, so
:: auch geänderte mit identischer/m Größe/Zeitstempel)
:: Bis zu 9 Datenquellen markieren, senden an Backup.bat
:: - setzt voraus: Backup.bat im Verzeichnis
:: C:\Users\..\AppData\Roaming\Microsoft\Windows\SendTo
:: ————————————————————————————————————————————————————————
:send
call:save "%~1." "%Backup%%~pnx1."&if %2! neq ! shift&goto:send
echo.&echo Backup erledigt, Taste drcken...&pause>nul
:end
chcp 850>nul&attrib -s -h %Backup%>nul&popd&endlocal&goto:eof
:: ——————————————————————————
:: Auszuschließende Daten
:: ——————————————————————————
:exclude
for %%X in (

$RECYCLE.BIN
"System Volume Information"
"D:\Große Dateien\*.iso"


)do if %1==read (set List=!List! "%%~fX")else echo %%~fX>>%~dpn0.exclude
goto:eof
:save
chcp 850>nul&set Attr=/m&if %Skip%!==Robo! if not exist "%~f2" set Attr=
if not defined Attr attrib -a %Attrib%>nul
if not exist "%~f1" echo.&echo %~f1 nicht gefunden&echo.&pause&goto:skip
if %Skip%! neq Robo! robocopy "%From%." "%To%."%File% /dcopy:t%Mir% /r:0 /njh /njs /xd%List% /xf%List%
if %errorlevel% gtr 3 pause
:skip
chcp 1252>nul

PS: Wie kann man denn als "Quelltext" einfügen ?¿?
Member: bastla
bastla Feb 08, 2013 at 15:13:08 (UTC)
Goto Top
Hallo EvaEden!
Wie kann man denn als "Quelltext" einfügen ?¿?
Verwende <code> und </code> ...

Grüße
bastla
Member: EvaEden
EvaEden Feb 09, 2013 at 17:52:17 (UTC)
Goto Top
Dankesähr fielmals Baschtlr!!!