如何根据第二行的内容重命名目录中的所有文件[POWERSHELL]

问题描述

如何使此脚本递归地读取目录中每个文件中文本的第二行,并根据#2行的内容重命名文件本身?

此脚本在这里找到: Renaming text files based on the first word in the file in Powershell

脚本使用文本的第一行仅重命名文件夹中的第一个文件,以下是文件中的前两行: 样品名称O123456.NT;想要重命名为: O14294(CXP-14294).NT

第1行:%

第2行: O14294(CXP-14294)

... ...文件的其余部分长数百行,等等

$files = Get-ChildItem *.NT


$file_map = @()
foreach ($file in $files) {
    $file_map += @{
        OldName = $file.Fullname
        NewName = "{0}.NT" -f $(Get-Content $file.Fullname| select -First 2)
    }
}

$file_map | % { Rename-Item -Path $_.OldName -NewName $_.NewName } 

解决方法

只需使用名称而不是全名,就可以更简洁地完成此操作。从文件中仅获取第二行的技巧是跳过第一行,然后然后仅获取一行。

所以:

    Get-ChildItem *nt |
    ForEach-Object{
        $oldname = $_.name;
        $newname = "{0}.nt" -f $(Get-Content $oldname | Select-Object -Skip 1 -First 1);
        Rename-Item -Path $oldname -NewName $newname
    }
,

另一个选项,通过建立索引获得第二行:

$files = (Get-ChildItem -path G:\Test -Filter *.ng).FullName

foreach ($File in $Files) {

  $MyName = (get-content -Path "$File")[1] + ".ng"
  Rename-Item -Path "$File" -NewName "$MyName"

}

HTH