如何在保留文件时间戳的同时重命名文件夹中的所有指定文件扩展名?

How can I rename all specified file extensions within a folder while preserving the file timestamps?

我正在尝试重命名集合 .txt 文件的文件扩展名同时保留时间戳。我首先尝试使用 Robocopy, but this tool can only copy files from one directory to another while preserving file timestamps (file extensions cannot be changed as far as I can tell). I used PowerRename,这使得文件扩展名重命名变得容易,但它也会修改重命名文件的时间戳。

最后我使用了Windows MOVE命令来实现(如下图):

MOVE "C:\Folder\Filename.txt" "C:\Folder\New_Filename.txt"

但是我在处理文件扩展名时遇到了问题(特别是重命名多个文件扩展名)。因为当我尝试根据自己的需要使用此代码示例时,我想出了这个:

 Move-Item -Path C:\Users\Elon\Downloads\notes\*.txt -Destination C:\Users\Elon\Downloads\notes\*.md

此命令响应错误“Move-Item:路径中的非法字符”- 我怀疑这是因为我在目标位上使用了通配符?任何帮助,将不胜感激。谢谢大家!

使用Get-ChildItem发现目标文件,然后一一移动:

Get-ChildItem C:\Users\Elon\Downloads\notes\ -File -Filter *.txt |Move-Item -Destination { "C:\Users\Elon\Downloads\notes$($_.BaseName).md" }

试一试,与 Mathias 的回答基本相同,但它使用了 foreach-object 循环,因此我们可以在 重命名文件之前捕获 LastWriteTime 然后在重命名后我们可以将旧日期设置为新文件(这就是为什么我们使用 -PassThru 以便我们可以捕获指向新文件的对象)。

Get-ChildItem ./test/ -Filter *.txt | ForEach-Object {
    $remember = $_.LastWriteTime
    $newName = '{0}.md' -f $_.BaseName
    $newFile = Rename-Item -LiteralPath $_.FullName -NewName $newName -PassThru
    $newFile.LastWriteTime = $remember
}