【问题标题】:Add folder prefix from LastWriteTime of content files从内容文件的 LastWriteTime 添加文件夹前缀
【发布时间】:2016-08-29 23:06:21
【问题描述】:

我有一个包含大约 42 000 个 .jpg 和视频文件的文件夹,这些文件在不同的子文件夹中按年/月排序。结构如下:

├─2015 │ ├─01 - 一月 │ │ ├─假期 │ │ └─骑车 │ └─02 - 二月 │ ├─滑雪 │ └─等 └─2016 └─01 - 一月

我现在想向所有子文件夹(例如假期)添加包含 .jpg 文件的 lastwritetime 的前缀。为了更清楚的解释:

文件假期的最后写入时间为 2015-01-01 然后将“holiday”文件夹重命名为“2015-01-01 - holiday”。

我已经用谷歌搜索/搜索/甚至尝试调整我找到的一些代码 sn-ps,但没有任何成功。有人可以帮我吗?

编辑:

抱歉,我的评论中有不可读的代码。再来一次:

$dir = Get-Childitem 'C:\temp\2011' -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

$file = Get-Childitem -Path $dir -filter '*.jpg' 

Rename-Item -Path $dir.FullName -NewName ('{0:yyyy-MM-dd} {1}' -f $file.LastWriteTime, $dir.Name) 

提前非常感谢。

【问题讨论】:

    标签: file powershell directory rename


    【解决方案1】:

    我认为所有 Ansgar 的答案都缺少一个 for-each 循环,因此您可以重命名所有目录。另外,如果每个目录有多个文件,则需要决定应该使用哪个文件的最后写入时间(我在下面使用最新的)

    $dir = get-item 'C:\temp\2011' -Recurse | ?{ $_.PSIsContainer } 
    $dir |  % {  $file = Get-ChildItem -Path $_.FullName | Sort LastWriteTime -desc | select -first 1; 
    Rename-Item -Path $_.FullName -NewName ('{0:yyyy-MM-dd} {1}' -f $file.LastWriteTime, $_.Name) }
    

    【讨论】:

      【解决方案2】:

      为文件夹加上最后写入日期的前缀相当简单。基本上是这样的:

      Get-Item 'C:\some\folder' |
        Rename-Item -NewName { '{0:yyyy-MM-dd} {1}' -f $_.LastWriteTime, $_.Name }
      

      Rename-Item 从管道读取要重命名的对象,传递给-NewName 参数的脚本块根据对象的名称和上次写入时间构造新名称(有关格式运算符的更多信息,请参阅here)。

      将文件夹重命名为文件的最后写入时间的方法类似:

      $dir  = Get-Item 'C:\some\folder'
      $file = Get-Item 'C:\path\to\your.jpg'
      Rename-Item -Path $dir.FullName -NewName ('{0:yyyy-MM-dd} {1}' -f $file.LastWriteTime, $dir.Name)
      

      编辑:更新后的代码为您提供一份目录列表和一份文件列表。这不会为你想要的工作。你需要获取目录列表,然后获取每个目录的文件列表:

      Get-Childitem 'C:\temp\2011' -Recurse | Where-Object {
        $_.PSIsContainer
      } | ForEach-Object {
        $dir = $_
        $files_in_dir = Get-ChildItem -Path $dir.FullName -Filter '*.jpg'
      }
      

      从该列表中确定要重命名文件夹的文件,然后重命名文件夹:

      ... | ForEach-Object {
        ...
        $file = $files_in_dir | ...
        Rename-Item -Path $dir.FullName -NewName (...)
      }
      

      【讨论】:

      • 再次感谢您快速响应Angsar。我试了一下,我收到以下错误(它是德语,但也许你可以解释错误?): PS J:\> C:\temp\1\Unbenannt2.ps1 Rename-Item : Der Parameter "NewName" kann nicht ausgewertet werden, da dessen Argument als Skriptblock angegeben wurde und keine Eingabe vorhanden ist。 Ein Skriptblock kann nicht ohne Eingabe ausgewertet werden.
      • Bei C:\temp\1\Unbenannt2.ps1:3 Zeichen:41 + Rename-Item -Path $dir.FullName -NewName
      • 我的错。它必须是第二个示例中的子表达式(括号),而不是脚本块(大括号)。
      • 我想扔掉整个文件夹结构,自动重命名所有文件(无需编辑文件和文件夹路径)。你知道我的“思维错误”在哪里吗?我错过了什么。
      猜你喜欢
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      相关资源
      最近更新 更多