klausph
Goto Top

Wie erkennt man automatisch den Laufwerksbuchstaben des gerade angeschlossenen Laufwerkes?

Guten Tag
schon lange arbeite ich mit einem Skript, das auf dem guten alten DOS basiert, und von cmd's aus der win8-welt (auch 64bit) verstanden werden.
Sinn des Skriptes ist es, Daten zu sichern. Auf ein externes Laufwerk, oder auf ein freigegebenes Laufwerk oder oder. Auf alles, was einen Laufwerksbuchstaben hat. z.B. auch auf einen USB-Stick oder ein USB-Festplattenlaufwerk.


Arbeitsaufgabe des Skriptes:
eine transparente Datensicherung durchzuführen. Egal, wer am PC sitzt (=userunabhängig) UND betriebssystemunabhängig. Es funktioniert ab Windows2000 (vermutlich auch ab NT3.x). Es werden die cmd-internen Befehlsteile benutzt, sowie die externen Tools, die zum Betriebssystem gehören, wie xcopy.exe (in bestimmten Fällen auch robocopy.exe; das Vorhandensein dieses sehr guten commandozeilen-Tools wird abgefragt, und nach den Ergebnissen der Errorlevels eingesetzt.


Mein Problem ist folgendes:
ich weiss nie, was z.B. das externe Laufwerk, was der Benutzer da an seinen PC anschliesst, für einen Laufwerksbuchstaben bekommt.
Das Problem habe ich immer so umgegangen, in dem ich dem angeschlossenen Laufwerk in der Systemsteuerung-Verwaltung-Computerverwaltung dem neu hinzugekommen Medium explicit ein Z: verpasse. Das klappt insofern gut, der Rechner merkt(!) sich den Laufwerkbuchstaben. Problematisch wird es z.B. DANN, wenn der Benutzer 2(!) verschiedene externe Festplatten benutzen will. Dann iss essich! Der Rechner vergisst, wem es das Z: zugeweisen hat, und teilt beim nächsten Laufwerkswechsel ihm den nächsten freien Buchstaben zu: e: oder f: oder wasweissich.

Meine internen Werkzeuge: ich benutze die (seltener!)command.com, fast immer die cmd.exe, und wenn vorhanden robocopy.exe auf den Windowsrechnern. ich benutze NICHT und werde es auch NICHT: irgendwelche shellskripte, die externe Tools oder Programme benötige, oder Visualbasicskripte. WARUM nicht, werde einige fragen (denn damit würden sich bestimmt einige Probleme lösen lassen face-wink ? Ganz einfach: zu VB benötige ich runtimeModule, zu anderen Lösungsansätzen eben externe (betriebsystemABHÄNGIGE Tools. Ich will NUR das benutzen, was von Natur aus auf dem Rechner drauf ist. Und einen Rechner OHNE command.com bzw cmd.exe gibt es NICHT face-wink [lassen wir mal 4dos.exe weg, und os2, sowie die dosbox[opensource] weg!]


So sieht der einleitende Teil des Skriptes aus:

rem oder als externesLW an Client angeschlossen
set freigabe=z:
if exist \\QNAP\server set freigabe=\\QNAP\server
if exist \\CHEF\externHD set freigabe=\\CHEF\externHD
if exist \\BUERO-PC1\backup set freigabe=\\BUERO-PC1\backup
if exist \\LS-CHL-V21CD\share set freigabe=\\LS-CHL-V21CD\share
if exist \\MATZE-PC\Z set freigabe=\\MATZE-PC\Z
if exist \\CARMEN-PC\Z-Backup set freigabe=\\CARMEN-PC\Z-Backup
if "%COMPUTERNAME%"=="OBERMANN-PC" set freigabe=z:
if "%COMPUTERNAME%"=="FROSCH-NB" set freigabe=z:
if "%COMPUTERNAME%"=="NAGEL-PC" set freigabe=z:

Ich erkläre es mal mit meinen eigenen Worten:
das Ziel ist IMMER z:
Die Ausnahmen sind darunter notiert:
a. ist der Rechner in meinem Netz angeschlossen, dann ist meine NAS(=QNAP) das Ziellaufwerk. Ein angeschlossenes Z:-Laufwerk wird ignoriert.
b. gibt es bei den Rechnern da draussen irgendwelche Netzwerklaufwerke,also Besonderheiten, gibt es solche Regeln:
if exist \\CARMEN-PC\Z-Backup set freigabe=\\CARMEN-PC\Z-Backup
if "%COMPUTERNAME%"=="OBERMANN-PC" set freigabe=z:
Die letzte Regel ist also die zuletzt gültigste!
das funktioniert GANZ prima.

Was auch funktioniert:
ich frage die 32bit- oder die 64bit-Version des Betriebssystems ab. Ich frage das Betriebssystem ab. Je nachdem, was als Antwort kommt, weiss ich wo die Firefox-Daten liegen, OutlookExpress. oder oder oder.


Mein Wunsch:
wie erkennt man automatisch, welchen Laufwerksbuchstaben die GERADE angeschlossene externe USB-Festplatte bekommt?
Das hätte DEN Vorteil: mir ist es egal, wie die laufwerksbuchstabenverteilung ist. wenn der PC-Benutzer 2 verschiedene Datensicherungsinstrumente benutzen will, kann er das. z.b. Platte I für die geraden Wochen. Platte II für die ungeraden Wochen.


Wäre das ein Lösungsansatz?

for %%a 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: zface-smile DO if exist %%a\_eine_bestimmte_datei set freigabe=%%a:
NICHT getestet. nur in gedanken formuliert....
ich erinnere mich, das man ein Laufwerk NICHT nach einer Datei abfragen kann, wenn es NICHT existiert!
Oder? Das war doch mit Diskettenlaufwerken so. OK. Oben könnte man also a und b rausnehmen....
UND: kleiner nachteil: es muss eine Art


Wer weiss was?
Danke fürs Mitlesen und Gruß zum Sonnabend
Euer Klaus(i)


PS: aus Respekt vor dem Forum schreibe ich in der gewünschten Orthographie. Ansonsten schreibe ich NIE mit korrekter Rechtschreibe (=klainundGROSSschreibungk) face-wink
Dieses Forum hat mir schon einige Gedankenansätze gegeben, die ich gut anwenden konnte. Danke den unbekannten Beiträgern. Nebenbei: wenn ich fremdes Eigentum verwende !und !diejenigen es freigegeben haben, dann nenne ich auch die Copyright-Quelle. Ist Ehrensache!

Content-Key: 230766

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

Printed on: April 19, 2024 at 05:04 o'clock

Member: Sheogorath
Sheogorath Feb 22, 2014 at 21:16:50 (UTC)
Goto Top
Moin,

ich persönlich weise per Script softwarebuchstaben per Registry zu. Wenn du den Key exportiert und dann eine Diffenenzanalyse machst, könnte das funktionieren:

"HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices"

du musst natürlich schauen, dass es auch auf Windows 98 noch klappt, aber ich könnte es mir gut vorstellen.

solltest du mit "fc" als Befehl schaffen können.

Gruß
Chris
Member: pieh-ejdsch
pieh-ejdsch Feb 22, 2014 updated at 22:18:53 (UTC)
Goto Top
moin,

mit IF exist geht es in die Grütze, wenn kein Medium im Laufwerk ist. Dann nervt erstmal eine Klickbox. Ordner suchen
vol und dir machen da eine Ausnahme.
for /f "delims=\ " %%i in ('"mountvol|find ":\"|sort"') do @vol %%i 2>nul >nul && find "Backup-SET-01" %%i\Backup.ini && set freigabe=%%i  

Verwendbar sind auch noch vol Volumename; Seriennummer; wmic abfragen etc.

Gruß Phil
Member: Endoro
Endoro Feb 22, 2014 at 22:25:49 (UTC)
Goto Top
Hey,

Zitat von @pieh-ejdsch:

wmic abfragen etc.
das war auch meine Idee. Allerdings ist das erst ab XP Prof. an Board.
Gruss.
Member: TsukiSan
TsukiSan Feb 22, 2014 at 23:51:58 (UTC)
Goto Top
Hallo klausph,

eventuell hilft dir
fsutil fsinfo drivetype C:
bei deinem Vorhaben weiter.

Viele Grüsse

Tuski
Member: klausph
klausph Feb 24, 2014 at 13:47:34 (UTC)
Goto Top
guten tag den fleissigen beantworten
da sind sehr interessante ansätze.
danke erstmal!
ich melde, wenn ich mehr weiss.
kurzkomment: pieh eitsch hat völlig recht: mit "dir" kommt man nicht weiter. das hat mich damals schon sehr geärgert.
gruß klaus(i)
Member: klausph
klausph Feb 26, 2014 at 22:12:39 (UTC)
Goto Top
danke christoph
für deinen tip muss ich wissen, wie man in die registry kommt. hm, das habe ich mal gerade gemacht. das was da für c: und g: (auf letzterem ist mein testlaufwerk) notiert ist, macht mir nicht gerade mut. klar mit fc würde man später weiterkommen. danke. leider nix für mich.
gruß, klaus
Member: klausph
klausph Feb 26, 2014 at 22:22:19 (UTC)
Goto Top
Guten Tag Tsuki (San),
fsutil mit "seinen Parametern" gefällt mir richtig gut. Bin derzeit in Dortmund, und habe nur einen win7-prof-Laptop dabei. Wxp kann ich also nicht abprüfen.
Wenn ich mit fsutil weitermachen kann, dann muss es in wxp vorhanden sein. Deshalb konzentriere ich mich auf den Lösungsansatz von pieh-ejdsch.

Nur mal trotzdem weitergedacht:
"fsutil fsinfo drivetype" müsste man in eine for-Schleife setzen, alle Laufwerksbuchstaben abfragen. Dann den errorlevel ausforschen. Bei positivem errorlevel zusätzlich einen dir-Befehl absetzen, weil auf dem Datenträger irgendeine bestimmte Datei sein muß. Wenn positiv, dann könnte man %freigabe% definieren.

In der Antwort an pieh-ejdsch gehe ich noch mehr darauf ein.
Danke für die Hilfe!
Gruß Klaus
Member: klausph
klausph Feb 26, 2014 at 22:44:03 (UTC)
Goto Top
Zitat von @pieh-ejdsch:
moin,
mit IF exist geht es in die Grütze, wenn kein Medium im Laufwerk ist. Dann nervt erstmal eine Klickbox.
Ordner suchen
vol und dir machen da eine Ausnahme.
> for /f "delims=\ " %%i in ('"mountvol|find ":\"|sort"') do @vol %%i 2>nul >nul  
> && find "Backup-SET-01" %%i\Backup.ini && set freigabe=%%i  
> 
....
Gruß Phil

Guten Abend Phil,
DANKE. Ich verstehe die for-Schleife nicht völlig, aber sie funktioniert! Bravo! face-wink
ich habe mich jetzt für folgende Lösung entschieden:

for /f "delims=\ " %%i in ('"mountvol|find ":\"|sort"') do @vol %%i 2>nul >nul && find "Backup-SET-01" %%i\allegronet-backup.cmd && set freigabe=%%i

if exist \\QNAP\server set freigabe=\\QNAP\server

if not exist c:\_install md c:\_install
copy "%freigabe%\allegronet-backup.cmd" c:\_install
copy "%freigabe%\allegronet-backup.cmd" "%userprofile%\desktop"

die letzten 3 Zeilen des Skriptes "allegronet-backup.cmd" (Umfang 100kb) haben folgenden Sinn:
1. Es wird eine Sicherheitskopie nach c:\_install kopiert [bald wird hier %systemdrive% verwendet werden!]
2. Das Skript selber, welches ja aufgerufen wurde, wird auf den Desktop des aktiven User kopiert. Dort kann es dann später aufgerufen werden.
Ich halte es für die einfachste Art das Skript zu istallieren: dem Benutzer es in "die Hand zu drücken", ihn zu bitten, es auf den Datenträger zu kopieren und von dort aus aufzurufen, erscheint mir die einfachste. Es "installiert sich dann selber" auf den aktuellen Desktop.

Nachgefragt:
&& find "Backup-SET-01
das verstehe ich nicht. Er sucht den String ""Backup-SET-01", es ist egal, ob er ihn findet oder nicht. Richtig?
OHNE DAS && find "Backup-SET-01" würde das Skript nicht funktionieren (habe ich schon probiert face-wink.

DANKE! Ihr habt mir eine großes Problem gelöst:
ich muß mich nicht um die Festlegung von z: kümmern. (Wie leicht kann z: verloren gehen!...)
Und: mein (altes) Skript funktionierte, wenn 2 verschiedene Datensicherungslaufwerke benutzt wurden.
PRIMA. GANZ GROSSE KLASSE1

gruß vom klaus(i)
Member: TsukiSan
TsukiSan Feb 27, 2014 at 02:29:50 (UTC)
Goto Top
Hallo Klaus,

pieh-ejdsch Script bringt dich sicherlich weiter.
Aber interessehalber hier das "eingeworfene" mal in einer simplen Schleife (als Array)
@Echo Off
Set MeinArray="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:"  

for %%i in (%MeinArray%) do Echo %%i && fsutil fsinfo drivetype %%i
pause

Viele Grüsse und viel Erfolg

Tsuki
Member: klausph
klausph Mar 01, 2014 at 13:48:00 (UTC)
Goto Top
Zitat von @TsukiSan:
Hallo Klaus,
pieh-ejdsch Script bringt dich sicherlich weiter.
Aber interessehalber hier das "eingeworfene" mal in einer simplen Schleife (als Array)
> @Echo Off
> Set
> MeinArray="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:"  
> 
> for %%i in (%MeinArray%) do Echo %%i && fsutil fsinfo drivetype %%i
> pause
> 

naja. gut. face-wink
nun muss man das skript "nur" auswerten. ich denk mal vor face-wink
wie wird der gewonnene laufwerkbuchstabe übernommen?
wie unterscheide ich die lokale platte vom externen laufwerk?
ich habe mich vor einigen tagen für das pieh-ejdsch-skript entschieden, und meine lösung, sowie ich sie verwenden werde, dazu veröffentlicht. das scheint alles serh gut zu klappen. face-wink merciVIELSmals


so mal nebenbei:
1. was ich so TOLL an der cmd.exe finde? (fast) alle meine aufgaben, habe ich bisher mit dieser cmd.exe lösen können. das skript von pieh-ejdsch ist auf wxp lauffähig (gerade kontrollt!), fsutil ist auch unter wxp bekannt.
das ist doch superoberklasse!
für irgendwelche shellskripte, wo eben mal ein windowsshell V2 installiert SEIN MUSS, oder für vb-skripte, wie ich irgendwelche dll's benötige, habe ich leider keinen bock. grund: ich benötige irgendetwas DAZU. und ich muss die windowsshell VERSTEHEN, für vbskript muss ich programmieren können. kann ich nich, und will ich nich face-wink

natürlich, ich weiss...
2. für GROSSE ausgaben: mal eine 4GB-datei, die nicht gerade mit normalen zeichen gefüllt ist, sondern mit allem ,was der dos-herrgott hergibt (also decimal 000 bis 255), da mal einige strings zu finden, und auszutauschen. da kann ich NICHT mit der cmd.exe arbeiten. da brauchen wir schon spezialwerkzeuchs face-wink


viele grüße vom klaus(i)
Member: klausph
klausph Mar 01, 2014 at 13:55:34 (UTC)
Goto Top
ahoi Phil
heute getestet: deine skriptzeile löpt auch unter wxp!
fein!
klassenziel erreicht!
megadank. (s.a. private mail an dich)


wenn du zeit hast, kannst du uns mal bitte dein skript erklären?
oder ist es möglich, DIE eine skriptzeile zu teilen? in mehrere teile geteilt und mit pausen versehen, kann man vielleicht das besser nachvollziehen?

for /f "delims=\ " %%i in ('"mountvol|find ":\"|sort"') do vol %%i 2>nul >nul && find "Backup-SET-01" %%i\allegronet-backup.cmd && set freigabe=%%i

ich kapiere das mit den "delims" nicht. das find "Backup-Set-01" verstehe ich ebenfalls nicht.
mein dos-batsch-buch vom hanser-verlag kann nur das dos6.xx .für die for-schleife gibt es dort keine -für mich!- verständliche erklärung.

danke und gruß klaus

ps: wenn ich ein nachvollziehbares beispiel habe, verstehe ich das persönlich besser. irgendwelche dokus, wo für programmierer das alles logisch und selbsterklärend drinne steht, das verstehe ich eben nicht! bin eben so gepolt face-wink
Member: TsukiSan
TsukiSan Mar 01, 2014 at 23:01:12 (UTC)
Goto Top
Hallo Klaus,

oder für vb-skripte, wie ich irgendwelche dll's benötige, habe ich leider keinen bock.

Also das sehe ich anders. Unter XP brauche ich für diese Zeilen VBS
On Error Resume Next
strComputer = "."  

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
Set colItems = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")  

For Each objItem in colItems
	Select Case objItem.DriveType
	Case 1 strDriveType = "Drive could not be determined."  
	Case 2 strDriveType = "Removable Drive"  
	Case 3 strDriveType = "Local hard disk."  
	Case 4 strDriveType = "Network disk."  
	Case 5 strDriveType = "Compact disk (CD)"  
	Case 6 strDriveType = "RAM disk."  
	Case Else strDriveType = "Drive type Problem."  
End Select

Wscript.Echo objItem.DriveType & " " & objItem.Name & "\ is: " & strDriveType  

Next
keine extra DLL mir besorgen.

Schönen Sonntag,

Tsuki
Member: pieh-ejdsch
pieh-ejdsch Mar 02, 2014 updated at 11:48:41 (UTC)
Goto Top
moin Klaus,

  • Delims wird von @Friemler im Tutorial zur FOR-Schleife erklärt.
  • mountvol zeigt die Laufwerke, welche online (mit Laufwerksbuchstaben) sind, an
  • vol ist erfolgreich bei Laufwerken mit Medium.
  • && ist die Befehlsverknüpfung bei erfolgreichen vorherigen Befehl.
  • find sucht nach Zeichenfolgen in Dateien.
- Hier in einer Initialisierungs- oder auch Informations-Datei welche im Wurzelverzeichnis der USB (Backup) Festplatte abgelegt wurde.
Damit sich dieser Datenträger bei mehreren Backupmedien eindeutig zuordnen lässt erhält die jeweilige HDD eine entsprechende Zeile in dieser INF zur Identifizierung.

Gruß Phil