2017-12-30 113 views
1

特定のフォルダの+ 14  日より古いすべてのファイルにアーカイブビットを追加するPowerShellスクリプトをセットアップしようとしています(例:C:\Temp)。PowerShellで14日以上経過したファイルにアーカイブビットを追加

これはCMDで可能ですが、+aビットを+14  日以上のファイルにのみ追加する方法はありますか。

attrib +A C:\temp\*.* 
+0

私は(は、Get-ItemProperty $ file.fullname( '+ A :) – user2602460

答えて

1

最初に属性が存在するかどうかを確認してから、条件に基づいて設定できます。 アーカイブビットを切り替えるには、Bitwise Exclusive Or(BXOR)オペレータを使用できます。

あなたはこのような何かを行うことができます。

$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) 
    } 
} 

はそれがお役に立てば幸いです。

+0

にそれを単に変更しました).attributes -BXOR $ attrib) 'すでにアーカイブフラグが設定されている場合、アーカイブフラグを解除しませんか?つまり、if文があることは分かっていますが、論理的には '-bor'演算子を使いたいと思います。 –

+1

@BaconBits No.属性を切り替えますが、ファイル内の値をインプレースで更新しません。ファイルの属性を変更するには、値を 'Attributes'プロパティに割り当てる必要があります。このコードは、属性が最初に存在しない場合にのみこれを行います。 –

+0

@BaconBits:はい、Ansgarはこれについて正しく説明しています。最初のものが空の場合にのみ切り替えます。 –

-1

は、単純に14日より古いファイルをフィルタリングし、その属性に "アーカイブ" を追加します。

申し訳
$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

'$ _。Attributes + = 'Archive''はアーカイブが既に設定されている場合はうまくいきますか? 'FileAttributes.Archive + FileAttributes.Archive' =' FileAttributes.Device'。私はそれをテストするときに属性を 'FileAttributes.Normal'(すなわち、unset archive)に設定しているようです。 '$ _。Attributes = $ _。Attributes -bor [System.IO.FileAttributes] :: Archive'が好きです。 –

+1

@BaconBitsああ、drat。私は思っていましたが、明らかに '+ ='はフラグをトグルします。つまり、その属性の存在を「Where-Object」フィルタに追加することで、簡単に解決できます。ヘッドアップをありがとう。 –