使用 CSV 源在 powershell 中重命名部分文件

加勒特

我想重命名文件集合的.jpg文件名的一部分我建立了一个.csv表,其中包含旧部分名称和新部分名称的列。文件命名为part1.part2.part3.jpg,我只想替换第 1 部分。.csv如下所示:

在此处输入图片说明

这是我的代码,它似乎只搜索.csv每个源图像中的第一个原始名称和第一个新名称,实际上只重命名其中一个图像。

#import naming conventions
$csvData = Import-Csv ".\Orig_to_new.csv"

#rename source file
$csvData | % {
    $original = $_.Original
    $new = $_.Real

    #get the source images
    $sourceImages = GCI -Recurse -Filter *.jpg ".\Renamed_Archive"
    
    foreach($sourceImage in $sourceImages){

        $sourceImage | Rename-Item -NewName { $_.Name -replace $original, $new}
    }
}

理想情况下,脚本会看到每个 sourceImage 的原始名称,并根据.csv文档将其替换为新名称,例如根据提供的.csv将“abc”更改为“xyz”,将“123”更改为“456”

免责声明:我之前问过一个类似的问题,并认为我有一个工作模型,但我无法让它发挥作用。

谢谢

圣地亚哥·斯夸松

您可以使用此脚本的重命名部分,我假设您已经知道该怎么做。

  • 首先,将您的 CSV 转换为哈希表
  • 然后你可以循环遍历所有图像,使用.分隔符分割它们的名称(我(?=\.)用来保留点)
  • 我们知道数组的位置 0 是您要替换的位置,在这里您可以使用哈希表获取该部分的新名称,并将 Name 数组的位置 0 替换为我们从您的 CSV 中获取的新名称。
  • 最终,您再次将数组加入一个字符串。
$csv=@'
Original,New
abc,xyz
123,456
qwe,rty
'@|convertfrom-csv

$nameMap=@{}

$csv.foreach({
    if(-not $nameMap.ContainsKey($_.Original))
    {
        $nameMap.Add($_.Original,$_.New)
    }
})

$sourceImages=gci -Recurse -Filter *.jpg -Path .

foreach($image in $sourceImages)
{
    $name=$image.Name -split '(?=\.)'
    $newPart1=$nameMap[$name[0]]
    $name[0]=$newPart1
    $newName=-join $name

    'Old Name: {0} // New Name: {1}' -f $image.Name,$newName
}

# Looks like this:

PS /~> ./script.ps1
Old Name: 123.part2.part3.jpg // New Name: 456.part2.part3.jpg
Old Name: abc.part2.part3.jpg // New Name: xyz.part2.part3.jpg
Old Name: qwe.part2.part3.jpg // New Name: rty.part2.part3.jpg

编辑:在此处添加完整的脚本代码,以及新的 If 条件。

#import naming conventions
$csv = Import-Csv ".\table.csv"

$nameMap=@{}

$csv.foreach({
    if(-not $nameMap.ContainsKey($_.Original)){
        $nameMap.Add($_.Original,$_.New)
    }
})

#identify files for renaming
$sourceImages = Get-ChildItem -Recurse -Filter *.jpg -Path ".\images"

foreach($image in $sourceImages)
{
    $name=$image.Name -split '(?=\.)'

    # Adding this If condition, reasoning below.
    # Rename files only If the position 0 of the splitted name is in our nameMap hashtable.
    # This is because if it's not there you would end up with files named like:
    # "..part2.part3.jpg" because $newPart1 var would be null.
    if($nameMap.ContainsKey($name[0]))
    {
        $newPart1=$nameMap[$name[0]]
        $name[0]=$newPart1
        $newName=-join $name

        'Old Name: {0} // New Name: {1}' -f $image.Name,$newName

        Rename-Item $image.FullName -NewName $newName
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章