2016-05-04 6 views
1

私は約42,000の.jpgとビデオファイルを含むフォルダを取得しました。これは年/月ごとに異なるサブフォルダでソートされています。構造は次のようになります。コンテンツファイルのLastWriteTimeからフォルダプレフィックスを追加します

├─2015 
│ ├─01 - january 
│ │ ├─holiday 
│ │ └─biking 
│ └─02 - february 
│ ├─skiing 
│ └─etc 
└─2016 
    └─01 - january

私は今、すべてのサブフォルダ(。例えば休日)を含有する.jpgファイルのlastwritetimeの接頭辞を追加したいです。

ファイルの休日には最後の書き込み時間があります。2015-01-01 「休日」フォルダの名前は、「2015-01-01 - 休日」に変更されます。

私はすでにグーグル/検索/私が見つけたが、任意の成功なしのコードスニペットを調整しようとしました。誰かがここで私を助けてくれるのでしょうか?

編集:

私のコメントには判読不能なコードが残念です。ここにもう一度:

$dir = Get-Childitem 'C:\temp\2011' -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName 

$file = Get-Childitem -Path $dir -filter '*.jpg' 

Rename-Item -Path $dir.FullName -NewName ('{0:yyyy-MM-dd} {1}' -f $file.LastWriteTime, $dir.Name) 

事前に感謝します。

答えて

0

フォルダの最後の書き込み日を前置するのはかなり簡単です。基本的にはこのように書きます:

Get-Item 'C:\some\folder' | 
    Rename-Item -NewName { '{0:yyyy-MM-dd} {1}' -f $_.LastWriteTime, $_.Name } 

Rename-Itemは、パイプラインから名前を変更するオブジェクトを読み取り、-NewNameパラメータに渡されたスクリプトブロックは、の詳細についてはhereを参照してください(オブジェクトの名前と最後の書き込み時間から新しい名前を構築しますフォーマット演算子)。

ファイルの最終書き込み時刻にフォルダの名前を変更するためのアプローチは似ています。

$dir = Get-Item 'C:\some\folder' 
$file = Get-Item 'C:\path\to\your.jpg' 
Rename-Item -Path $dir.FullName -NewName ('{0:yyyy-MM-dd} {1}' -f $file.LastWriteTime, $dir.Name) 

編集:あなたの更新されたコードはあなたのいずれかのディレクトリのリストを加えたファイルのリストを1つ取得します。それはあなたが望むものではうまくいかないでしょう。あなたは、ディレクトリのリストを取得し、各ディレクトリのファイルのリストを取得する必要があります。

Get-Childitem 'C:\temp\2011' -Recurse | Where-Object { 
    $_.PSIsContainer 
} | ForEach-Object { 
    $dir = $_ 
    $files_in_dir = Get-ChildItem -Path $dir.FullName -Filter '*.jpg' 
} 

は、あなたがそのリストからフォルダの名前を変更したいことで、ファイルを特定し、そのフォルダの名前を変更

... | ForEach-Object { 
    ... 
    $file = $files_in_dir | ... 
    Rename-Item -Path $dir.FullName -NewName (...) 
} 
+0

おかげで(私は以下の最新のを使用しています)を使用する必要があるファイル最終書き込み時刻のかを決定する必要があります。私はそれを試してみましたが、私は次のようなエラーが出ています(ドイツ語ですが、エラーを解釈することはできますか?): PS J:\> C:\ temp \ 1 \ Unbenannt2.ps1 Rename-Item:Der Parameter "NewName "と書かれています。引数はスキップブロックと呼ばれています。 Ein Skriptblockは、あなたの意見を反映しています。 – Inverse26

+0

Bei C:¥temp¥1 Unbenannt2.ps1:3 Zeichen:41 + Rename-Item -Path $ dir.FullName -NewName <<<< {'0:yyyy-MM-dd} {1} f $ file.LastWriteTime、$ file。名前: + CategoryInfo:MetadataError :(:) [名前の変更]、ParameterBindingException + FullyQualifiedErrorId:ScriptBlockArgumentNoInput、Microsoft.PowerShell.Commands.RenameItemCommand – Inverse26

+0

悪いです。 2番目の例では、スクリプトブロック(中括弧)ではなく、部分式(括弧)でなければなりません。 –

0

私はAnsgarの回答がすべてfor-eachループであると思うので、すべてのディレクトリの名前を変更することができます。あなたは、ディレクトリごとに複数のファイルを持っている場合にも、あなたは速いREPONSE Angsarため

再び
$dir = get-item 'C:\temp\2011' -Recurse | ?{ $_.PSIsContainer } 
$dir | % { $file = Get-ChildItem -Path $_.FullName | Sort LastWriteTime -desc | select -first 1; 
Rename-Item -Path $_.FullName -NewName ('{0:yyyy-MM-dd} {1}' -f $file.LastWriteTime, $_.Name) } 
関連する問題