批量重命名文件夹和子文件夹中的所有 PNG 文件

批量重命名文件夹和子文件夹中的所有 PNG 文件

我正在尝试重命名多个子文件夹中的所有 PNG 文件。请参阅下文以了解我正在做的事情:

What is currently in place:
COMPANY
     SERVER1
         (Random).png
COMPANY2
     SERVER32
         (Random).png

What I want:

COMPANY
     SERVER1
         Company - Server1 - (Date PNG Modified).png
COMPANY2
     SERVER32
         Company2 - Server32 - (Date PNG Modified).png

我该如何实现这一点?我遇到的问题是如何获取第一个和第二个目录名称以及可以粘贴到文件名中的修改日期。

我当前的脚本如下:

@echo off
for /r %%D in (.) do (
  for /f "delims=" %%F in ('dir /b /A:-D "%%D\*.png"') do (
    echo ren "D:\FinalDir\%%F" "%%~nxD-VirtualBootTest-3-3-18.png"
)) >> "D:\FinalDir\RenameCommands.txt"


FOR /R "D:\OriginalDir" %%i IN (*.png) DO COPY "%%i" "D:\FinalDir"

现在它正在做的是收集文件夹中所有目录中的所有 PNG 文件,并构建一个批处理文件来重命名复制到 FinalDir 中的所有文件。重命名的最终结果将看起来像 SERVER1-VirtualBootTest-3-3-18.png。我不知道如何使用文件更改日期,以及如何在文件上方添加两个目录。

答案1

所以这个脚本应该可以解决问题。它相对简单。

$files = Get-ChildItem $basePath -File -Filter *.png -Recurse
foreach($file in $files){
    $pathParts = $file.fullName.split('\')
    $dateMod = $file.LastWriteTime.ToString("MM-dd-yyyy")
    $first = $pathParts[-3]
    $second = $pathParts[-2]
    $file | Rename-Item -NewName "$first - $second - $dateMod.txt"
}

这里是分解逐部分地:

$files = Get-ChildItem $basePath -File -Filter *.png -Recurse

首先,它从基本路径开始获取所有文件(您必须将$basepath变量设置为您的路径)递归到结构的末尾。

foreach($file in $files){
    $pathParts = $file.fullName.split('\')
    $dateMod = $file.LastWriteTime.ToString("MM-dd-yyyy")
    $first = $pathParts[-3]
    $second = $pathParts[-2]
    $file | Rename-Item -NewName "$first - $second - $dateMod.txt"
}

然后对于每个文件:

  • 根据“\”字符拆分文件的全名(路径和文件名)。

    $pathParts = $file.fullName.split('\')

  • 访问 lastWriteTime 并将其格式化为您想要的格式。

    $dateMod = $file.LastWriteTime.ToString("MM-dd-yyyy")

  • 对于$first$second变量,它访问从右侧分割的路径(-1 是文件名,-2 是父级,-3 是该父级的父级,依此类推)。

    $first = $pathParts[-3]

    $second = $pathParts[-2]

  • 获取所有收集到的信息并将文件重命名为所收集到的信息。

    $file | Rename-Item -NewName "$first - $second - $dateMod.txt"

相关内容