1

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

Get-ChildItem -recurse | foreach { New-ItemProperty -Path $ .FullName -Name "OriginalLocation" -PropertyType 字符串 -Value $ .FullName }

但是,当我尝试这个时,我收到了以下错误的垃圾邮件:

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

经过一番搜索,似乎 New-ItemProperty 除了使用注册表之外几乎没有用处。美好的。Windows 有无数其他文件属性,我应该能够劫持以完成此操作。“标签”和“标签”浮现在脑海中。因此,让我们尝试通过 Set-ItemProperty 设置它们。

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

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

4

2 回答 2

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
于 2012-05-07T08:20:06.743 回答
1

另一种选择可能是使用备用数据流来存储您的路径。如果您运行的是 PowerShell 3.0,则可以很容易地操作它们。根据第一篇文章,你会有类似的东西:

"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()                                                                                                                       
于 2012-05-07T06:40:39.357 回答