我有大约两千个文本文件需要重命名,但我需要打开文件,找到以字母“O”开头的行,提取“O”和接下来的五个字符,关闭文件,然后将文件重命名为找到的文本。
我已经尝试了好几次了,想教会自己足够的知识来尝试,但我的时间不多了。
有人有什么建议吗?否则我将不得不打开每个文件,找到文本并逐个重命名文件。
编辑
首先,感谢您的回复。
每个文本文件只有一行以“O”开头。这些是 CNC 程序,“O”是 CNC 设备识别的程序名称。例如“O01234”。
这是该程序格式的一个示例。
%
O01234
有时文件的第一行为空或只是一个 CR,而下一行将包含 %。这就是为什么我说第二行或第三行将包含“O”。目前,程序有一个字母数字文件名,如“V180OP20.ptp”。文件扩展名 .ptp 正是我们的 CAM 软件附加的。文件本身只包含 ASCII 文本。
有些文件也可能只包含“O”后面的 4 个数字,而不是 5 个。
答案1
Windows 7 具有一个比 DOS 更好的新 shell,它被称为 PowerShell。可以使用“开始菜单 > 所有程序 > 管理工具 > Windows PowerShell”快捷方式打开 PowerShell。
您需要运行此命令一次以使脚本能够在您的计算机上运行:
Set-ExecutionPolicy RemoteSigned
然后您只需使用以下代码行创建脚本(.ps1 文件扩展名):
$myFolderFullOfTextFiles = 'C:\Temp\Test'
$linesToReadInEachTextFile = 5
$myTextFiles = Get-ChildItem -Path $myFolderFullOfTextFiles
foreach( $textFile in $myTextFiles )
{
$newName = ''
foreach( $line in $(Get-Content -Path $textFile.FullName -Head $linesToReadInEachTextFile) )
{
if( $line -like 'O*' )
{
$newName = $textFile.DirectoryName + '\' + $line.Substring(0,6) + '.txt'
}
}
try
{
Write-Host $newName
Rename-Item -Path $textFile.FullName -NewName $newName
}
catch
{
Write-Host "Failed to rename $textFile."
}
}
'C:\Temp\Test'
用您的文件夹路径替换,+ '.txt'
如果您的文本文件没有扩展名,则删除。然后只需运行脚本。
答案2
您可以使用带有 findstr 的 FOR 循环来查找以“O”开头的行,然后根据返回的文本重命名文件。
使用几个文件作为示例:
C:\temp>dir /s /b
C:\temp\1.txt
C:\temp\2.txt
C:\temp\3.txt
您可以使用以下命令返回当前目录和任何子目录中所有文件以“O”开头的行的文本:
C:\temp>findstr /S /B O *.txt
1.txt:Oabcde
2.txt:Oabcdf
3.txt:Oabcdg
您现在可以使用输出中的冒号作为分隔符将当前文件名与所需文件名分开:
C:\temp>for /f "tokens=1-2 delims=:" %A in ('findstr /S /B O *.txt') do ren %A %B.txt
C:\temp>ren 1.txt Oabcde.txt
C:\temp>ren 2.txt Oabcdf.txt
C:\temp>ren 3.txt Oabcdg.txt
您没有列出太多细节,因此无法给出您需要的确切命令,但希望这个示例能帮助您入门。如果 O 和后面的五个字符不是该行上的唯一字符,则可以将正则表达式与 findstr 一起使用。
编辑::根据 OP 中的更新/编辑,CD 到包含您的文件的目录并运行以下命令:
for /f "tokens=1-2 delims=:" %A in ('findstr /S /B O *.ptp') do ren %A %B.ptp