2016-04-30 62 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 
} 

它一次只替換一個。

問:

我如何可以遞歸搜索和使用CSV作爲查找或引用文件中的文件和文件夾名稱取代。

+0

歡迎計算器!請分享您的代碼以及任何錯誤消息。 – 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,感謝您的代碼,它正確地重命名了這些文件夾。它沒有重命名文件夾內的文件。請原諒我的無知,我將文件夾變量更改爲$文件? – SA90

+1

對不起,這是我的錯誤。我忘了將參數'-Recurse'添加到'Get-ChildItem'中,因此代碼實際上並沒有遞歸到文件夾中。固定。 –

+0

嗨Ansgar,它改名爲兒童物品 - 謝謝。最後一個小細節 - 我得到這個錯誤重命名 - 項目:源和目標路徑必須不同,我將文件夾設置到我的桌面。該腳本位於另一個文件夾中,不知道爲什麼會發生此錯誤 - – 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"} } 

替換句柄正則表達式,所以你需要確保任何特殊字符正確轉義。

+0

您好蒙特利,我跑錯了代碼錯誤消息丟失(+爲每個($ obj在$ csvobject){ – SA90

+0

這甚至不是有效的PowerShell語法 –

+0

我很抱歉看起來有一些格式錯誤,我錯過了當我張貼。在手機瀏覽器上工作@ansgar什麼不是PS語法? –