我正在尝试编写一个 Powershell 脚本,该脚本将:
-从根目录递归搜索
-排除具有现有“yyyyMMdd”文件名前缀的文件
-根据特定的 LastWriteTime 使用“yyyyMMdd”文件名前缀重命名上述未排除的文件
注意:理想情况下,此脚本应包含所有文件类型扩展名
我自己也尝试过,但这似乎超出了我的能力范围,因为我的尝试进展不顺利。
提前致谢。
http://ss64.com/ps/syntax-stampme.html
#StampMe.ps1
param( [string] $fileName)
# Check the file exists
if (-not(Test-Path $fileName)) {break}
# Display the original name
"Original filename: $fileName"
$fileObj = get-item $fileName
# Get the date
$DateStamp = get-date -uformat "%Y-%m-%d@%H-%M-%S"
$extOnly = $fileObj.extension
if ($extOnly.length -eq 0) {
$nameOnly = $fileObj.Name
rename-item "$fileObj" "$nameOnly-$DateStamp"
}
else {
$nameOnly = $fileObj.Name.Replace( $fileObj.Extension,'')
rename-item "$fileName" "$nameOnly-$DateStamp$extOnly"
}
# Display the new name
"New filename: $nameOnly-$DateStamp$extOnly"
我希望改变这一行:
$DateStamp = get-date -uformat "%Y-%m-%d@%H-%M-%S"
改为 LastWriteTime 而不是 get-date,但我不知道如何实现这一点。
此代码(来自另一个超级用户问题):
Get-ChildItem "Test.pdf" | Rename-Item -newname {$_.LastWriteTime.toString("yyyyMMdd") + " Test.pdf"}
...成功重命名单个文件,但我似乎无法将其集成到更大的脚本中。
关于递归运行上述内容,我已经尝试过这个(也来自http://ss64.com/ps/syntax-stampme.html):
foreach ($file in get-ChildItem *.* -recurse) { ./StampMe.ps1 $file.name }
成功将 PS 脚本应用于根目录中的文件,但无法应用于从根目录传播的子文件夹树中的任何文件。
答案1
这个脚本应该能完全满足你的要求
- 从根目录递归搜索
- 排除具有现有“yyyyMMdd”文件名前缀的文件
- 根据特定的 LastWriteTime,使用“yyyyMMdd”文件名前缀重命名上述未排除的文件
警告:您应该先测试此脚本,因为重命名可能很危险。确认只有有意重命名的文件后,请删除#
前面的。Rename-Item
长版本
$folder = "C:\somefolder"
$files = get-childitem -path $folder -recurse | where { -not $_.PSIsContainer }
[datetime]$dirDate = New-Object DateTime
foreach ($file In $files) {
$strDate = $file.Name.substring(0,8)
if (-Not [DateTime]::TryParseExact($strDate, "yyyyMMdd",
[System.Globalization.CultureInfo]::InvariantCulture,
[System.Globalization.DateTimeStyles]::None, [ref]$dirDate)) {
$newName = $file.lastwritetime.tostring("yyyyMMdd ") + $file.name
echo $newName
#Rename-Item -path $file.Fullname -newname $newName
}
}
简洁版本
[datetime]$dirDate = New-Object DateTime
dir "C:\somefolder" -r | ? { ! $_.PSIsContainer } | % {
if ( ! [DateTime]::TryParseExact($_.Name.substring(0,8), "yyyyMMdd",
[System.Globalization.CultureInfo]::InvariantCulture,
[System.Globalization.DateTimeStyles]::None, [ref]$dirDate)) {
$newName = $_.lastwritetime.tostring("yyyyMMdd ") + $_.name
echo $newName
#Ren $_.Fullname $newName
}
}
使用 stackoverflow 答案
[DateTime]::TryParseExact
测试前 8 个字符是否可以为有效日期$_.lastwritetime.tostring("yyyyMMdd ")
格式化最后写入邮票
答案2
我尝试做类似的事情 - 例如根据上次写入时间重命名文件。以下是执行此操作的 powershell:
- 重命名当前目录下的任何/所有文件
- 保留文件扩展名
- 名称格式为 yyyy-MM-dd HH-mm-ss(24 小时)
ls | % { Rename-Item $_ -NewName ($_.LastWriteTime.ToString("yyyy-MM-dd HH-mm-ss") + ($_.extension)) }