In der Powershell das Archivbit nutzen
Hallo zusammen,
ich habe ein (hoffentlich) kleines Problem mit der Windows Powershell.
Und zwar moechte ich ueber die Powershell das Archivbit von Dateien auslesen.
Bis jetzt habe ich folgenden Code:
Das funktioniert so allerdings nur, wenn nur das Archivbit gesetzt ist. Ist zusaetzlich eins der anderen Attribute (zB. ReadOnly) gesetzt funktioniert es nicht und gibt immer raus das kein Archivbit gesetzt ist.
Ich habs auch schon mit -contains in der Abfrage getestet, aber das bringt das gleiche Ergebnis.
Wahrscheinlich hab ich nen falschen Ansatz in der if-Abfrage, aber im Moment komm ich leider nicht weiter.
Gruss,
rana-mp
ich habe ein (hoffentlich) kleines Problem mit der Windows Powershell.
Und zwar moechte ich ueber die Powershell das Archivbit von Dateien auslesen.
Bis jetzt habe ich folgenden Code:
$fileItem = Get-Item C:\temp\testdatei.txt
$fileitem.attributes
if ($fileItem.Attributes -eq [System.IO.FileAttributes]::Archive)
{
echo "Archivbit gesetzt"
}
else
{
echo "Archivbit nicht gesetzt"
}
Das funktioniert so allerdings nur, wenn nur das Archivbit gesetzt ist. Ist zusaetzlich eins der anderen Attribute (zB. ReadOnly) gesetzt funktioniert es nicht und gibt immer raus das kein Archivbit gesetzt ist.
Ich habs auch schon mit -contains in der Abfrage getestet, aber das bringt das gleiche Ergebnis.
Wahrscheinlich hab ich nen falschen Ansatz in der if-Abfrage, aber im Moment komm ich leider nicht weiter.
Gruss,
rana-mp
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 147752
Url: https://administrator.de/contentid/147752
Ausgedruckt am: 05.11.2024 um 08:11 Uhr
7 Kommentare
Neuester Kommentar
Hallo rana-mp,
ersetze das if statement mal durch
oder
Gruß
LotPings
ersetze das if statement mal durch
## String Vergleich
if ($fileItem.Attributes -contains [System.IO.FileAttributes]::Archive)
## einfacher wäre
if ($fileItem.Attributes -contains "Archive")
## binärer Vergleich des Attributes
if ($fileItem.Attributes -band [System.IO.FileAttributes]::Archive)
if ($fileItem.Mode -like "?a*")
Gruß
LotPings
Hallo,
die Attribute sind als Bitmaske abgelegt (daher auch Archiv_bit_). Und für jedes gesetzte Attribut wird das entsprechende Bit auf 1 gesetzt.
Somit ist nur "Archivieren" z.B. 0010, während "Archivieren" & "ReadOnly" 0110 ist, und "Archivieren" & Hidden z.B. 1010.
Damit ist auch klar, warum der Vergleich auf -eq fehlschlägt wenn mehrere gesetzt sind. Auch -contains funktioniert höchstens weil MS hier eine Krücke eingebaut hat.
Korrekter & effizienter Weg ist das bitweise UND: $fileItem.Attributes -band [System.IO.FileAttributes]::Archive.
Gruß
Filipp
die Attribute sind als Bitmaske abgelegt (daher auch Archiv_bit_). Und für jedes gesetzte Attribut wird das entsprechende Bit auf 1 gesetzt.
Somit ist nur "Archivieren" z.B. 0010, während "Archivieren" & "ReadOnly" 0110 ist, und "Archivieren" & Hidden z.B. 1010.
Damit ist auch klar, warum der Vergleich auf -eq fehlschlägt wenn mehrere gesetzt sind. Auch -contains funktioniert höchstens weil MS hier eine Krücke eingebaut hat.
Korrekter & effizienter Weg ist das bitweise UND: $fileItem.Attributes -band [System.IO.FileAttributes]::Archive.
Gruß
Filipp
Zitat von @filippg:
Korrekter & effizienter Weg ist das bitweise UND: $fileItem.Attributes -band [System.IO.FileAttributes]::Archive.
Alle meine obigen Beispiele sind Korrekt, das einige nur funktionieren weil MS das in .Net oder PoSh so vorgesehen hat, tut dem keimen Abbruch. Einie Steigerung von Korrekt gibt es nicht.Korrekter & effizienter Weg ist das bitweise UND: $fileItem.Attributes -band [System.IO.FileAttributes]::Archive.
Bei der Effizienz kann man geteilter Meinung, in einem Script dürfte es irrelevant sein, wenn schon dann ist
if ($fileItem.Attributes -band 32)
Das Archiv-Bit ist hier das 6. nicht das 2. , kann man leicht nachprüfen mit :
(Get-Item C:\temp\testdatei.txt).Atrributes.value__
Gruß
LotPings
Hallo,
das contains durch match ersetzen und schon läuft es.
BeispielCode:
Grüße Torsten
Post Scriptum: wenn mir jetzt noch wer den unterschied zwischen Get-Item und Get-ItemProperty erklären kann, wäre ich fast glücklich
das contains durch match ersetzen und schon läuft es.
BeispielCode:
$fileItem = Get-Item testfile.txt
$fileItem | fl *
if ($fileItem.Attributes -match "Archive")
{
echo "Archivbit gesetzt"
}
else
{
echo "Archivbit nicht gesetzt"
}
$fileItem2 = Get-ItemProperty testfile.txt
$fileItem2 | fl *
if ($fileItem2.Attributes -match "Archive")
{
echo "Archivbit gesetzt"
}
else
{
echo "Archivbit nicht gesetzt"
}
Post Scriptum: wenn mir jetzt noch wer den unterschied zwischen Get-Item und Get-ItemProperty erklären kann, wäre ich fast glücklich
Hallo Torsten,
der -match nutzt natürlich auch den von PoSh entgegen kommender Weise automatisch erzeugten String zum Vergleich,
ob -contains oder -match funktionieren tun sie beide.
Der Unterschied von Get-Item und Get-ItemProperty ist gering, sieh die einfach mal die jeweilige Hilfe an.
Die Optionen bei Get-Item enthalten ein -force das Get-ItemProperty fehlt und
nur bei Get-ItemProperty gibt es eine -name Option für die gewünschte Eigeneschaft.
Gruß
LotPings
der -match nutzt natürlich auch den von PoSh entgegen kommender Weise automatisch erzeugten String zum Vergleich,
ob -contains oder -match funktionieren tun sie beide.
Der Unterschied von Get-Item und Get-ItemProperty ist gering, sieh die einfach mal die jeweilige Hilfe an.
Die Optionen bei Get-Item enthalten ein -force das Get-ItemProperty fehlt und
nur bei Get-ItemProperty gibt es eine -name Option für die gewünschte Eigeneschaft.
Gruß
LotPings
Zitat von @rana-mp:
Nur der neugierde halber, kann man sagen, wie gross der Geschwindigkeitsunterschied zwischen diesen Varianten ist?
Hab ich nicht untersucht, aber ich würde sagen gegenüber anderen Optimierungsmöglichkeiten eines Scripts vernachlässigbar,Nur der neugierde halber, kann man sagen, wie gross der Geschwindigkeitsunterschied zwischen diesen Varianten ist?
die erste Variante ist zur Dokumentation besser geeignet.
Gruß
LotPings