【问题标题】:Windows power shell script to rename all files in each directory to parent's nameWindows power shell 脚本将每个目录中的所有文件重命名为父级名称
【发布时间】:2011-10-30 23:46:00
【问题描述】:

我正在学习 Windows PS - 但是直到我需要一些帮助来编写快速命令:

我有一个目录,每个目录都有一个唯一的名称。

我需要将每个目录中的所有文件重命名为它们的父名称!如下:

当前结构:

/pdfdirectory/pdf_title_directory/filename.pdf
/pdfdirectory/pdf_title_directory123/filename.pdf

shell脚本之后:

/pdfdirectory/pdf_title_directory/pdf_title_directory.pdf
/pdfdirectory/pdf_title_directory123/pdf_title_directory123.pdf

谢谢!

【问题讨论】:

    标签: windows shell powershell


    【解决方案1】:

    相信您正在学习 Powershell 并将尝试一些东西:

    gci .\test -recurse | ?{ -not $_.PsIsContainer } | 
    %{rename-item -path $_.fullname -newname ($_.Directory.Name + $_.Extension)}
    

    当然,如果目录中有多个文件,上述方法会失败。

    要了解上述内容,请学习基本的 Powershell 命令,例如 gci(Get-ChildItem 的别名)和 Powershell 管道概念。

    【讨论】:

    • 谢谢!这让我继续前进——要学习很多很多东西,power-shell 也在列表中,但我真的很想运行它——我确实有多个文件——!但我想我可以修改它以使其继续......
    • @jordan.baucke - 多个文件是什么意思?重命名为目录名后,同一个目录下怎么会有多个文件同名?
    • 它只有一些其他文件,.PDF 文件是我需要重命名的唯一文件 - 其他的并不重要。
    • 解决方案工作得很好,考虑到其他文件并不重要,它重命名了子目录中的所有文件!
    【解决方案2】:

    值得注意的是,您可以将 Get-ChildItem 的输出直接通过管道传输到 Rename-Item,您不需要 foreach。此外,这是聪明的部分,-NewName 参数值可以是产生新名称的脚本块。此脚本块可以使用 $_ 来引用当前正在处理的文件对象。

    所以你可以这样做:

    dir -Recurse -Include filename.pdf | ren -NewName { "$($_.Directory.Name).pdf" }
    

    (我认为是 Keith Hill 让我意识到了这个技巧。)

    【讨论】:

    • @谢谢!我正在阅读:Don Jones 在一个月的午餐中学习 Windows PowerShell