WSH/VBS - Ordner und Attribute - Verständnisproblem (W10)

cumulonimbus8

Fleet Admiral
Registriert
Apr. 2012
Beiträge
18.938
Moin!

Rahmenhandlung: mit alten Skripten repariere ich Ausfälle bei normalen Ordnern und deren Desktop.Ini (dmaits mit eigenen Icons schön aussieht). Dabei soll so ein Ordner weder S noch H Attribut haben, dafür R (während die\seine Desktop.Ini mindesten S und H bedarf).

Ordner scheinen sperrig, Attribute auch. Selbst in der CMD-Box kann ich bei gesetztem S oder H nicht zusätzlich H oder S setzen bzw. S oder H löschen wenn S und H (zusammen) gesetzt sind. Also braucht es den Zweizeiler…
Code:
ATTRIB X:\Ordner -R -H -S
ATTRIB X:\Ordner +R +H +S
…der im 2. Schritt die Attribute faktisch gleichzeitig setzt. Das führt zum gewünschten Ziel.

Die Frage ist: wer sperrt da, wer funkt dazwischen?

Denn will ich das innerhalb von VBS machen, etwa so…
Code:
SET Subjekt = Ordner REM Ordner ist ein FSO
CALL Attribute(-4)
CALL Attribute(-2)
CALL Attribute(1)

SUB Attribute(Attribut)
 IF (Subjekt.Attributes AND ABS(Attribut)) = 0 THEN Subjekt.Attributes = Subjekt.Attributes + Attribut
END SUB
…dann kann ich vorher in CMD setzen oder löschen was ich will - mein Ordner hat am Schluss R, H und S gesetzt!
Auch ohne die Mathematik. mit einem Subjekt.Attributes - Attribut [also: Minus], passiert das Unvermeidliche von oben.

Geh ich in einer Serie IFs durch…
Code:
SET Subjekt = Ordner
CALL Attribute

SUB Attribute
DIM AttributsWert
 AttributsWert = Subjekt.Attributes
 IF (Subjekt.Attributes AND 4) <> 0 THEN AttributsWert = AttributsWert - 4
 IF (Subjekt.Attributes AND 2) <> 0 THEN AttributsWert = AttributsWert - 2
 IF (Subjekt.Attributes AND 1) = 0 THEN AttributsWert = AttributsWert - 1
 Subjekt.Attributes = AttributsWert
END SUB
…und sammele die Werte zu einem einzigen so gelingt die gewollte Umschaltung weil es so wieder gleichzeitig passiert.
(Google und diverse Syntaxerklärungen gehen mit keinem Pieps auf dieses Phänomen ein.)

Warum ist das so?
Welche Logik verhindert es Attribute - und offenbar geht’s nur um diese Spezis hier - einzeln zu setzen, zu löschen? Mir ist diese Holzhammermethode einfach zu unsympathisch.

CN8
 
icals kann Attribute aka versteckt, system setzen?

BFF
 
Da hast du recht, mit icalcs kann man nur die rechte anpassen, nicht die attribute. Hatte mich da etwas vertan..
 
Als ich eben ICALCS las war ich auch verwundert - Dateiattribute und Benutzerrechte sind vielleicht doch nicht dasselbe ;)

Aber in welchem Pfeffer liegt der Hase, dass ich in einem Zuge alles setzen kann, aber nicht in einer logischen Schleife alles einzeln mit übergebenen Parametern?

((Dumme Idee redundanten Code zu vermeiden oder Daten zwischenzusammeln.))

CN8
 
Vergiß das R, das hat seit 20 Jahren keine Berechtigung mehr. Permissions laufen über die ACL.

Was das S(ystem) Attribut angeht: es ist Schuld. Das ist so gewollt von Microsoft. Heutzutage sind die DOS Flags eh drei Jahre nach Deprecated, da wird sich auch nichts mehr tun.

Kleiner Tip, das ist keine Mathematik, sondern Logik. Schau auch mal, wenn du nicht schon hast, ob vbs dich hier Namen verwenden läßt.
Idealerweise würdest du Flags mit sowas wie

Code:
.Attributes = .Attributes And Not xyz 'unset
.Attributes = abc Or def 'explizit alle 
.Attributes = .Attributes Or ghi 'set
setzen.

Schleifen sparen ist übrigens immer gut. Je weniger Anweisungen man braucht, desto besser ist es. Wenn schon klar ist, welches Attributset gewünscht ist, und das mit 1 oder wie hier 2 Zeilen geht, dann ist das schon ganz okay so.
 

Ähnliche Themen

Zurück
Oben