Powershell 使用 LastWriteTime 前缀重命名多个文件

Rya*_*yan 5 powershell

我正在尝试编写一个 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"
Run Code Online (Sandbox Code Playgroud)

我希望改变线路:

$DateStamp = get-date -uformat "%Y-%m-%d@%H-%M-%S"
Run Code Online (Sandbox Code Playgroud)

是 LastWriteTime 而不是 get-date,但我不知道如何实现这一点。

此代码(来自另一个超级用户问题):

Get-ChildItem "Test.pdf" | Rename-Item -newname {$_.LastWriteTime.toString("yyyyMMdd") + " Test.pdf"}
Run Code Online (Sandbox Code Playgroud)

...成功重命名单个文件,但我似乎无法将其集成到更大的脚本中。


关于递归运行上述内容,我已经尝试过(也来自http://ss64.com/ps/syntax-stampme.html):

foreach ($file in get-ChildItem *.* -recurse) { ./StampMe.ps1 $file.name }
Run Code Online (Sandbox Code Playgroud)

它成功地将 PS 脚本应用于根目录中的文件,但无法应用于从根目录传播的子文件夹树中的任何文件。

nix*_*xda 4

这个脚本应该完全符合你的要求

  • 从根目录开始递归搜索
  • 排除具有现有“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
    }   
}
Run Code Online (Sandbox Code Playgroud)

简洁版本

[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
    }
}
Run Code Online (Sandbox Code Playgroud)

使用的 stackoverflow 答案