Powershell:使用New-ItemProperty,Set-ItemProperty的文件元数据中的NTFS路径?

时间:2012-05-06 18:40:44

标签: powershell properties wmi metadata ntfs

我有兴趣在我的文件系统中包含其当前位置的特定范围内向我的文件添加属性,以便跟踪文件移动。我认为这可以使用New-ItemProperty完成,命令类似于以下命令:

Get-ChildItem -recurse | foreach {New-ItemProperty -Path $ .FullName -Name“OriginalLocation”-PropertyType string -Value $ .FullName}

然而,当我尝试这个时,我发现了以下错误:

New-ItemProperty:无法使用界面。此提供程序未实现IDynamicPropertyCmdletProvider接口。

经过一些搜索后,看起来New-ItemProperty除了使用注册表外几乎没用。精细。 Windows有无数其他文件属性我应该能够劫持才能完成这项工作。想到“标签”和“标签”。所以让我们尝试通过Set-ItemProperty来设置它们。

Set-ItemProperty:属性System.String Label = D:\ test \ file.txt不存在。

看来我需要创建这些属性。这是New-ItemProperty的缺点吗?也许在任意项目上设置这样的属性是一些我不知道的WMI?

2 个答案:

答案 0 :(得分:3)

以下是我使用重定向('<'&'>')的解决方案,它允许在CMD.EXE中操作备用数据流。它在Powershell中工作,没有任何扩展

# AlternateDataStream.ps1

$scriptBlockSetStream = {cmd /C `"echo $($Args[0])`>$($Args[1]):$($Args[2])`"}
$scriptBlockGetStream = {cmd /C `"more `<$($Args[0]):$($Args[1])`"}

$streamName = "NativeFilePath"
$File = "C:\Temp\ADSTest\toto.txt"
$streamContent = Split-Path -Path $File -Parent

# Set the data stream
Invoke-Command -ScriptBlock $scriptBlockSetStream  -ArgumentList $streamContent,$File,$streamName
# Get the Data Stream
$res = Invoke-Command -ScriptBlock $scriptBlockGetStream  -ArgumentList $File,$streamName
$res

答案 1 :(得分:1)

另一种选择可能是使用alternate data streams来存储您的路径。如果您正在运行PowerShell 3.0,那么can manipulate them非常容易。根据第一篇文章,你会有类似的东西:

"echo test" | out-file c:\powershell\test.ps1                                                                                         

$fs = new NTFS.FileStreams('c:\powershell\test.ps1')                                                                                  
$fs.add('OriginalPath')                                                                                                                  

$stream = $fs.Item('OriginalPath').open()                                                                                                
$sw = [System.IO.streamwriter]$stream                                                                                                 
$sw.writeline('<path>')                                                                                                  
$sw.close()                                                                                                                           
$stream.close()