2012-05-06 5 views
1

ファイルの移動を追跡するために、ファイルシステム内の現在の場所を含む特定のスコープの下でファイルにプロパティを追加することに興味があります。これはNew-ItemPropertyで、次のようなコマンドを使って行うことができると思います。Powershell:New-ItemProperty、Set-ItemPropertyを使用したファイルメタデータのNTFSパス?

Get-ChildItem -recurse | {$ .FullName -Value新-ItemProperty -Path $ .FullName -Name "OriginalLocation" -PropertyType文字列} foreachの

私はこれを試してみてくださいしかし、私は次のエラーでスパムだ:

New-ItemProperty:インターフェイスを使用できません。 IDynamicPropertyCmdletProviderインターフェイスは、このプロバイダによって実装されていません。

いくつかの検索の後、New-ItemPropertyは、レジストリを使用して作業する以外はすべて役に立たないようです。ファイン。 Windowsにはこれを実現するためにハイジャックできるはずの無数のファイルプロパティがあります。 「ラベル」と「タグ」が気になります。ですからSet-ItemPropertyを介してそれらを設定しようとしましょう。

Set-ItemProperty:プロパティSystem.String Label = D:\ test \ file.txtは存在しません。

私はこれらのプロパティを作成する必要があります。これはNew-ItemPropertyの欠点ですか?多分このようなプロパティを任意の項目に設定することは、わからないWMIのことですか?

答えて

3

は(「<」& 『>』)リダイレクトを使用して私の解決策であるCMD.EXEに代替データストリームを操作することができ:最初の記事に基づいて、あなたは似た何かを持っているでしょう。それも、(私は解決策として、ここで他の回答にその可搬性のおかげでマークした、私は悲しいことに、PowerShellの3を実行していないよ、とあなたはリンクの記事は非常に興味深いですしながら、任意のextentions

# 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 
+0

これは、移植性のしやすさのおかげです。ありがとう! – bwerks

+0

なぜ 'Invoke-Command'で複雑になるのですか? '&$ scriptBlockSetStream $ streamContent $ File $ streamName'で十分でしょうか? – Joey

+2

私の信念は、スクリプトでは、読みやすさは簡潔さよりも重要です。私は '&'演算子をコマンドラインで使用します 'Invoke-Command'はあなたにとって複雑ですが、'& '演算子よりも読みやすくなります。スクリプトにあるように、いくつかのキャラクタが必要です。 – JPBlanc

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()                              
+0

なしPowerShellの作品それは、少し控えめなcmdのラップです)。まだあなたをアップアップしました。ありがとう! – bwerks

関連する問題