Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: ahe

ahe (Level 1) - Jetzt verbinden

13.09.2007, aktualisiert 18.10.2012, 4627 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

MfG 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.

mfg
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...

mfg
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...

mfg
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...

mfg
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 ..
Ähnliche Inhalte
Batch & Shell

Meltdown Microsoft Prüf Script - .zip Datei leider leer

gelöst Frage von MasterBlaster88Batch & Shell13 Kommentare

Hallo zusammen, ich patche gerade unsere Windows Server bzgl. der Meltdown Lücke. Patch vorhanden, Reg Keys gesetzt Um das ...

VB for Applications

Wenn bestimmte Datei leer dann Script ausfürhen sonst nicht

gelöst Frage von aletriVB for Applications10 Kommentare

Guten Abend allerseits Dieser Script löscht einen bestimmten Eintrag in der Scener.cfg des Flugsimulators und funktioniert soweit: Nun sollte ...

Batch & Shell

Linux bash script: Datei verschieben nur wenn Zielverzeichnis leer

gelöst Frage von ole-objektBatch & Shell2 Kommentare

Hallo! ich steh gerade total auf dem Schlauch: Ich muss in einem Skript viele Dateien in ein bestimmtes Verzeichnis ...

Batch & Shell

TXT Datei bleibt nach Erstellung leer - woran liegt es?

gelöst Frage von Komoran12Batch & Shell14 Kommentare

Hallo, ich bin blutiger Anfänger und hoffe, dass mir wer weiterhelfen kann :-) Ich habe eine .csv, die wie ...

Neue Wissensbeiträge
Humor (lol)
Administrator.de Perlen
Tipp von DerWindowsFreak2 vor 1 TagHumor (lol)2 Kommentare

Hallo, Heute beim stöbern auf dieser Seite bin auf folgenden Thread aus dem Jahre 2006 gestossen: Was meint ihr? ...

Erkennung und -Abwehr
OpenSSH-Backdoor Malware erkennen
Tipp von Frank vor 2 TagenErkennung und -Abwehr

Sicherheitsforscher von Eset haben 21 Malware-Familien untersucht. Die Malware soll Hintertüren via OpenSSH bereitstellen, so dass Angreifer Fernzugriff auf ...

iOS
WatchChat für Whatsapp
Tipp von Criemo vor 5 TageniOS5 Kommentare

Ziemlich coole App für WhatsApp User in Verbindung mit der Apple Watch. Gibts für iOS sowohl als auch für ...

iOS
IOS hat nen Cursor!
Tipp von Criemo vor 6 TageniOS5 Kommentare

Nette Funktion im iOS. iPhone-Mauszeiger aktivieren „Nichts ist nerviger, als bei einem Tippfehler zu versuchen, den iOS-Cursor an die ...

Heiß diskutierte Inhalte
Festplatten, SSD, Raid
SSD zeigt falsche Werte
Frage von karl2014Festplatten, SSD, Raid25 Kommentare

Ich habe ein Problem mit der SSD in meinem Laptop mit Windows 10. Es ist eine 1Tb Platte die ...

Grafikkarten & Monitore
PCIe 1.0 Grafikkarte für 3840x2160
Frage von Windows10GegnerGrafikkarten & Monitore24 Kommentare

Hallo, mein Vater hat einen neuen Monitor gekauft, welcher eine native Auflösung von 3840*2160 hat. Diese muss jetzt auch ...

Windows 10
Windows Enterprise 1809 Eval nicht bootbar
Frage von Sunny89Windows 1022 Kommentare

Hallo zusammen, bevor ich mich jetzt noch stundenlang rumärger wollte ich euch fragen, ob Ihr die gleichen Probleme habt ...

Ubuntu
Installation freerdp 2.0.0-rc4
Frage von kristovUbuntu20 Kommentare

Hallo, möchte freerdp 2.0.0-rc4 auf linux mint 18.3 installieren, habe aber keine Ahnung, wie das funktioniert. freerdp 1.1 ist ...