pieh-ejdsch
Goto Top

Automatische Zuweisung von Laufwerken bei zu langen Pfadtiefen

Hallo Admins,

manchmal findet sich in den Tiefen eines Laufwerkes allerhand Müll oder doch noch etwas Verwertbares.
Um dorthin zu gelangen muss erstmal danach gesucht werden.
Die zu tiefen Pfade sind in der Fehlerausgabe zB. von Laufwerk D:
dir /s /b D:\..?.. >nul

Dann wäre es gleich von Vorteil, wenn nicht nur eine Auflistung der Daten, sondern auch eine Liste der Zuweisungen vorhanden ist, welche bei Bedarf erhalten Bleibt.

Der Batch listet wahlweise Dateien und/oder Ordner sowie deren Zuweisungen von diesen Untiefen auf.
Eine Hilfe /? ist enthalten.
@echo off
setlocal
prompt $g$s
if "%~1" equ "" echo Syntaxfehler. 1>&2 &exit /b 1  
if "%~1" neq "/?" goto :noHelp  
echo Listet bedenkliche Pfad- und Dateinamen mit Pfadtiefe komplett auf.
echo wechselt Selbststaendig in tiefere Pfade.
echo(&echo %~n0 Pfad [/D ^| /-D] [/B] [/P]
echo %~n0 [/X]
echo(&echo   /D    Es werden nur Ordnerpfade aufgelistet.
echo   /-D   Es werden nur Dateien aufgelistet.
echo   /B    Behalten von erzeugten Laufwerkszuweisungen.
echo   /P    Alle zuvor Verbundenen Laufwerke ^(subst^) werden entfernt. 
echo   /X    Nur alle Zuweiungen entfernen.&echo(
exit /b 0
:noHelp
if /i "%~1" neq "/X" if not exist "%~1" echo Datei nicht gefunden! 1>&2 & exit /b 2  
set "SubstDel="  
set "DIRCMD=/a-l"  
set "Dir=1"  
set "DelSubst="  
for %%i in ( %1 %2 %3 %4) do (if /i "%%~i" equ "/B" set "SubstDel=:: "  
  if /i "%%~i" equ "/D" set "DIRCMD=/a-ld" &set "Dir=1"  
  if /i "%%~i" equ "/-D" set "Dir=" &set "DIRCMD=/a-l"  
  if /i "%%~i" equ "/X" set "DelSubst=exit /b"  
  if /i "%%~i" equ "/P" set "DelSubst=rem"  
)
 rem alte Zuweisungen entfernen
if defined delsubst for /f "delims=\" %%i in ('subst') do subst %%i /d  
%delsubst%
set "SubstList=%~dpn0-Substlist.txt"  
set "RetourePfad="  
set "inPath=%~d1"  
set "SubstLW="  
set "FreeDrive= B C D E F G H I J K L M N O P Q R S T U V W X Y Z"  
set /a Min=240
set "Lastpath=::"  
set "M=%temp%\%~n0temp.tmp"  
type nul>"%SubstList%"  

:search Suche nach tieferen Pfaden
for /f "tokens=2*" %%h in ('^(dir /s /b %1 ^>nul^)^2^>^&1') do if %%h equ Verzeichnisname (  
  set "F=%%i"  
  setlocal enabledelayedexpansion
  for /f "delims=" %%a in ("!F:~0,-13!") do (endlocal  
   set "LongPath=%%a"  
   call :Infile %%~di
   set "Lastpath=%RetourePfad%%%~pi"  
))
if not defined SubstLW goto :noLW 
set /a x=%random%
set "T=%temp%\%~n0-%x%-%random%.txt"  
dir /s /b %1 >"%T%" 2>nul  
 rem suche Verzeichnisse und Dateien ab
for /f "usebackqtokens=*delims=" %%i in ("%T%") do if exist "%%~i" (  
   set "Outpath=%inPath%%RetourePfad%%%~pnxi"  
   if defined DIR if exist "%%~i\" call :out " -DIR-"  
   if not exist "%%~i\" call :out " -file"  
  )
)  
del "%T%" 2>nul  
del "%M%" 2>nul  
:noLW
exit /b

:InFile Zuweisung eines Tieferen Pfades an einen Laufwerksbuchstaben
setlocal
set "ToSubst=%~d1"  
set "SubstLW="  
setlocal enabledelayedexpansion
for /d %%i in ("!LongPath!.X\..") do (endlocal  
  set "ToSubst=%%~fi"  
  set "RetourePfad=%RetourePfad%%%~pnxi"  
)
 rem Keine Pfade doppelt absuchen
 setlocal enabledelayedexpansion
 if !RetourePfad!\ equ !LastPath! endlocal &goto :noTodo
for %%i in (%FreeDrive%) do @(vol %%i:|cd>nul)2>&1|find "System">nul&&set "SubstLW=%%i:"  
if not defined SubstLW 1>&2 echo Kein Freies Laufwerk gefunden!& exit /b 3
subst %SubstLW% "%ToSubst%"  
 rem Pfad aus SubstLW auslesen und zur Liste hinzufuegen
>>"%SubstList%" echo "Subst_%substLW%=%inPath%%RetourePfad%"  

>"%M%" <nul set /p =+--- Virtuelle Verbindungen der Daten ----  
set "+=+ "  
set "++=. . . . . . . . . . . . . . . . . . . . . . . . . . ."  
call :checksub %SubstLW% >>"%M%"  
>>"%M%" Echo %++%  
>>"%M%" echo(  
goto :next
:checksub
for /f "tokens=4*delims=\ " %%A in ('subst^|find "%1\:"') do (echo(  
  echo %1\: %%A\%%B
  <nul set /p =%+%
  set "+=%+%+ "  
  set "++=%++:~2%"  
  call :checksub %%A
)
exit /b
:next
call :search "%substLW%"  
:noTodo
%substdel%subst /d %SubstLW% 2>nul >&2
:NotLong
endlocal
exit /b

:out Auflistung der Tiefen Dateien
setlocal enabledelayedexpansion
if !OutPath:~%min%! equ !! exit /b
for /l %%i in (%min% 1000 7000) do if !OutPath:~%%i! neq !! set /a mini=%%i
set /a max=mini+1000
for /l %%i in (%mini% 100 %max%) do if !OutPath:~%%i! neq !! set /a mini=%%i
set /a max=mini+100
for /l %%i in (%mini% 10 %max%) do if !OutPath:~%%i! neq !! set /a mini=%%i
set /a max=mini+10
for /l %%i in (%Mini% 1 %max%) do if !OutPath:~%%i! equ !! if not defined L (set L=1
  if exist "%M%" type "%M%" >&3 &del "%M%"  
  echo %~1  %%i	!Outpath!
  echo(
)
endlocal
exit /b

Wer andere Fehlerausgaben im Verzeichnisauflister hat, möge sie hier zur Integration posten.
zu lange Pfade; Der Dateiname ist zu lang. Der Verzeichnisname ... ist zu lang. MAX_PATH 256 Zeichen, Pfadtiefe auslesen, lange Pfade finden, Windows Pfad zu lang, Auf lange Pfade zugreifen
Gruß Phil

Content-Key: 196363

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

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