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

Leere Datei erkennen

Frage Entwicklung Batch & Shell

Mitglied: ahe

ahe (Level 1) - Jetzt verbinden

13.09.2007, aktualisiert 18.10.2012, 4532 Aufrufe, 10 Kommentare

Hallo,

irgendwie steh' ich etwas auf dem Schlauch und komm' nicht weiter, dabei sieht es so simpel aus...

Ich versuche in einer Batch einen Kopier-Job zu starten, der allerdings erst einmal prüft, ob die Datein auf einer eingeschobenen CD/DVD liegen, oder ober er lieber im Netz nachschauen soll. Das Kopieren ist dabei nicht das Problem, auch nicht die Verbindung zum Netz.

Das Problem ist die Erkennung des CD/DVD Laufwerksbuchstabens. Dafür habe ich mir ein Skript gebastelt (unter Mithilfe einiger Biber'scher und BASTLAscher Beiträge... ) und es funktioniert sogar: GetCDDriveLetter.vbs (kann man vielleicht noch 'mal brauchen, verbessern, oder gar verBASTLAn/verBIBERn...

01.
On Error Resume Next 
02.
Dim objFSO 
03.
Dim objFile 
04.
Dim objFolder 
05.
Dim strDateiname 
06.
Dim strPFAD 
07.
Dim mysource 
08.
 
09.
strComputer = "." 
10.
Set objWMIService = GetObject("winmgmts:" _ 
11.
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
12.
 
13.
Set FSO = CreateObject("Scripting.FileSystemObject")  
14.
Set Drives = FSO.Drives 
15.
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 
16.
strDateiname = WScript.ScriptFullName 
17.
Set objFolder = objFSO.getFolder(objFSO.getParentFolderName(strDateiname)) 
18.
strDateiname = objFSO.getFileName(strDateiname) 
19.
 
20.
Set colItems = objWMIService.ExecQuery("Select * from Win32_CDROMDrive") 
21.
 
22.
For Each objItem In colItems 
23.
	If objItem.MediaLoaded = vbTrue Then 
24.
		If (objFSO.FileExists(objItem.Drive & "\historie.txt")) Then 
25.
			mysource = objItem.Drive 
26.
				'MsgBox "Verzeichnis vorhanden und Datei vorhanden!" & mysource & "\historie.txt" 
27.
				WScript.echo mysource  
28.
		End If 
29.
	End If 
30.
Next 
31.
 
32.
Set Drives = Nothing 
33.
Set objFSO = Nothing 
34.
wscript.quit
Aufgerufen wird das VBScript in einer Batch und das Ergebnis in einer Datei abgelegt:
01.
set sourcepath= 
02.
set tmpdirlog=c:\temp\dvddir.log 
03.
cscript //nologo %~dp0\GetCDDriveLetter.vbs >%tmpdvdlog%
Nun durchforste ich diese Datei (sollte ja bestenfalls nur ein einziges Zeichen sein) und setze meine Variable "sourcepath" für den Pfad:
01.
for /F %%i in (%tmpdvdlog%) do (set sourcepath=%%i)
Dies funktioniert auch, aber nur dann, wenn auch eine CD/DVD eingelegt ist. Ist dies nicht der Fall, dann ist die Datei %tmpdvdlog% leer und es wird nix gesetzt, was so nicht beabsichtigt war... schließlich brauche ich ja einen Pfad...

Schön wäre jetzt, wenn ich einfach Folgendes in der For-Schleife machen könnte:
01.
for /F %%i in (%tmpdvdlog%) do ( 
02.
     if %%i =="" ( 
03.
          set sourcepath=\\netzwerkpfad\name 
04.
     ) else ( 
05.
          set sourcepath=%%i 
06.
07.
)
Und genau das funktioniert nicht... es wird nix gesetzt, ein echo %sourcepath% bringt nur die Meldung, dass echo off ist...

Es ist irgendetwas mit dem IF, aber ich komme nicht 'drauf. Ich denke es ist eine Kleinigkeit, aber diese hält mich etwas auf... (vielleicht ist es auch einfach zu spät?)

Gute Nacht
Axel
Mitglied: bastla
13.09.2007 um 01:49 Uhr
Hallo ahe!

Unter der Annahme, dass eine leere Datei eine Länge von 0 Byte hat, könnte als Workaround ja vielleicht (ungetestet)
01.
for %%i in (%tmpdvdlog%) do if %%~zi equ 0 ( 
02.
          set sourcepath=\\netzwerkpfad\name 
03.
) else ( 
04.
          set sourcepath=%%i 
05.
)
klappen ...

... oder auch (genauso ungetestet, würde mir aber besser gefallen):
01.
set sourcepath= 
02.
for /f %%i in ('cscript //nologo %~dp0\GetCDDriveLetter.vbs') do set sourcepath=%%i 
03.
if not defined sourcepath set "sourcepath=\\netzwerkpfad\name"
Grüße
bastla
Bitte warten ..
Mitglied: maneich
13.09.2007 um 01:57 Uhr
Hallo,

ob ein drive exists oder isredy ist in vbs zweierlei.

Erläuterungen von MS dazu:

Bei Laufwerken mit austauschbaren Datenträgern gibt die DriveExists-Methode true zurück, auch wenn kein Datenträger eingelegt ist. Verwenden Sie die IsReady-Eigenschaft des Drive-Objekts, um festzustellen, ob das Laufwerk bereit ist.

Soll heißen, Der LW-Buchstabe ist ja vom System vergeben; nur ansprechen kannst Du das Laufwerk nicht, da es ohne Cd oder DVD nicht nicht aktiv ist.

Man sollte nicht alles so kompliziert machen, Möglichkeiten:

1. im VBScript Abfrage nach IsReady und wenn nein Aufforderung entsprechende CD/DVD einlegen und das alles in einer Schleife.

2. nach "for /F %%i in (%tmpdvdlog%) do (set sourcepath=%%i)"
Abfrage
if not %sourcepath" = "" goto weiter
echo keine CD/DVD im Laufwerk, Daten hier eingeben!!
set /p sourcepath=eingabe:
:weiter
... entsprechende Befehle

Mit freundlichen Grüßen maneich
Bitte warten ..
Mitglied: ahe
13.09.2007 um 09:28 Uhr
Danke bastla,

gibt es eigentlich eine Nacht für Dich?


Mir gefällt die zweite Variante auch besser, wenn sie denn funktioniert.

Ich probiere sie gleich 'mal aus und melde mich dann wieder.

Mit freundlichen Grüßen
Axel
Bitte warten ..
Mitglied: ahe
13.09.2007 um 09:41 Uhr
Danke maneich,

noch so ein Nachtschwärmer

Die Idee zu 2. war mir auch schon gekommen, allerdings kenne ich die Faulheit der Admins (bin selbst einer) immer etwas eingeben zu müssen und dann auch noch immer richtig...

Darum wollte ich das Ganze automatisiert machen, ohne jegliche Benutzerinteraktion.

Zu 1.: Hatte ich schon vermutet, da ich bei den ersten Tests mehrere Laufwerke als Ergebnis zurückbekam (einschließlich virtueller).
Darum hab' ich das Ganze in eine Schleife gepackt, die mir auf den gefundenen Laufwerken nach einer Datei sucht, die auf jeden Fall da sein muss, damit die richtige CD/DVD gefunden wird und damit auch der richtige Pfad zurückgeliefert wird.

Ansonsten danke für die Info mit der IsReady-Eigenschaft, dies könnte evtl. ja das Script etwas entschlacken/beschleunigen...ich bin in VBScript leider nicht so bewandert...

Mit freundlichen Grüßen
Axel
Bitte warten ..
Mitglied: ahe
13.09.2007 um 10:27 Uhr
Hallo maneich,

ich weiß zwar nicht, ob Du das meintest, aber es scheint auch zu funktionieren:

anstelle der Abfrage:
01.
If objItem.MediaLoaded = vbTrue Then
habe ich die folgende Abfrage eingefügt:
01.
If objItem.DriveIntegrity = vbTrue Then
Auzug aus der Kontext sensitiven Hilfe vom SystemScripter:
"Die 'DriveIntegrity' Eigenschaft gibt an, ob Dateien vom CD-ROM-Laufwerk einwandfrei gelesen werden können, indem ein Datenblock zweimal gelesen und die Ergebnisse miteinander verglichen werden."

IsReady habe ich als Eigenschaft nicht gefunden, kann es sein, dass ich dafür eine andere Klasse bemühen muss?

Aah, klar, ein bischen in der Online-Hilfe blättern UND lesen, dann findet man auch was...

Es gibt da noch GetDrive...

Mmh, allerdings komme ich auf die Schnelle da wohl nicht weiter, ich bekomme keine Ausgabe...
01.
Set d = objFSO.GetDrive(drvpath) 
02.
d.DriveType = 4 
03.
If (d.IsReady) Then 
04.
	MsgBox "Laufwerk " & d.DriveLetter & "ist da!" 
05.
Else 
06.
	MsgBox "Kein Laufwerk vorhanden" 
07.
End If
So wie es aussieht muss ich erst den Parameter "drvpath" füllen, aber wie?

Am "frühen" Morgen etwas verwirrt, wende ich mich jetzt erst einmal meinem Kaffee zu...
Axel
Bitte warten ..
Mitglied: ahe
13.09.2007 um 10:35 Uhr
Hallo Bastla,

die kurze Version funktioniert, jetzt brauche ich auch die dusselige Temp-Datei nicht mehr.

Durch maneichs Hinweis habe ich jetzt auch noch das VBScript etwas abgeändert, ob allerdings in seinem Sinne werde ich wohl noch erfahren

Mich stört noch ein wenig die Performance, wenn tatsächlich eine DVD im Laufwerk liegt...

Mit freundlichen Grüßen
Axel
Bitte warten ..
Mitglied: bastla
13.09.2007 um 10:59 Uhr
Hallo ahe!

gibt es eigentlich eine Nacht für Dich?
Mal so, mal so - aber dieses Mal war es tatsächlich schon sehr spät, daher die eher oberflächliche Behandlung des Themas ...

Grüße
bastla
Bitte warten ..
Mitglied: Biber
13.09.2007 um 11:39 Uhr
Moin ahe,

nach dem Morgenkaffee solltest Du noch mal das "d.DriveType = 4" (=versuchte Zuweisung)
in eine höfliche Frage "IF d.DriveType = 4 then..." ändern.

Grüße
Biber
Bitte warten ..
Mitglied: ahe
13.09.2007 um 17:50 Uhr
Mmh, ja,... da hast Du wohl recht...

Allerdings löst es jetzt noch nicht mein Problem mit dem Parameter "drvpath", der muss ja noch irgendwie gefüllt sein, oder?

Ob ein Medium eingelegt ist kann man übrigens auch mit "objItem.MediaLoaded" herausbekommen.

Ein wenig forschen in der Online Hilfe unter "IsReady Property" brachte dann etwas Licht ins Dunkel...

Die Funktion ShowDriveInfo (s. u.) und etwas grübeln über der zweiten Tasse Kaffee brachte mich dann auf die Idee...
01.
Function ShowDriveInfo(drvpath) 
02.
   Dim fso, d, s, t 
03.
   Set fso = CreateObject("Scripting.FileSystemObject") 
04.
   Set d = fso.GetDrive(drvpath) 
05.
   Select Case d.DriveType 
06.
      Case 0: t = "Unknown" 
07.
      Case 1: t = "Removable" 
08.
      Case 2: t = "Fixed" 
09.
      Case 3: t = "Network" 
10.
      Case 4: t = "CD-ROM" 
11.
      Case 5: t = "RAM Disk" 
12.
   End Select 
13.
   s = "Drive " & d.DriveLetter & ": - " & t 
14.
   If d.IsReady Then  
15.
      s = s & "<BR>" & "Drive is Ready." 
16.
   Else 
17.
      s = s & "<BR>" & "Drive is not Ready." 
18.
   End If 
19.
   ShowDriveInfo = s 
20.
End Function
Dies ist die "neue" GetCDDriveLetter.vbs, allerdings noch mit diversem unnötigen Debugcode und ein paar doppelten Ausgaben...
01.
On Error Resume Next 
02.
Dim objFSO, d 
03.
Dim objFile 
04.
Dim objFolder 
05.
Dim strDateiname 
06.
Dim strPFAD 
07.
Dim mysource 
08.
 
09.
mysource = "" 
10.
strComputer = "." 
11.
Set objWMIService = GetObject("winmgmts:"
12.
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2"
13.
 
14.
Set FSO = CreateObject("Scripting.FileSystemObject")  
15.
Set Drives = FSO.Drives 
16.
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject"
17.
strDateiname = WScript.ScriptFullName 
18.
Set objFolder = objFSO.getFolder(objFSO.getParentFolderName(strDateiname)) 
19.
strDateiname = objFSO.getFileName(strDateiname) 
20.
 
21.
Set colItems = objWMIService.ExecQuery("Select * from Win32_CDROMDrive"
22.
 
23.
For Each objItem In colItems 
24.
	drv = ShowDriveInfo (objItem.Drive)                  '************** die geklaute Funktion wird aufgerufen **************  
25.
	 
26.
	If objItem.DriveIntegrity = vbTrue Then 
27.
	'If objItem.MediaLoaded = vbTrue Then 
28.
		If (objFSO.FileExists(objItem.Drive & "\historie.txt")) Then 
29.
			mysource = objItem.Drive 
30.
                         ' **************  objItem.MediaLoaded zeigt "wahr" an, wenn eine CD eingelegt ist,  
31.
                         ' **************  war reine Neugier... 
32.
			MsgBox "Verzeichnis vorhanden und Datei vorhanden! " & mysource & "\historie.txt" & " " & objItem.MediaLoaded     
33.
			WScript.echo mysource  
34.
		End If 
35.
	End If 
36.
Next 
37.
If mysource = "" Then  
38.
	MsgBox "DVD nicht da"  
39.
Else 
40.
	MsgBox "DVD Laufwerk: " & mysource  
41.
End If 
42.
 
43.
Set Drives = Nothing 
44.
Set objFSO = Nothing 
45.
WScript.quit 
46.
 
47.
Function ShowDriveInfo(drvpath)       ' **************  etwas abgeändert Funktion ShowDriveInfo 
48.
	Dim fso, d, s, t 
49.
   	Set FSO = CreateObject("Scripting.FileSystemObject"
50.
   	Set d = FSO.GetDrive(drvpath) 
51.
   	Select Case d.DriveType 
52.
      	Case 0: t = "Unknown" 
53.
      	Case 1: t = "Removable" 
54.
      	Case 2: t = "Fixed" 
55.
      	Case 3: t = "Network" 
56.
      	Case 4: t = "CD-ROM" 
57.
      	Case 5: t = "RAM Disk" 
58.
   	End Select 
59.
   	s = d.DriveLetter  
60.
   	If d.IsReady = vbTrue Then  
61.
    	   MsgBox "drive: " & s & ":" 
62.
   	End If 
63.
   	ShowDriveInfo = s 
64.
End Function
Es geht also auch mit "IsReady", wenn auch etwas aufwändiger, als gedacht...

Mit freundlichen Grüßen
Axel
Bitte warten ..
Mitglied: Biber
13.09.2007, aktualisiert 18.10.2012
Moin ahe,

ein etwas später Nachtrag, aber der Vollständigkeit halber:
Habe es gerade per Zufall gesehen: hier im Forum sind auch schon ähnliche Lösungen gepostet...

RE #8: Installationspfad einer Anwendung suchen auf unbekanntem PC

Danke Dir fürs Veröffentlichen Deiner Lösung!.

Grüße
Biber
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
gelöst Dateien mit Powershell löschen und nur leere (symbolische) Datei hinterlassen (6)

Frage von evolution zum Thema Batch & Shell ...

Webentwicklung
HTML Output in eine txt Datei mit VisualBasicScript (2)

Frage von coca22COCA zum Thema Webentwicklung ...

Informationsdienste
gelöst Aktuelle Firefox MSI Datei!? (8)

Frage von Hendrik2586 zum Thema Informationsdienste ...

Virtualisierung
gelöst VMDK Datei vergrößern auf der Console welche Datei ist die richtige? (3)

Frage von fireskyer zum Thema Virtualisierung ...

Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...