Trojaner-Board

Trojaner-Board (https://www.trojaner-board.de/)
-   Alles rund um Windows (https://www.trojaner-board.de/alles-rund-um-windows/)
-   -   VBS 'Hello World' - Problem mit doppelter IF- Bedingung (https://www.trojaner-board.de/35493-vbs-hello-world-problem-doppelter-if-bedingung.html)

MightyMarc 19.01.2007 19:14

VBS 'Hello World' - Problem mit doppelter IF- Bedingung
 
Ich frickel gerade an meinem ersten (deswegen 'Hello World') VBS-Miniscript. eigentlich funktioniert alles bis auf eine Kleinigkeit. Das Script soll mir nur die mit NTFS-formatierten Platten ausgeben. objDrive.IsReady benötige ich, damit das Script nicht wegen eines Laufzeitfehlers (Floppy) abbricht. Eigentlich dachte ich, ich könnte mit objDrive.FileSystem = NTFS die Ausgabe auf die gesuchten Platten/Partitionen einschränken, aber WSH meldet
Zitat:

ntfs.vbs(5, 5) Laufzeitfehler in Microsoft VBScript: Der Datenträger ist nicht bereit.
Code:

const GB_FACTOR = 1073741824
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colDrives = objFSO.Drives
For Each objDrive in colDrives
    If objDrive.IsReady = True And objDrive.FileSystem = NTFS Then
        Wscript.Echo "Laufwerksbuchstabe: " & objDrive.DriveLetter
        Wscript.Echo "Volumenname: " & objDrive.VolumeName       
        Wscript.Echo "Laufwerkstyp: " & objDrive.DriveType
        Wscript.Echo "Dateisystem: " & objDrive.FileSystem
        Wscript.Echo "Gesamtgröße: " & FormatNumber((objDrive.TotalSize / CONV_FACTOR), 2) & " GB "
            Wscript.Echo "Verfügbarer"
        Wscript.Echo "Speicherplatz: " & FormatNumber((objDrive.AvailableSpace / CONV_FACTOR), 2) & " GB "
            Wscript.Echo "Gerätestatus: bereit"
            Wscript.Echo "Freigabename: " & objDrive.ShareName
        Wscript.Echo ""
    Else
            Wscript.Echo "Nix HDD"
        Wscript.Echo ""
    End If
Next

Ohne And objDrive.FileSystem = NTFS funktioniert es wunderbar. Am Gerätestatus kann es wohl kaum liegen.

Zitat:

Microsoft (R) Windows Script Host, Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. Alle Rechte vorbehalten.

Nix HDD

Laufwerksbuchstabe: C
Volumenname:
Laufwerkstyp: 2
Dateisystem: NTFS
GesamtgrӇe: 20.02 GB
Verfgbarer
Speicherplatz: 8.39 GB
Ger„testatus: bereit
Freigabename:

Laufwerksbuchstabe: E
Volumenname: Musik
Laufwerkstyp: 2
Dateisystem: NTFS
GesamtgrӇe: 48.54 GB
Verfgbarer
Speicherplatz: 6.95 GB
Ger„testatus: bereit
Freigabename:

Laufwerksbuchstabe: I
Volumenname: Daten
Laufwerkstyp: 2
Dateisystem: NTFS
GesamtgrӇe: 63.47 GB
Verfgbarer
Speicherplatz: 11.64 GB
Ger„testatus: bereit
Freigabename:

Laufwerksbuchstabe: J
Volumenname: Volume
Laufwerkstyp: 2
Dateisystem: NTFS
GesamtgrӇe: 8.00 GB
Verfgbarer
Speicherplatz: 4.35 GB
Ger„testatus: bereit
Freigabename:

Laufwerksbuchstabe: L
Volumenname: TheFrozenThrone
Laufwerkstyp: 4
Dateisystem: CDFS
GesamtgrӇe: 0.62 GB
Verfgbarer
Speicherplatz: 0.00 GB
Ger„testatus: bereit
Freigabename:

Nix HDD
Laut Herrn Google sollte die doppelte Bedingung mit And funktionieren. Was hab ich falsch gemacht?

Cleriker 22.01.2007 16:35

*puu* ich habe zwar auch
schon ein bisschen mit diesen
vb-Scripts unter win rumgefummelt,
aber ich würde dir raten, dich da
an VisualBasicExperten zu hängen.

KarlKarl 22.01.2007 18:12

Hi,

vermutlich bist Du es von anderen Programmiersprachen gewohnt, daß ein logischer Ausdruck nicht weiter ausgewertet wird, wenn die weiteren Terme nichts mehr am Gesamtergebnis ändern können (sogenannte lazy evaluation). Bei WSH ist das aber nicht der Fall, er führt auf jeden Fall den zweiten Teil aus, um das Dateisystem zu bestimmen muß er auf das Laufwerk zugreifen und schon ist es passiert. Lösung: Die Abfage in zwei if-Konstrukte teilen, so daß die Abfrage auf das Dateisystem nur erfolgt, wenn IsReady True ergeben hat.

Code:

For Each objDrive in colDrives
    If objDrive.IsReady = True Then
        If obj.Drive.FileSystem = NTFS then

' your code

        End If
    End If
Next

Nachvollziehen kannst Du das mit dem folgenden Beispiel:
Code:

function a1
    Wscript.Echo "in a1"
    a1 = False
end function

function a2
    Wscript.Echo "in a2"
    a2 = False
end function

if a1 and a2 then
    Wscript.Echo "if taken"
else
    Wscript.Echo "else taken"
end if

Gruß, Karl

MightyMarc 23.01.2007 14:33

Zitat:

Zitat von KarlKarl (Beitrag 250250)
Hi,
vermutlich bist Du es von anderen Programmiersprachen gewohnt, ...

Öhm, naja, das einzige was ich mal angefasst habe (anfassen musste) ist Turbo Pascal und das liegt so etwa 10-12 Jahre zurück. Also gewohnt bin ich gar nichts.

Zitat:

Bei WSH ist das aber nicht der Fall, er führt auf jeden Fall den zweiten Teil aus, um das Dateisystem zu bestimmen muß er auf das Laufwerk zugreifen und schon ist es passiert. Lösung: Die Abfage in zwei if-Konstrukte teilen, so daß die Abfrage auf das Dateisystem nur erfolgt, wenn IsReady True ergeben hat.
Genau das war der Knackpunkt. Muchas Gracias. Jetzt weiss ich ja, wen ich bei weiteren Problemen kontaktieren kann :D

Gruß

Marc


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:32 Uhr.

Copyright ©2000-2025, Trojaner-Board


Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55