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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 184160
Url: https://administrator.de/contentid/184160
Ausgedruckt am: 25.11.2024 um 05:11 Uhr
25 Kommentare
Neuester Kommentar
Aloha.
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é
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üssigJa, 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é
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:
Netzlaufwerke und/oder Bereitstellungspunkte vs. Stickkapazität beachten!
Freundliche Grüße von der Insel - Mario
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
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.
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:
fsutil benötigt Adminrechte, die wirst du ja sicher besitzen.
Gruß
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.
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ß
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
@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.
Gruß
.
Moin n3,
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.
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 Schreibweisewar 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
Zitat von @n3-narf:
@mak-xxl
Dein Code hatte noch zwei Fehler und jetzt funktioniert es wunderbar.
1. do if exist
@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
Freundliche Grüße von der Insel - Mario
Moin n3,
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.
Weil u.a. das falsch war und ist, kam auch mein Hinweis auf 'kleinere Korrekturen'.
... 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
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.
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
Hallo Mario!
Grüße
bastla
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
Moin n3-narf,
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:
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]
Zitat von @n3-narf:
Ja, habe eine Lösung die zwar nicht optimal ist, aber sie macht genau das was ich brauche Danke der Nachfrage!
Seufz...Ja, habe eine Lösung die zwar nicht optimal ist, aber sie macht genau das was ich brauche Danke der Nachfrage!
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".
"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
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
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
moin,
ich würde mich nicht damit abfinden wollen:
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.
PS:
Gruß Phil
ich würde mich nicht damit abfinden wollen:
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!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
Gruß Phil
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:
Grüße
Biber
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
Moin Phil,
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
Da jetzt
- (noch) nicht einleuchtet, warum ich die Ausgabe von
- relativ einfach auf Laufwerke resp. Junction-Points geprüft werden kann,
- mit dem
Ermitteln lokaler Laufwerke, auf die derzeit Zugriff möglich ist:
Ermitteln von Junction-Points, auf die derzeit Zugriff möglich ist:
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
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 ...
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
moin bastla,
Dann könntest Du ja noch den Hinweis mitgeben, dass dort in der Zeile 3 beim Teilstück
nach der Richtigen Datei gesucht werden muss.
Es geht aber bei mir nicht. Es wird nur C gefunden wenn ich diesen Sring weglasse.
@mario
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.
Jetzt weiss n3-narf auch wieviele verschiedene Laufwerkstypen von A-Z gefunden werden können.
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
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")
Then If fso.FileExists(D.DriveLetter^&":\Backup-LW.txt")
@mario
(noch) nicht einleuchtet, warum ich die Ausgabe von 'mountvol' auf Netzlaufwerke gegenprüfen sollte;
&net use
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
Hallo PH!
Eigentlich war ja der VBS-Teil nur als Ausgangspunkt für die erforderliche Anpassung (und nicht vorrangig für den TE ) gedacht - als fertiger Ansatz etwa:
Grüße
bastla
P.S.: Ich weiß, dass es in %Excl% auch einen ":" gibt - aber who cares ...
Eigentlich war ja der VBS-Teil nur als Ausgangspunkt für die erforderliche Anpassung (und nicht vorrangig für den TE ) 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
bastla
P.S.: Ich weiß, dass es in %Excl% auch einen ":" gibt - aber who cares ...