2016-04-30 35 views
0

CSVファイルにあるキーワードに基づいてファイルとフォルダの名前を変更したいとします。ファイル名とフォルダ名の変更 - CSVファイルの使用

CSVは、ファイル名とフォルダ名を構成するキーワードの検索と置換を行います。

Search | Replace 
Document | DTX 
Processing | PRX 
Implementation | IMX 
...
  • ないすべてのファイル名は、ファイル名の各単語が含まれます。
  • フォルダ名に各単語が含まれているわけではありません
  • Powershellは子アイテム、つまりフォルダとファイル の名前を検索する必要があります。
  • それは単語(一致)が見つかった場合 - CSV

から代替を、私は私を助けるためにこれらのスレッドを見てきました:

Using Powershell to recursively rename directories using a lookup file

powershell script to rename all files in directory

http://code.adonline.id.au/batch-rename-files/

私はスニペットの下にしか管理していません

$folder = "C:\Folders"    #target folder containing files 
$csv = "C:\FileNameKeywords.csv"    #path to CSV file 

cd ($folder); 
Import-Csv ($csv) | foreach { 
    Rename-Item -Path $_.Path -NewName $_.Filename 
} 

これは、一度に1つだけを置き換えます。

質問:私は再帰的に検索し、検索したり、参照ファイルとしてCSVを使用してファイルとフォルダー名に置き換えることができますどのように

+0

はStackOverflowのへようこそ!あなたのコードをすべてのエラーメッセージと共に共有してください。 – user4317867

答えて

2

他の値で値を参照する必要がある場合、通常の移動先のデータ構造は辞書、またはPowerShellの用語ではハッシュテーブルの用語です。このような辞書にあなたのCSVを読む:

$keywords = @{} 
Import-Csv $csv | ForEach-Object { 
    $keywords[$_.Search] = $_.Replace 
} 

次に、それぞれの値と、各キーに置き換えることによって、あなたのフォルダツリーをトラバースして、新しいファイル名を構築する:

Get-ChildItem $folder -Recurse | ForEach-Object { 
    $newname = $_.Name 
    foreach ($word in $keywords.Keys) { 
    $newname = $newname.Replace($word, $keywords[$word]) 
    } 

    if ($_.Name -ne $newname) { 
    Rename-Item -Path $_.FullName -NewName $newname 
    } 
} 
+0

こんにちはAnsgar、あなたのコードをありがとう。それは正しくフォルダの名前を変更しました。フォルダ内のファイルの名前は変更されませんでした。私の無知を許して、私はフォルダ変数を$ fileに変更するのですか? – SA90

+1

申し訳ありませんが、それは私の間違いです。 '-Recurse'パラメータを' Get-ChildItem'に追加するのを忘れてしまったので、そのコードは実際にはフォルダに再帰しませんでした。一定。 –

+0

こんにちはAnsgar、それは子供の項目の名前を変更しました - ありがとうございます。最後の小さな細部 - 私はこのエラーが表示されます。Rename-Item:ソースとデスティネーションのパスが異なる必要があります、私は自分のデスクトップにフォルダを設定します。スクリプトは別のフォルダにありますが、なぜこのエラーが起きているのか分かりません。 – SA90

0

病気です。このシナリオでは、検索と置換がヘッダーであると仮定しています。これはあなたの$フォルダと$ csv変数に加えて。

$csvobject=import-csv $csv 
Foreach($obj in $csvobject){ 
$search=$obj.search 
$replace=$obj.replace 
get-childitem path $folder |where{$_.name -like "$($obj.search)"} | rename-item -newname {$_.name -replace "$search", "$replace"} } 

replaceは正規表現を処理するので、特殊文字が正しくエスケープされていることを確認する必要があります。

+0

こんにちはモントレー、エラーメッセージが表示されませんでした(+ $ csvobjectの$ obj){ – SA90

+0

これは有効なPowerShellの構文でもありません。 –

+0

私が投稿したときに間違った書式設定エラーがあったように私は謝罪します。 @insgar PS構文でないもの –

関連する問題