saschbert
Goto Top

Dateiendung mit Wildcard?

.auf.* als Wildcard in einer Batch?

Hallo Leute,

mit der hier zu lesenden Hilfe auf administrator.de habe ich bereits eine Datei soweit zurechtstricken können, jedoch nicht wirklich so, wie ich es brauche. Und zwar geht es darum, dass ich einen Ordner habe, der n Unterordner haben kann, in denen Dateien liegen. Nun brauche ich alle Dateien, die nicht auf eine bestimmte Dateiendung lauten, dazu habe ich ein prima Script hier gefunden, und es auch soweit genutzt. Jedoch geht es bei mir noch ein Stück weiter: Die Dateien haben als Endung immer .auf. + eine 9-stellige Zahl. Nun habe ich mir gedacht, nutze ich doch einfach die Wildcard, sprich set "ext=.auf.*", aber das funktionierte nicht, also habe ich versucht, es unten in der Zeile mit zu übergeben, aber das funktioniert auch nicht.

Daher hier die Frage: Kann ich das mit übergeben, oder geht das garnicht? Oder wie könnte ich das Realisieren?


@echo off & setlocal

set "Ordner=E:\Allgemein\Daten\TA1\NEUE_Dateien"  
set "ext=auf"  
set "Liste=E:\Allgemein\Daten\TA1\NEUE_Dateien\uebersehene_Dateien.txt"  
goto MAIN

:MAIN
rem   Abfrage, ob die Suche gestartet werden soll.
cls
echo.
echo  ####################################
echo  # Achtung:                         #
echo  # --------                         #
echo  # Die Suche dauert ca. 30 Minuten! #
echo  ####################################
echo.
echo.
choice /c jn /m "Soll die Suche getartet werden?   "  
if errorlevel 2 goto VORZEITIG
if errorlevel 1 goto LOESCHEN
if errorlevel 255 goto FEHLER

:LOESCHEN
rem   Alte TXT-Liste löschen, wenn vorhanden.
echo.
echo.
echo Alte Suchliste wird geloescht ...
if exist "%Liste%" del "%Liste%"  
echo.
echo Alte Suchliste geloescht!
goto SUCHE

:SUCHE
rem   Die Suchfunktion, die die Werte in die Liste schreibt
echo.
echo.
echo Suche nach Dateien laeuft ...
for /f %%i in ('time /t') do set startZeit=%%i  
echo Suche gestartet um %startZeit%
for /f "delims=" %%i in ('dir /b /s /a-d "%Ordner%"') do if /i "%%~xi" neq ".%ext%.*" echo %%i >>"%Liste%"  
echo.
for /f %%i in ('time /t') do set endZeit=%%i  
echo Suche nach Dateien beendet, Liste geschrieben um %endzeit%
goto ENDE

:VORZEITIG
rem   Bei Abbruch der Suche
echo.
echo.
echo.
echo Verarbeitung abgebrochen. Zum schliessen des Fensters beliebige druecken.
echo.
echo.
pause
goto eof

:ENDE
rem   Ende des Batchfiles
echo.
echo.
echo.
echo Verarbeitung beendet. Zum schliessen des Fensters beliebige druecken.
echo.
echo.
pause
goto eof


Vielen Dank,
Saschbert

Content-Key: 69357

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

Printed on: April 20, 2024 at 03:04 o'clock

Member: TuXHunt3R
TuXHunt3R Sep 24, 2007 at 10:15:18 (UTC)
Goto Top
Versuchs mal so:

set "ext"=="*auf*"  

Sollte theoretisch gehen, das ist das, was mir auf den ersten Blick einfällt
Member: Saschbert
Saschbert Sep 24, 2007 at 11:28:36 (UTC)
Goto Top
Versuchs mal so:

> set "ext"=="*auf*"  
> 

Sollte theoretisch gehen, das ist das, was
mir auf den ersten Blick einfällt

Vielen Dank für den Versuch, doch leider funktioniert das so nicht, habe es sowohl in Deiner Variante versucht, als auch in der Variante, dass ich *.auf.* versucht habe. Scheinbar mag er bei Variablen keine Wildcards oder so.

