【问题标题】:Rename multiple files in a directory by looping through a list of names in a .txt / .csv file for a partial match通过遍历 .txt / .csv 文件中的名称列表来重命名目录中的多个文件以进行部分匹配
【发布时间】:2020-10-18 10:52:20
【问题描述】:

我正在尝试自动重命名 Windows 7 目录中的多个文件。我需要搜索源索引文件(.txt 或 .csv,它是扩展文件名的列表),并且在与原始文件名部分匹配的情况下,复制前 12 个字符(索引中相关字符串的文件)并相应地重命名原始文件(并保留原始文件扩展名)。

例如

(a) 当前在 Windows 目录中的文件命名如下(数百个文件):

  • 23456abc.doc
  • 76543cab.doc
  • 92837bca.doc

(b) .txt/.csv 文件中的值如下(数百个值 - 注意:这些没有文件扩展名):

  • BetterName1.RandomText1.23456abc.MoreRandomText1
  • BetterName2.RandomText2.76543cab.MoreRandomText2
  • BetterName3.RandomText3.92837bca.MoreRandomText3

(c) 期望的结果是文件被自动重命名如下:

[通过在 (b) 中的值列表中搜索 (a) 中的文件名,如果匹配,则返回前 12 个字符作为新文件名,同时保留原始文件扩展名]

  • BetterName1.doc
  • BetterName2.doc
  • BetterName3.doc

注意:我的偏好是使用 .txt 格式的索引文件进行查找。但是有需要我也可以使用 .csv

我以前从未使用过 PowerShell,并且是 Windows 批处理脚本的新手。我四处搜索并试图将代码的 sn-ps 拼凑成一个 Windows 批处理脚本(也尝试了一个 PowerShell 脚本)来实现这一点,但我在这方面的知识严重缺乏,所以不幸的是我仍在努力解决问题。

任何帮助将不胜感激。提前谢谢你。

附:这是我尝试使用但无济于事的 PowerShell 脚本。

$fdPath = 'C:\TEST\Data'
$sourcelistFiles = Get-ChildItem -Path $FDPATH\*.txt | ForEach-Object {$_.user } FullName
$findReplaceList = Import-Csv -Path $FDPATH\AllNames.csv


$totalitems = $sourcelistFiles.count
$currentrow = 0
foreach ($sourcelistFile in $sourcelistFiles)
{
    $currentrow += 1
    Write-Progress -Activity "Processing record $currentrow of $totalitems" -Status "Progress:" -PercentComplete (($currentrow / $totalitems) * 100)

    [string] $txtSourceListFile = Get-Content $sourcelistFile | Out-String

    ForEach ($findReplaceItem in $findReplaceList)
    {
        $txtSourceListFile = $txtSourceListFile -replace "$($findReplaceitem.FindString)", "$($findReplaceitem.ReplaceString)"
    }
    
    $txtSourceListFile | Set-Content ($sourcelistFile)
 -NoNewLine
}

【问题讨论】:

    标签: windows powershell loops scripting batch-rename


    【解决方案1】:
    $FDPATH = 'C:\TEST\Data'
    foreach($obj in (Import-Csv -Path $FDPATH\AllNames.csv)){
      foreach($thing in $(gci -Path $FDPATH\*.txt)){
        if("123.hash.avocado" -match $thing.basename){$ret = $thing.fullname}
      }
      $stuff = $obj -split "."
      ren -Path $ret -NewName $stuff[0]
    }
    

    看看这是否有效,它遍历 csv 然后遍历目录以查看目录的名称是否在正在迭代的 csv 行中,然后将变量设置为文件的全名并将其重命名为句号之前的名字。

    【讨论】:

      【解决方案2】:

      Import-CSV LISTA.csv -Header newFileName | % { Copy-Item -Path archivo_convert.pdf -Destination "$($_.newfilename).pdf" }

      【讨论】:

        猜你喜欢
        • 2021-01-04
        • 2019-08-14
        • 2020-04-19
        • 2019-09-19
        • 2017-04-01
        • 2019-11-13
        • 2018-04-10
        • 2021-05-24
        • 2022-08-17
        相关资源
        最近更新 更多