How to rename files using a list file?

笑着哭i 提交于 2019-12-24 13:12:53

问题


I have 100s of files that I would like to rename in a specific manner according to a correlated list. Rather than repeating the same cmdlets, as below, I would like to point the cmdlet to a couple of list files (below) containing the old and new names, say old.txt and new.txt. How do I do this using PowerShell?

Example:

Rename-Item -Path "E:\MyFolder\old1.pdf" -NewName new1.pdf
Rename-Item -Path "E:\MyFolder\old2.tif" -NewName new2.pdf
Rename-Item -Path "E:\MyFolder\old3.pdf" -NewName new3.pdf

List Files:

old.txt =

old1.pdf
old2.tif
old3.pdf

new.txt =

new1.pdf
new2.tif
new3.pdf

回答1:


To avoid misalignment between the entries in old.txt and new.txt files, you could also put the files into a CSV file:

renames.csv =

old1.pdf,new1.pdf
old2.tif,new2.tif
old3.pdf,new3.pdf

Now you can use Import-Csv to import your "translation sets":

$Renames = Import-Csv '.\renames.csv' -Header "OldName","NewName"

foreach($File in $Renames) {
    Rename-Item $File.OldName $File.NewName
}



回答2:


Simply read your two files into two lists and process them like this:

$old = Get-Content 'old.txt'
$new = Get-Content 'new.txt'

Set-Location '$:\MyFolder'

for ($i = 0; $i -lt $old.Count; $i++) {
  Rename-Item $old[$i] $new[$i]
}



回答3:


So just for yucks, here is the one-liner version. It does depend on you being in the C:\MyFolder dir when you run it but that could easily be changed to a variable:

Get-Content new.txt -PipelineVariable NewName | 
    Foreach {$oldNames = Get-Content old.txt;$i=0} {Get-ChildItem $oldNames[$i++]} | 
    Rename-Item -NewName {$NewName} -WhatIf


来源:https://stackoverflow.com/questions/31012741/how-to-rename-files-using-a-list-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!