n3-narf
Goto Top

Rekursive suche nach bestimmten Datentypen

Hallo,

ich habe hier im Forum schon einige Beispiel zu ähnlichen Fragen gefunden, aber leider Lösung für mein spezielles "Problem".

Ich möchte gern ein Skript vom USB Stick starten und alle Laufwerke rekursiv nach bestimmten Datentypen durchsuchen. Dabei kommt es auf die Dateiendung und deren Größe an (z.B. jpg & jpeg die größer als 1024kb sind). Die gefundenen Daten sollen auf den USB-Stick mit der original Ordnerstruktur in den Ordner BACKUP kopiert werden. Es sei zu beachten, dass der Laufwerksbuchstabe sich ändern kann. Hier eignet sich vermutlich %CD:~0,3%.

Ich habe schon gelesen, dass häufig empfohlen wird erst mit DIR die Ausgabe in eine Datei umzulenken und diese dann zu verarbeiten. Welchen Vorteil hat dies gegenüber der sofortigen Abarbeitung?

Beste Grüße,
n3

Content-ID: 184160

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

Ausgedruckt am: 25.11.2024 um 05:11 Uhr

Skyemugen
Skyemugen 26.04.2012 um 12:57:31 Uhr
Goto Top
Zitat von @n3-narf:
Hallo,
Aloha.
ich habe hier im Forum schon einige Beispiel zu ähnlichen Fragen gefunden, aber leider Lösung für mein spezielles "Problem".
Ja, die Welt ist voller Spezialitäten ...
Ich möchte gern ein Skript vom USB Stick starten
Ein Glück, ich dachte schon, wir sollen dir mal eben eines zusammenkneten.
und alle Laufwerke rekursiv nach bestimmten Datentypen durchsuchen. Dabei kommt es auf die Dateiendung und deren Größe an (z.B. jpg & jpeg die größer als 1024kb sind).
Hm, noch nie dagewesen - neu und interessant ...
gefundenen Daten sollen auf den USB-Stick mit der original Ordnerstruktur in den Ordner BACKUP kopiert werden. Es sei zu beachten, dass der Laufwerksbuchstabe sich ändern kann. Hier eignet sich vermutlich %CD:~0,3%.
Original-Ordnerstruktur, bedeutet also auch einen Ordner %Laufwerksbuchstabe%, da sonst u.U. auf versch. Partitionen dieselbe Struktur vorhanden sein könnte(?)
Ich habe schon gelesen, dass häufig empfohlen wird
Stiftung Warentest?
erst mit DIR die Ausgabe in eine Datei umzulenken und diese dann zu verarbeiten. Welchen Vorteil hat dies gegenüber der sofortigen Abarbeitung?
In >90% aller Fälle gar keinen und ist meist völlig überflüssig

Ja, ja, ja, das ist keine Hilfe, ich trolle gerade mal wieder ... und warum? Wie viele Skripte hast du denn aus dem Forum herausfiltern können, welche hast du probiert? Evtl. versucht umzustricken? Wo genau hängt es jetzt, Räder sind rund und bleiben rund und davon haben wir so viele Stapelverarbeitungsdateien ...

greetz André
mak-xxl
mak-xxl 26.04.2012 um 13:14:16 Uhr
Goto Top
Moin n3,

ich (t)rolle mal 2 (ganz alte und folglich durch häufigen Gebrauch rund geschliffene) Stichwörter in die Arena:

- robocopy mit der Option /MIN:xxx [Bytes]

- for %i in (jpg tiff mpg) do ...

Viel Erfolg und freundliche Grüße von der Insel - Mario
n3-narf
n3-narf 26.04.2012 um 13:41:13 Uhr
Goto Top
OK, ich hätte meine aktuelle Lösung vielleicht schon anfügen sollen. Ich wollte aber nicht in eine bestimmte Richtung lenken. Hier mein aktuelles Skript:

@echo off

set SkriptLW=%CD:~0,2%


