我有一个包含 400 多个子文件夹的目录。每个子文件夹中每天都会出现一个新文件。每个新文件的名称都与昨天出现在同一个文件夹中的文件相同。每个文件夹包含的文件名称与其他文件夹中的文件不同,但同一文件夹中的新文件始终具有相同的名称。我不希望每天都覆盖文件。相反,我希望 Powershell 在文件名后面和扩展名之前添加今天的日期。我知道如何对单个子文件夹执行此操作,但我不想创建 400 多个脚本(每个子文件夹一个)。
这是可以完美完成每个文件夹任务的脚本。
$fileToRename = "E:\Backup\ABLBackup\folder1\Project1.txt"
if (Test-Path $fileToRename)
{
$fileName = [system.io.path]::GetFileNameWithoutExtension($fileToRename)
$dateSuffix = get-date -Format 'yyyy_MM_dd'
$fileExtension = [system.io.path]::GetExtension($fileToRename)
$newFileName = '{0}_{1}{2}' -f $fileName, $dateSuffix, $fileExtension
Rename-Item -Path $fileToRename -NewName $newFileName
}
我想知道如何修改上面的脚本,以便所有 400 多个子文件夹都可以包含在一个脚本中。我知道我可以重复相同的命令 400 多次并将其保存为一个脚本,但这不可行,因为用户会在没有通知我的情况下添加新文件夹。肯定有某种自动获取子文件夹中出现的所有新文件的方法。
文件夹结构如下:
E:\Backup\ABLBackup\folder1\Project1.txt
E:\Backup\ABLBackup\folder2\Project2.txt
E:\Backup\ABLBackup\folder3\Project3.txt
E:\Backup\ABLBackup\folder4\Project4.txt
任何帮助将不胜感激!
答案1
我喜欢保持简单,只要它不影响性能或功能。您可以添加侦听器来检测新文件何时添加并自动重命名,但这是一个复杂的问题,我现在不太想学习,更不用说解释了,哈哈。
因此,我会采用简单的循环-if-then 方法。
首先,您需要循环遍历这些文件夹:
Get-ChildItem "E:\Backup\ABLBackup" |
Where PSIsContainer |
Foreach-Object {}
接下来,据我了解,您需要检查是否有新文件(基本上是不包含日期的文件)
if (Get-ChildItem $_.FullName | Where Name -notlike "*_????_??_??.*") {}
将其与您的脚本放在一起,整理至适合的程度:
Get-ChildItem "E:\Backup\ABLBackup" |
Where PSIsContainer |
Foreach-Object {
$newitem = Get-ChildItem $_.FullName | Where Name -notlike "*_????_??_??.*"
if ($newitem)
{
$dateSuffix = get-date -Format 'yyyy_MM_dd'
$newFileName = '{0}_{1}{2}' -f $newitem.BaseName, $dateSuffix, $newitem.Extension
Rename-Item $newitem -NewName $newFileName
}
}
设置一个计划任务每半小时或类似时间运行一次,你就会笑。