【问题标题】:rename using a lookup csv file使用查找 csv 文件重命名
【发布时间】:2019-09-12 20:47:48
【问题描述】:

我正在尝试读取文件目录,然后在具有两列名称的 CSV 文件中搜索文件,新名称。我想查找该文件,然后用新名称重命名原始文件。有时我的原始文件会从 CSV 列表中丢失。

$folder = "c:\test\"
$csv    = "C:\tests\replace.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
  }
}

它确实适用于某些文件,然后根据新名称字段将 1 个文件重命名为长字符串。任何帮助都会很棒。

【问题讨论】:

  • 你能举一个CSV文件中数据的例子吗?我认为你可能过于复杂了。
  • 如果 csv 文件包含完整的当前名称作为键,您不需要迭代所有键,只需使用当前名称作为键。 `Rename-Item 也很聪明,不会尝试重命名为相同的名称。
  • 在我的 csv 文件中,我有两列,搜索,新名称,并用逗号分隔。内容类似于 file1111.dat,newfilename.dat

标签: powershell


【解决方案1】:

正如 LotPings 所说:由于您已经创建了 lookup-hashtable,因此您不需要为每个项目迭代它 - 只需像这样将文件名作为键传递:

# replace this with your Import-Csv later
$csv_data = "Search,Replace
old_file.txt,new_file.txt
old_file2.csv,new_file2.csv
"

$folder = ".\testfiles"

$keywords = @{ }
$replace_data = $csv_data | ConvertFrom-Csv # replace this with your Import-Csv later

$replace_data | ForEach-Object {
    $keywords[$_.Search] = $_.Replace
}

Get-ChildItem $folder -Recurse | ForEach-Object {
    $file_name = $_.Name

    # skip files that are not listed in your csv
    if ($keywords."$file_name") {
        Rename-Item $_.FullName $keywords."$file_name"
    }
}

【讨论】:

    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 2021-06-09
    • 2017-06-03
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2019-01-05
    相关资源
    最近更新 更多