问题描述
如何使此脚本递归地读取目录中每个文件中文本的第二行,并根据#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