我正在尝试重命名多个子文件夹中的所有 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"