如何在不使用attrib.exe的情况下通过Powershell更改扩展的Windows文件属性?

时间:2017-02-03 16:37:50

标签: powershell winapi filesystems

这似乎是一个非常简单的问题,但谷歌搜索没有给我什么。 这是错误(PS 5.1,胜利10.0.14393 x64):

Set-ItemProperty $myFileInfo -Name Attributes -Value ([System.IO.FileAttributes]::Temporary)
The attribute cannot be set because attributes are not supported. Only the following attributes can be set: Archive, Hidden, Normal, ReadOnly, or System.

attrib.exe似乎支持大多数System.IO.FileAttributes。不幸的是,似乎不适用于使用FileSystem PSDrives引用的文件。这就是我广泛使用的。

SetFileAttributes内核API调用创建包装器将是最后的选择。

我是否缺少设置这些扩展文件属性的其他[更简单]方法?

PS。除[System.IO.FileAttributes]::Temporary之外,我有兴趣设置[System.IO.FileAttributes]::NotContentIndexed

1 个答案:

答案 0 :(得分:5)

您可以直接编辑[FileInfo]对象的Attributes属性。例如,如果要排除C:\ Temp文件夹中的所有文件进行内容索引,则可以执行以下操作:

Get-ChildItem C:\Temp | ForEach{
    $_.Attributes = $_.Attributes + [System.IO.FileAttributes]::NotContentIndexed
}

这将获取每个文件,然后将[System.IO.FileAttributes]::NotContentIndexed属性添加到现有属性。您可以过滤文件以确保在尝试添加之前该属性尚不存在,因为这可能会导致错误(我不知道,我没有尝试过)。

编辑:正如@grunge所述,这在Windows Server 2012 R2中不起作用。相反,您需要做的是引用value__属性,它是按位标志值,并为NotContentIndexed添加按位标志。这适用于任何Windows操作系统:

Get-ChildItem C:\Temp | ForEach{
    $_.Attributes = [System.IO.FileAttributes]($_.Attributes.value__ + 8192)
}