Powershell:文件元数据中的NTFS路径是否具有新的ItemProperty,是否设置ItemProperty?

Powershell:文件元数据中的NTFS路径是否具有新的ItemProperty,是否设置ItemProperty?,powershell,properties,wmi,metadata,ntfs,Powershell,Properties,Wmi,Metadata,Ntfs,我感兴趣的是在包含文件系统中当前位置的特定范围内为文件添加属性,以便跟踪文件移动。我认为这可以通过newitemproperty实现,使用类似于以下的命令: Get ChildItem-recurse | foreach{New ItemProperty-Path$.FullName-Name“OriginalLocation”-PropertyType string-Value$.FullName} 但是,当我尝试此操作时,会收到以下错误的垃圾邮件: 新建ItemProperty:无法使用接口

我感兴趣的是在包含文件系统中当前位置的特定范围内为文件添加属性,以便跟踪文件移动。我认为这可以通过newitemproperty实现,使用类似于以下的命令:

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

但是,当我尝试此操作时,会收到以下错误的垃圾邮件:

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

经过一些搜索之后,新的ItemProperty似乎除了使用注册表之外几乎没有任何用处。好的Windows有无数其他文件属性,我应该能够劫持,以便做到这一点。我想到了“标签”和“标签”。因此,让我们尝试通过Set-ItemProperty来设置它们

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


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

另一个选项可能是用于存储路径。如果您运行的是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()                                                                                                                       
“echo test”|输出文件c:\powershell\test.ps1
$fs=新的NTFS.FileStreams('c:\powershell\test.ps1')
$fs.add('OriginalPath')
$stream=$fs.Item('OriginalPath').open()
$sw=[System.IO.streamwriter]$stream
$sw.writeline(“”)
$sw.close()
$stream.close()

另一个选项可能是用于存储路径。如果您运行的是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()                                                                                                                       
“echo test”|输出文件c:\powershell\test.ps1
$fs=新的NTFS.FileStreams('c:\powershell\test.ps1')
$fs.add('OriginalPath')
$stream=$fs.Item('OriginalPath').open()
$sw=[System.IO.streamwriter]$stream
$sw.writeline(“”)
$sw.close()
$stream.close()

这是我的解决方案,它使用重定向(“”),允许在
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
#AlternateDataStream.ps1
$scriptBlockSetStream={cmd/C`“echo$($Args[0])`>$($Args[1]):$($Args[2])`}

$scriptBlockGetStream={cmd/C`“more`这是我的解决方案,它使用重定向(“”),允许在
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
#AlternateDataStream.ps1
$scriptBlockSetStream={cmd/C`“echo$($Args[0])`>$($Args[1]):$($Args[2])`}

$scriptBlockGetStream={cmd/C`”更多`由于易于移植,将此标记为答案。谢谢!为什么调用命令如此复杂?
&$scriptBlockSetStream$streamContent$File$streamName
不够吗?我的信念是:在脚本中,可读性比简洁性更重要。我将在命令行
Inv中使用
&
运算符oke命令
对您来说很复杂,但对我来说它比
操作符更可读,而且因为我们在脚本中,它只需要几个字符。由于易于移植,将此标记为答案。谢谢!为什么
调用命令
如此复杂?
和$scriptBlockSetStream$streamContent$File$streamName不会吗足够了?我的信念是:在脚本中,可读性比简洁性更重要。我将在命令行中使用
&
操作符
调用命令
对您来说很复杂,但它比
&
操作符更具可读性,因为我们在脚本中只需要多几个字符。我没有运行powershell 3,sadly,虽然您链接的文章非常有趣,但由于它的可移植性,我在这里将另一个答案标记为解决方案(即使它是cmd的稍微不那么优雅的包装)。仍然支持你。谢谢!遗憾的是,我没有运行powershell 3,虽然你链接的文章很有趣,但由于它的可移植性(即使它是cmd的一个稍微不那么优雅的包装),我在这里将另一个答案标记为解决方案。仍然支持你