Hat noch jemand eine Idee/Lösung?
Member: TuXHunt3R
TuXHunt3R Sep 24, 2007 at 13:54:40 (UTC)
Goto Top
So hast du es auch schon probiert?

for /f "delims=" %%i in ('dir /b /s /a-d "%Ordner%"') do if /i "%%~xi" neq "*.auf.*" echo %%i >>"%Liste%"  


Eine Frage: Bedeutet "neq" not equal, d.h. nicht gleich? Hab das noch nie gebraucht, höchstens bei der Powershell
Member: Biber
Biber Sep 24, 2007 at 16:06:54 (UTC)
Goto Top
Moin Saschbert,

Du kommst dem vermeintlichen Fehler schneller am CMD-Prompt auf die Spur.

>echo bsss>test.auf.12344
>dir /b *.auf.*
test.auf.12344

C:\Dokumente und Einstellungen\Biber>for %i in (*.auf.*) do @echo [%~ni] [%~xi]
[test.auf] [.12344]

Wie hoffentlich zu sehen ist,
  • ist nicht etwa "test" der Name der Datei, sondern "test.auf"
  • und nicht ".auf.12344" die eXtension, sondern ".12344".

Also STREICHE:
for /f "delims=" %%i in ('dir /b /s /a-d "%Ordner%"') do if /i "%%~xi" neq ".%ext%.*" echo %%i >>"%Liste%"  
SETZE:
for /f "delims=" %%i in ('dir /b /s /a-d "%Ordner%\*.%ext%.*"') do @echo %%i >>"%Liste%"  

Grüße
Biber

P.S. "neq" ist in der Tat neudeutsch für "ungleich".
Die anderen stehen unter der Hilfe zu IF ("If /?" am CMD-Prompt).
Member: Saschbert
Saschbert Sep 25, 2007 at 08:19:06 (UTC)
Goto Top
Moin Saschbert,

Du kommst dem vermeintlichen Fehler
schneller am CMD-Prompt auf die Spur.


Vielen Dank! Jedoch geht dies auch nicht so, wie ich es brauche, aber fast. Habe schon versucht, über den Prompt etwas zu erreichen, aber Batch-Programmierung ist einfach nicht mein Ding.

Was passiert?
Die Dateien, die eigentlich nicht angezeigt werden sollen, werden nur noch angezeigt. Es soll im Script ja so sein, dass genau die Dateien mit '''*.auf.*''' ignoriert werden, und nur alle anderen Dateien angezeigt werden.

Anbei ein paar Beispiele, wie die Dateien am Ende aussehen könnten:
.auf.331400529
.AUF.340552406
.auf.341520238
.AUF.391600304
.AUF.430825449
.AUF.501201163
.AUF.601614765

Wie gesagt, das Format am Ende der Daten ist immer gleich:
[n-zeichen].auf.[9-stellige Zahl]


Gruß
Saschbert
Member: Biber
Biber Sep 25, 2007 at 09:31:50 (UTC)
Goto Top
Moin Saschbert,

sorry, dann hatte ich zu unaufmerksam gelesen.

Jetzt habe ich es aber verstanden (glaube ich).

Also dann quäle dich bitte noch mal an den CMD-Prompt.
Wir nehmen den XCOPY-Befehl.
[CMD-Prompt]
echo *.auf.*>%temp%\exclude.lst
xcopy . %temp%\egal\  /Exclude:%temp%\exclude.lst  /L [sonstigeXCopy-Parameter]

Der zweite Befehl sollte als vollwertiger Ersatz für Dein DIR-Konstrukt dienen.
Denn der listet alle Dateien außer den *.auf*-Dateien auf.

Grüße
Biber
Member: Saschbert
Saschbert Sep 25, 2007 at 10:20:50 (UTC)
Goto Top
Hallo Biber,

vielen Dank nochmal, aber es kommt noch immer nicht das richtige Ergebnis, sprich die Dateien, die unter anderem *.auf.* haben, werden dennoch gelistet, was ja nicht sein sollte.

