1

ファイルの移動を追跡するために、ファイルシステム内の現在の場所を含む特定のスコープの下でファイルにプロパティを追加することに興味があります。これは、次のようなコマンドを使用して、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のことですか?

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 に答える