2017-12-30 21 views

Antwort

1

Überprüfen Sie zunächst, ob das Attribut vorhanden ist oder nicht, und Sie können das dann basierend auf der Bedingung festlegen. Um das Archivbit umzuschalten, können Sie einen Bitwise Exclusive oder (BXOR) Operator verwenden.

Sie können etwas tun:

$path = "C:\foldername" 
$files = Get-ChildItem -Path "C:\folderpath" -Recurse -force | where {($_.LastwriteTime -lt (Get-Date).AddDays(-14)) -and (! $_.PSIsContainer)} 
$attrib = [io.fileattributes]::archive 
Foreach($file in $files) 
{ 
    If((Get-ItemProperty -Path $file.fullname).attributes -band $attrib) 
    { 
    "Attribute is present" 
    } 
    else 
    { 
    Set-ItemProperty -Path $file.fullname -Name attributes -Value ((Get-ItemProperty $file.fullname).attributes -BXOR $attrib) 
    } 
} 

Hoffe, es hilft.

+0

'nur geändert ((Get-ItemProperty $ file.fullname) .attributes -BXOR $ attrib) Wird die Archivmarkierung nicht deaktiviert, wenn sie bereits gesetzt ist? Ich meine, ich weiß, dass du die if-Anweisung hast, aber logisch denke ich, dass du den "-bor" -Operator verwenden willst. –

+1

@BaconBits Nein. Er schaltet das Attribut um, aktualisiert aber den Wert der Datei nicht direkt. Um das Attribut für die Datei zu ändern, müssen Sie den Wert wieder der Eigenschaft Attributes zuweisen. Der Code tut dies nur, wenn das Attribut überhaupt nicht vorhanden ist. –

+0

@BaconBits: Ja, Ansgar hat dies richtig erklärt. Es wird nur umgeschaltet, wenn der erste leer ist. –

-1

einfach nach Dateien filtern älter als 14 Tage und fügen Sie "Archive", um ihre Attribute:

$threshold = (Get-Date).Date.AddDays(-14) 

Get-ChildItem 'C:\Temp' | Where-Object { 
    -not $_.PSIsContainer -and 
    $_.LastWriteTime -lt $threshold -and 
    -not ($_.Attributes -band [IO.FileAttributes]::Archive) 
} | ForEach-Object { 
    $_.Attributes += 'Archive' 
} 
+2

Sind Sie sicher, $ _. Attribute + = 'Archiv' funktioniert, wenn das Archiv bereits eingestellt ist? 'FileAttributes.Archive + FileAttributes.Archive' =' FileAttributes.Device'. Es scheint, Attribute auf "FileAttributes.Normal" (d. H. Nicht gesetztes Archiv) zu setzen, wenn ich es teste. Ich würde '$ _ bevorzugen. Attribute = $ _. Attribute -bor [System.IO.FileAttributes] :: Archive'. –

+1

@BaconBits Ah, drat. Ich dachte es würde, aber anscheinend '+ =' schaltet die Flagge um. Nun, das ist leicht genug behoben, indem man dem 'Where-Object'-Filter eine Überprüfung auf das Vorhandensein dieses Attributs hinzufügt. Danke für die Köpfe hoch. –

Verwandte Themen