Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Rekursive suche nach bestimmten Datentypen

Frage Entwicklung Batch & Shell

Mitglied: n3-narf

n3-narf (Level 1) - Jetzt verbinden

26.04.2012, aktualisiert 18.10.2012, 3667 Aufrufe, 25 Kommentare

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
Mitglied: Skyemugen
26.04.2012 um 12:57 Uhr
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é
Bitte warten ..
Mitglied: mak-xxl
26.04.2012 um 13:14 Uhr
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
Bitte warten ..
Mitglied: n3-narf
26.04.2012 um 13:41 Uhr
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:

01.
@echo off 
02.
 
03.
set SkriptLW=%CD:~0,2% 
04.
 
05.
 
06.
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 
07.
For /F "Delims=" %%N in (%SkriptLW%\Backup\liste.txt) do xcopy /Y /C /H /Y /J "%%N" %SkriptLW%\Backup\ 
08.
 
09.
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

01.
@echo off 
02.
 
03.
set SkriptLW=%CD:~0,2% 
04.
 
05.
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 
06.
 
07.
pause
Bitte warten ..
Mitglied: mak-xxl
26.04.2012 um 14:30 Uhr
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
Bitte warten ..
Mitglied: 106009
26.04.2012 um 14:30 Uhr
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:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set Liste= 
03.
for /F "delims=\" %%a in ('fsutil fsinfo drives ^| find ":"') do set "Liste=!Liste! %%a\" 
04.
:: Im Anfang der Variablen steht noch "Laufwerke: ", das muss weg. Evtl. für die englischsprachige Version die Länge 12 entsprechend anpassen 
05.
Set Liste=!Liste:~12! 
06.
@echo %liste% 
07.
pause
fsutil benötigt Adminrechte, die wirst du ja sicher besitzen.

Gruß
Bitte warten ..
Mitglied: n3-narf
26.04.2012 um 15:25 Uhr
@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
01.
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!!
Bitte warten ..
Mitglied: 106009
26.04.2012 um 15:37 Uhr
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.

Gruß

.
Bitte warten ..
Mitglied: mak-xxl
26.04.2012 um 16:55 Uhr
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
Bitte warten ..
Mitglied: n3-narf
26.04.2012 um 18:25 Uhr
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.
Bitte warten ..
Mitglied: mak-xxl
26.04.2012 um 19:56 Uhr
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
Bitte warten ..
Mitglied: bastla
27.04.2012, aktualisiert 18.10.2012
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
Bitte warten ..
Mitglied: pieh-ejdsch
02.05.2012 um 14:59 Uhr
moin,

Bei der Zeile wird mir bissel mulmig.
01.
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
Bitte warten ..
Mitglied: Dani
04.05.2012 um 00:11 Uhr
Moin,
wie schaut's aus n3-narf, kommst du voran?


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

Grüße
bastla
[/OT]
Bitte warten ..
Mitglied: Biber
06.05.2012 um 18:53 Uhr
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 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
Bitte warten ..
Mitglied: n3-narf
06.05.2012 um 19:50 Uhr
@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.
Bitte warten ..
Mitglied: Biber
06.05.2012 um 20:00 Uhr
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
Bitte warten ..
Mitglied: bastla
06.05.2012 um 21:35 Uhr
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
Bitte warten ..
Mitglied: pieh-ejdsch
07.05.2012 um 11:52 Uhr
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:
01.
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
Bitte warten ..
Mitglied: Biber
07.05.2012 um 12:17 Uhr
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
Bitte warten ..
Mitglied: mak-xxl
07.05.2012 um 12:41 Uhr
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
Bitte warten ..
Mitglied: bastla
07.05.2012, aktualisiert 18.10.2012
Hallo @All!

Na dann weise ich auch noch mal dezent (so wie da oben) auf eine VBS-Variante hin ...

Grüße
bastla
Bitte warten ..
Mitglied: pieh-ejdsch
07.05.2012 um 16:16 Uhr
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
Bitte warten ..
Mitglied: bastla
07.05.2012 um 18:13 Uhr
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:
01.
@echo off & setlocal 
02.
setlocal enabledelayedexpansion 
03.
set "Excl=%~d0" 
04.
for /f "delims=:" %%i in ('subst') do set "Excl=!Excl!%%i" 
05.
endlocal & set "Excl=%Excl%" 
06.
set "G=%temp%\GetDriveLetters.vbs" 
07.
>"%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 
08.
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 ...
Bitte warten ..
Neuester Wissensbeitrag
Festplatten, SSD, Raid

12TB written pro SSD in 2 Jahren mit RAID5 auf Hyper-VServer

Erfahrungsbericht von Lochkartenstanzer zum Thema Festplatten, SSD, Raid ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...