Nun mag es sein, dass ich das ganze falsch eingebaut habe, daher hier nochmal die entsprechend wichtigen Zeilen, um die es geht:
set "Ordner=E:\Allgemein\Daten\TA1\NEUE_Dateien\"  
set "ext=auf"  
set "Liste=E:\Allgemein\Daten\TA1\NEUE_Dateien\uebersehene_Dateien.txt"  
if exist "%Liste%" del "%Liste%"  
echo *.auf.* > %temp%\exclude.lst
for /f "delims=" %%i in ('xcopy . %temp%\egal\ /Exclude:%temp%\exclude.lst /S /L') do @echo %%i >>"%Liste%"  

Habe ich da noch einen Fehler? In der Umsetzung evtl.? Im XCopy habe ich noch die Option /S übernommen, da er ja auch Unterornder durchsuchen müsste.

Gruß
fast am verzweifelnder Saschbert
Member: bastla
bastla Sep 25, 2007 at 10:38:30 (UTC)
Goto Top
Hallo Saschbert!

Und so?
dir /s /b|findstr /v /i ".auf." >>"%Liste%"  

Grüße
bastla
Member: bastla
bastla Sep 25, 2007 at 10:44:42 (UTC)
Goto Top
... bzw etwas genauer (um wirklich nur ein ".auf." vor der Zahl am Ende zu erfassen):
for /f "delims=" %%i in ('dir /s /b') do for /f "delims=" %%d in ('echo %%~ni') do @if /i "%%~xd" neq ".auf" echo %%i >>"%Liste%"  

Grüße
bastla
Member: Biber
Biber Sep 25, 2007 at 10:45:04 (UTC)
Goto Top
Moin Saschbert,

die Wurzel allen Übels heißt wieder mal M$....- denen musst Du es noch langsamer erklären.

Funktionieren tut es (anscheinend) doch nicht so zuverlässig mit Wildcards, dafür aber so:

1. Eine Positiv-Liste mit "Dir /s /b" erzeugen.
2. Diese als EXCLUDE-Liste benutzen.

>dir /s /b .\*.auf.*>exclude.lst
(=12:34:54  D:\temp=)
>type exclude.lst
D:\temp\test.auf.12345678

(=12:35:07  D:\temp=)
>xcopy d:\temp\test*.* c:\temp /Exclude:exclude.lst  /L /s

Beim unteren XCopy-Ergebnis ist dann keine *.auf.*-Datei mehr dabei.
Wichtig scheint zu sein, dass -da ja in der mit TYPE angezeigten Liste auch der volle Pfad steht- beim XCopy /L -Befehl auch derselbe Pfad ("D:\Temp\") explizit mit angegeben wird.

Grüße
Biber
Member: Saschbert
Saschbert Sep 25, 2007 at 11:05:18 (UTC)
Goto Top
@bastla
Vielen Dank, Deine Version funktionierte. Habe Sie nur um /a-d ergänzt, um die Ordner nicht angezeigt zu bekommen.

@Biber
Auch Dir vielen Dank, aber ich nutze die Version von bastla, weil die so schön einfach ist, und funktioniert. Aber vielen Dank für die Mühe, die Du mit mir hattest.

@bastla&Biber
*knutsch*

@all
Anbei nochmal das kleine Script, das nun so, wie gewünscht, funktioniert (nur die wichtigen Zeilen!):
@echo off & setlocal

rem   Order der durchsucht werden soll, inkl. Unterordner
set "Ordner=E:\Allgemein\Daten\TA1\NEUE_Dateien\"  

rem   Pfad und Name zur Listendatei
set "Liste=E:\Allgemein\Daten\TA1\NEUE_Dateien\uebersehene_Dateien.txt"  

rem   Wenn die Listendatei besteht, wird sie vor dem Neuanlegen gelöscht.
if exist "%Liste%" del "%Liste%"  

rem   Selektion des Ergebnisses in die Listendatei, außer Ordnernamen
rem   und Dateien mit dem Inhalt ".auf." im Namen.  
dir /s /a-d /b|findstr /v /i ".auf." >>"%Liste%"  

Vielen Dank und lieben Gruß
Saschbert