FOR %%i IN (\'A 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\') DO IF EXIST %%i: dir *.jpg *.jpeg /s /b %%i:\ > %SkriptLW%\Backup\liste.txt  
For /F "Delims=" %%N in (%SkriptLW%\Backup\liste.txt) do xcopy /Y /C /H /Y /J "%%N" %SkriptLW%\Backup\  

pause

Ob es funktioniert weiß ich nicht genau. Einen Probelauf würde ich erst dann machen, wenn ich sicher bin dann der Code richtig ist. Wie man aber sieht, gehe ich über eine externe Datei, was nicht schön ist. Ich weiß aber nicht, wie man es besser lösen kann.

OK, hier eine robocopy Version

@echo off

set SkriptLW=%CD:~0,2%

FOR %%i IN (\'A 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\') DO IF EXIST %%i: robocopy %%i:\ %SkriptLW%\Backup\ *.jpg *.jpeg /S /MIN:512000  

pause
mak-xxl
mak-xxl 26.04.2012 um 14:30:12 Uhr
Goto Top
Moin n3,

wenn Du vorab ohne Gefahr die Richtigkeit der resultierenden Befehle prüfen willst, stellst Du ein 'echo' vor den schlussendlichen Befehl (i.e. 'robocopy'), also etwa (mit anderen, kleinen Korrekturen und Ergänzungen) so:

for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if /i %%i: neq %ScriptLW% if exist %%i:\NUL echo robocopy %i: %ScriptLW%\Backup\%%i *.jpg *.jpeg /S /MIN:512000 /R:1 /W:1

Netzlaufwerke und/oder Bereitstellungspunkte vs. Stickkapazität beachten!

Freundliche Grüße von der Insel - Mario
106009
106009 26.04.2012 um 14:30:39 Uhr
Goto Top
Hi,

alle möglichen Laufwerke zu durchsuchen halte ich nicht für zielführend. Dazu müsste dann auch \' in der Klammer ersatzlos raus, das stört. face-smile

Vorschlag: Nur die tatsächlich vorhandenen Laufwerke ermitteln und dann die Variable "%Liste%" zur weiteren Verwendung nutzen, dann kannst du auf if exist %%i: auch verzichten:
@echo off & setlocal enabledelayedexpansion
set Liste=
for /F "delims=\" %%a in ('fsutil fsinfo drives ^| find ":"') do set "Liste=!Liste! %%a\"  
:: Im Anfang der Variablen steht noch "Laufwerke: ", das muss weg. Evtl. für die englischsprachige Version die Länge 12 entsprechend anpassen 
Set Liste=!Liste:~12!
@echo %liste%
pause

fsutil benötigt Adminrechte, die wirst du ja sicher besitzen.

Gruß
n3-narf
n3-narf 26.04.2012 um 15:25:28 Uhr
Goto Top
@106009
Ich versuche erst einmal die "einfachere" Variante. Deine Lösung verstehe ich nicht auf Anhieb und muss da noch etwas im Internet nachlesen

@mak-xxl
Dein Code hatte noch zwei Fehler und jetzt funktioniert es wunderbar.

1. do if exist
2. Anführungsstrihe beim Quellverzeichnis
FOR %%i IN (F G) DO IF /i %%i: neq %ScriptLW% do if exist %%i: robocopy %%i:\"%SkriptLW%\Backup\%%i" *.jpg *.jpeg /S /MIN:512000  

Danke für eure Hilfe!!
106009
106009 26.04.2012 um 15:37:45 Uhr
Goto Top
Zitat von @n3-narf:
@106009
Ich versuche erst einmal die "einfachere" Variante. Deine Lösung verstehe ich nicht auf Anhieb und muss da noch
etwas im Internet nachlesen

Die Erklärung ist verhältnismäßig einfach:
Der FSUTIL-Befehl gibt die Laufwerksbezeichnungen, die existieren, zwar in einer Zeile aus, allerdings mit einem Nullbyte hinter jedem Backslash, deshalb kann man die Variablen nicht weiterverarbeiten.
Mit meinem Script wird daraus eine Variable "Liste" erzeugt, die hinter jeden Pfadbezeichner noch ein Leerzeichen einfügt, so dass die Variable so verwendet werden könnte wie deine Eingabe von Hand in die Klammer. Und da die Ausgabe von fsutil noch ein "Laufwerk: " am Anfang der Zeile enthält, muss man diesen Anfang noch killen. Das ist eigentlich alles.
Das Aneinanderreihen von Werten innerhalb einer For-Schleife funktioniert nur mit der verzögerten Variablenverarbeitung enabledelayedexpansion, mit der man dann auch an Stelle des %-Zeichens das !-Zeichen verwenden kann.

Ich hoffe, das ist damit etwas klarer. face-wink

Gruß

.
mak-xxl
mak-xxl 26.04.2012 um 16:55:42 Uhr
Goto Top
Moin n3,

Zitat von @n3-narf:
@mak-xxl
Dein Code hatte noch zwei Fehler und jetzt funktioniert es wunderbar.
1. do if exist

In dem von mir geposteten Code stand und steht nur 1x 'do' - genau dort, wo es hingehört, als/an das Ende der 'for'-Schleife.

2. Anführungsstrihe beim Quellverzeichnis
> FOR %%i IN (F G) DO IF /i %%i: neq %ScriptLW% do if exist %%i: robocopy %%i:\"%SkriptLW%\Backup\%%i" *.jpg *.jpeg /S /MIN:512000
> 

Es gibt in meinem Post kein Quellverzeichnis, sondern nur ein Quellaufwerk (durch '%%i:' repräsentiert), selbiges braucht keine Literale; - die von Dir im eigenen Post gesetzten Literale umschließen das Zielverzeichnis '%ScriptLW&\Backup\%%i' - und das braucht, wenn es keine Leerzeichen enthält, auch keine einschließenden Literale - also habe ich es genau so gepostet.
Diese Zeile Code wird so außerdem nicht funktionieren, weil zwischen Quelle ('%%i:') und Ziel ("%SkriptLW%\Backup\%%i") das Leezeichen fehlt.

BTW: Die Schreibweise
if exist %%i:\NUL
war ebenfalls nicht ohne Grund gewählt, damit werden Laufwerke ohne Medium (CD, REV etc.) automatisch übersprungen, deshalb am Ende des Posts nur der Hinweis auf Netzlaufwerke und Junction-Points.

Freundliche Grüße von der Insel - Mario
n3-narf
n3-narf 26.04.2012 um 18:25:31 Uhr
Goto Top
Wenn ich das do weglasse, dann kommt folgender Fehler

Der Befehl "exist" ist entweder falsch geschrieben oder konnte nicht gefunden werden.

Im meinem vorherigen Post steht es auch zweimal da: DO IF und DO IF EXISTS. Mit 2x do, funktioniert der Code einwandfrei. Das \NUL habe ich tatsächlich vergessen. Danke für den Hinweis.

@106009
Danke für die Erklärung. Zwar prüft deine Variante nur existierende Laufwerke, benötigt aber Adminrechts. Ich bevorzuge daher lieber den Code, der ohne auskommt.
mak-xxl
mak-xxl 26.04.2012 um 19:56:47 Uhr
Goto Top
Moin n3,

Zitat von @n3-narf:
Wenn ich das do weglasse, dann kommt folgender Fehler
> Der Befehl "exist" ist entweder falsch geschrieben oder konnte nicht gefunden werden.

Ja gewiss, wenn die 'for'-Schleife nicht mit 'do' abgeschlossen wird, kommt die Fehlermeldung. Und wenn Du aus meinem Post die Sequenz 'do if /i %%i: neq %ScriptLW%' herausnimmst, rückt das nächste 'if' ans Ende der Schleife - und ergibt folgerichtig einen Fehler.

Im meinem vorherigen Post steht es auch zweimal da: DO IF und DO IF EXISTS.

Weil u.a. das falsch war und ist, kam auch mein Hinweis auf 'kleinere Korrekturen'.

Mit 2x do, funktioniert der Code einwandfrei. Das ...

... halte ich für ein Gerücht, ein einzelnes (weiteres) 'do' ergibt den Fehler 'Der Befehl "do" ist entweder falsch geschrieben oder ...'

BTW: Was schnelleren Code betrifft: <fsutil.exe> ist ein externer Befehl, der für jedes einzelne Laufwerk (A-Z) eine Meldung ausgibt, die (weiter verarbeitbare) Kennzeichnung auf Existenz muss aber nochmals erfolgen - und dazu dient der zusätzliche, wiederum externe Befehl <findstr.exe>, der die Ausgabestrings von <fsutil> nach einem Doppelpunkt filtert, der nur bei existierenden Laufwerken im Ausgabestring auftaucht - soviel dazu.

Das verwenden wirklich 'sinnvoller' Laufwerksbuchstaben (also solcher, mit denen ein Laufwerk existiert und auch vermutete Daten enthält), schafft hier größeren Überblick und schnelleren Code.

Wenn es um eine Art 'Universalität' geht, dann kann man beispielsweise zu Beginn des Scriptes eine Variable mit Laufwerksbuchstaben füllen, die etwa von dem Konstrukt 'fsutil fsinfo drivetype', gefiltert nach dem Wort 'Eingebautes' nur mit den Buchstaben gesetzt wird, die Festplatten/Partitionen darstellen - alle CD-ROMs oder etwa Netzlaufwerke bleiben draußen. Diese Liste kann man wiederum, u.U. ohne weitere Überprüfung, per 'for'-Schleife mit robocopy verarbeiten.
Die Sequenz 'if /i %%i: neq %ScriptLW%' war übrigens (aus Gründen ebendieser Universalität) drin, damit <robocopy> nicht den Inhalt des Sticks kopierenswert interessant findet ...

Freundliche Grüße von der Insel - Mario
bastla
bastla 27.04.2012, aktualisiert am 18.10.2012 um 18:50:45 Uhr
Goto Top
Hallo Mario!
Wenn es um eine Art 'Universalität' geht, dann kann man beispielsweise zu Beginn des Scriptes eine Variable mit Laufwerksbuchstaben füllen, die etwa von dem Konstrukt 'fsutil fsinfo drivetype', gefiltert nach dem Wort 'Eingebautes' nur mit den Buchstaben gesetzt wird, die Festplatten/Partitionen darstellen
Dann aber vielleicht lieber doch eine VBS-Variante (kommt ohne Admin-Rechte aus) - als Basis etwa wie hier ...

Grüße
bastla
pieh-ejdsch
pieh-ejdsch 02.05.2012 um 14:59:43 Uhr
Goto Top
moin,

Bei der Zeile wird mir bissel mulmig.
set SkriptLW=%CD:~0,2%
Wenn Du Dich zum Testen auf der CMD-Line im Falschen Pfad befindest.

Besser ists, den Batchpfad aus dem Batchparameter zu benutzen.
set "SkriptLW=%~d0\"

Gruß Phil
Dani
Dani 04.05.2012 um 00:11:04 Uhr
Goto Top
Moin,
wie schaut's aus n3-narf, kommst du voran?


Grüße
n3-narf
n3-narf 06.05.2012 um 17:01:51 Uhr
Goto Top
Ja, habe eine Lösung die zwar nicht optimal ist, aber sie macht genau das was ich brauche face-smile Danke der Nachfrage!
bastla
bastla 06.05.2012 um 17:06:37 Uhr
Goto Top
[OT]
Hallo n3-narf!
Lösung die zwar nicht optimal ist, aber sie macht genau das was ich brauche face-smile
Wäre denn diese - nicht dargestellte - Lösung nur optimal, wenn sie nicht genau machen würde, was Du brauchst? face-wink

Grüße
bastla
[/OT]
Biber
Biber 06.05.2012 um 18:53:47 Uhr
Goto Top
Moin n3-narf,

Zitat von @n3-narf:
Ja, habe eine Lösung die zwar nicht optimal ist, aber sie macht genau das was ich brauche face-smile Danke der Nachfrage!
Seufz...

Da muss ich wohl etwas weiter ausholen, wie ein Forum funktioniert...

Wenn hier jemand eine Frage stellt, dafür ein paar hilfreiche Lösungsansätze gereicht bekommt von Samaritern, die sich freiwillig zusätzlich zu den eigenen Problemen noch die Probleme eines n3-narfs zu eigen machen...
Wenn der Fragesteller dann eine Lösung findet für dieses mittlerweile einer Handvoll Empathisanten den Schlaf raubende Problem...

Dann wäre es eigentlich selbstverständlich, diese Lösung der Allgemeinheit.... Nein, lass es mich anders ausdrücken.

In der Wikipedia steht auch einiges zum Thema Lösungen , unter anderem folgendes:
Ist in einer Lösung so viel wie möglich des Stoffes gelöst, ist die Lösung gesättigt; wird jetzt weiterer Stoff zur Lösung gegeben, führt dies zur Bildung eines Bodensatzes.

Ergänzend zur Wikipedia:
Falls die "Lösung" in diesem Beitrag nicht etwas angereichert wird vorzugsweise durch den Codeschnipsel, der das Problem nun für dich behebt, dann landet dieser Beitrag in Bereich "Bodensatz".

Immer wieder beeindruckt von der Vielfältigkeit der Lebensformen in diesem Zweigarm der Galaxie [Edit]das könnte zu hart klingen[/Edit]

"Herr, wie zahlreich sind deine Werke! Mit Weisheit hast du sie alle gemacht, die Erde ist voll von deinen Geschöpfen." (Psalm 104.24 gem. Einheitsübersetzung)
Biber
n3-narf
n3-narf 06.05.2012 um 19:50:21 Uhr
Goto Top
@Biber,
Tut mir leid, aber ich ging davon aus, dass die Lösung klar wäre, da sie ja bereits oben gepostet wurde. Ich hole es aber gern noch einmal nach:

@echo off

set SkriptLW=%CD:~0,2%

FOR %%i IN (A 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) DO IF /i %%i: neq %ScriptLW% do if exist %%i:\NUL robocopy %%i:\ "%SkriptLW%\Backup\%%i" *.tmp *.dat /S /MIN:512000

pause
In diesem Beispiel werden alle dat und tmp Dateien gesucht, die größer sind als 512kb. Das Skript wird als bat Datei von einem USB Stick gestartet und funktioniert soweit.

Danke noch einmal an alle die mir geholfen haben.
Biber
Biber 06.05.2012 um 20:00:16 Uhr
Goto Top
Moin n3-narf,

danke dir für die schnelle Reaktion und Lösungsbereit- bzw. Richtigstellung.

Ich denke, bastla wird auch auf weitere Betrachtungen von nicht optimalen funktionierenden Lösungen im Vergleich zu optimalen nicht funktionierenden Lösungen an dieser Stelle verzichten können - damit ist der Beitrag dann richtigerweise als "gelöst" markiert.

Schönen Abend und danke
Biber
bastla
bastla 06.05.2012 um 21:35:32 Uhr
Goto Top
bastla wird auch auf weitere Betrachtungen von nicht optimalen funktionierenden Lösungen im Vergleich zu optimalen nicht funktionierenden Lösungen an dieser Stelle verzichten können
Amen.

Grüße
bastla
pieh-ejdsch
pieh-ejdsch 07.05.2012 um 11:52:42 Uhr
Goto Top
moin,

ich würde mich nicht damit abfinden wollen:
Zitat von @mak-xxl:
BTW: Die Schreibweise
if exist %%i:\NUL
war ebenfalls nicht ohne Grund gewählt, damit werden Laufwerke ohne Medium (CD, REV etc.) automatisch übersprungen, deshalb am Ende des Posts nur der Hinweis auf Netzlaufwerke und Junction-Points.

Ob mit oder ohne nul - bei mir sind da immer die Meldungen gekommen, dass sich kein Datenträger im Laufwerk befindet.
Ist doch sehr Automatisch ...

Wenn mit dir oder vol (auf alle Fälle ohne nul) getestet wird kommt diese Meldung nicht.
Zumal könnte noch Unterschieden werden in Vorhandene Lokale und Vorhandene gemappte Laufwerke.
Das Equipment ist ja net umsonst da.

von nicht optimalen funktionierenden Lösungen im Vergleich zu optimalen nicht funktionierenden Lösungen
Nur für die Sammlung:
for /f "delims=\ " %%i in ('mountvol ^|find ":\" ^|sort ^&net use ^|find ":" ') do @if %%i neq %~d0 vol %%i 2>nul 1>&2 && echo Laufwerk %%i wird untersucht.  

PS:
Zitat von @n3-narf:
Tut mir leid, aber ich ging davon aus, dass die Lösung klar wäre, da sie ja bereits oben gepostet wurde. Ich hole es aber gern noch einmal nach:
FOR %%i IN (A 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) DO IF /i %%i: neq %ScriptLW% do
Und täglich grüßt das Murmeltier!

Gruß Phil
Biber
Biber 07.05.2012 um 12:17:22 Uhr
Goto Top
Moin pieh-ejdsch,

dann möchte ich bei deiner Mountvol+Net Use-Variante aber anmerken, dass eventuelle per SUBST definierte Laufwerke nicht bemerkt werden.

Im Gegensatz zu ollidollis Lösung mit fsutil.
Beispielkonstellation an meinem Notebook mit CD, ein paar USB-Einheiten, zwei SUBST-Laufwerken und ohne verbundene Netzlaufwerke..
Demo am CMD-Prompt:
>mountvol |find ":\"
        C:\
        D:\
        E:\
        H:\
        G:\
        J:\
        I:\
        F:\

(=12:11:42  d:\temp=)
>net use
Neue Verbindungen werden gespeichert.

Es sind keine Einträge in der Liste.

> subst
B:\: => D:\Biber\work
K:\: => D:\Biber\archiv

(=12:12:49  d:\temp=)
>fsutil fsinfo drives

Laufwerke: B:\ C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\

Grüße
Biber
mak-xxl
mak-xxl 07.05.2012 um 12:41:40 Uhr
Goto Top
Moin Phil,

Zitat von @pieh-ejdsch:
Ob mit oder ohne nul - bei mir sind da immer die Meldungen gekommen, dass sich kein Datenträger im Laufwerk befindet.
Ist doch sehr Automatisch ...

Danke für den Hinweis. Ich selbst habe in dem mir zur Verfügung stehenden Rechner-Umfeld bisher keine Probleme mit der Prüfung auf das NUL-Device gehabt. Du hast aber Recht, dieses Vorgehen wird auf manchen Plattformen mit einer Fehlermeldung bestraft.

Der 'dir'-Befehl ist aus meiner Sicht dem 'vol'-Befehl vorzuziehen, da hierbei neben der Laufwerksangabe ein Pfad mit übergeben werden kann, so sind Junction-Points gleich mit zu behandeln. Ein 'vol A:\' gibt eben nicht den gewünschten Fehlerpegel zurück - ein 'vol A:' schon ...

Nur für die Sammlung: ...

Da jetzt 'mountvol' wieder salonfähig ist (wegen benötigter Adminrechte war die for-Schleife favorisiert worden), würde ich folgende Lösung anmerken, da mir:
- (noch) nicht einleuchtet, warum ich die Ausgabe von 'mountvol' auf Netzlaufwerke gegenprüfen sollte;
- relativ einfach auf Laufwerke resp. Junction-Points geprüft werden kann,
- mit dem 'dir'-Befehl die Ausgabe direkt verarbeitet werden kann (Grund: s.o.).

Ermitteln lokaler Laufwerke, auf die derzeit Zugriff möglich ist:
@for /f %%i in ('mountvol ^| findstr ":\\$"') do @dir %%i 2>nul 1>&2 && @echo %%i

Ermitteln von Junction-Points, auf die derzeit Zugriff möglich ist:
@for /f %%i in ('mountvol ^| findstr ":\\."') do @dir %%i 2>nul 1>&2 && @echo %%i

So, Phil, Du bist auch so einer (neben den beiden BiBa-Buben), dessen Beiträge mir seit Jahren den Blick auf die Dinge geschärft haben - vielen Dank dafür.

Freundliche Grüße von der Insel - Mario
bastla
bastla 07.05.2012, aktualisiert am 18.10.2012 um 18:50:49 Uhr
Goto Top
Hallo @all!

Na dann weise ich auch noch mal dezent (so wie da VBS-Variante hin ... face-wink

Grüße
bastla
pieh-ejdsch
pieh-ejdsch 07.05.2012 um 16:16:55 Uhr
Goto Top
moin bastla,

Dann könntest Du ja noch den Hinweis mitgeben, dass dort in der Zeile 3 beim Teilstück
Then If fso.FileExists(D.DriveLetter^&":\PStart.Exe")
nach der Richtigen Datei gesucht werden muss.
Then If fso.FileExists(D.DriveLetter^&":\Backup-LW.txt")
Es geht aber bei mir nicht. Es wird nur C gefunden wenn ich diesen Sring weglasse.

@mario
(noch) nicht einleuchtet, warum ich die Ausgabe von 'mountvol' auf Netzlaufwerke gegenprüfen sollte;
&net use
Netzlaufwerke werden ergänzt. Ist aber ein guter Hinweis:
In der For Version mit abklappern aller Buchstaben ist nicht von vornherein geklärt, ob es sich um Lokale oder gemappte LW handelt.
Wenn dann noch extra (wie bei Biber) nach zugewiesenen subst LW-Buchstaben gesucht wird, welche Ohnehin schon irgendwo gemountet sein müssen, müsste eine Prüfung auf LW her, welche Lokal schon irgendwie als Pfad vorhanden sind.
Auch bei Netzwerk-LW-Buchstaben.

Ich möchte gern ein Skript vom USB Stick starten und alle Laufwerke rekursiv nach bestimmten Datentypen durchsuchen.
An der Büchse sollten vielleicht nur Lokale LW Durchsucht werden.

Jetzt weiss n3-narf auch wieviele verschiedene Laufwerkstypen von A-Z gefunden werden können.
dass eventuelle per SUBST definierte Laufwerke nicht bemerkt werden.
Zum Glück - Nicht dass mal was doppelt gesichert wird.

Nachtrag:
Sobald in der Forschleife zur existenzPrüfung mit dir oder vol anstatt %%i die For-Variable zu %%~di expandiert wird, erscheint auch die Fehlermeldung: "Es befindet sich kein Datenträger im Laufwerk."

Gruß Phil
bastla
bastla 07.05.2012 um 18:13:08 Uhr
Goto Top
Hallo PH!

Eigentlich war ja der VBS-Teil nur als Ausgangspunkt für die erforderliche Anpassung (und nicht vorrangig für den TE face-wink) gedacht - als fertiger Ansatz etwa:
@echo off & setlocal
setlocal enabledelayedexpansion
set "Excl=%~d0"  
for /f "delims=:" %%i in ('subst') do set "Excl=!Excl!%%i"  
endlocal & set "Excl=%Excl%"  
set "G=%temp%\GetDriveLetters.vbs"  
>"%G%" echo Set fso=CreateObject("Scripting.FileSystemObject"):For Each D In fso.Drives:If D.DriveType=2 Then:If D.IsReady Then:WScript.Echo D.DriveLetter:End If:End If:Next  
for /f %%i in ('cscript //nologo "%G%"') do echo %Excl%|findstr /iv %%i>nul && echo %%i  
Grüße
bastla

P.S.: Ich weiß, dass es in %Excl% auch einen ":" gibt - aber who cares ... face-wink