重命名文件夹中的所有文件,并使用PowerShell将名称替换为creationTime

时间:2015-01-31 22:55:17

标签: powershell rename

我想编写一个函数,用当前名称后跟creatiomTime替换每个文件的名称。 这是我的功能:

Function RenameFolderFiles{
Param([String]$path)
Get-Childitem $path -Recurse | Rename-Item -NewName { $_.Name -Replace "$_.Name$_.CreationTim" }
}

但它不起作用。有任何想法吗?谢谢

1 个答案:

答案 0 :(得分:0)

我发现了多个问题。最重要的是您的newname-value为{ $_.Name -Replace "$_.Name$_.CreationTim" }-replace的语法是-replace 'PatternToReplace', 'NewValue'。如果仅定义了模式,例如-replace 'PatternToReplace',则匹配的文本将被删除。

让我们说文件名目前是" File1.txt"。这永远不会与您的$_.Name$_.CreationTime模式匹配,例如。 " File1.txt23.01.2015 23.15.59",所以它永远不会替换/修改名称,结果就是你的文件被重命名为他们当前的名字。

此外:

  1. CreationTim缺少e
  2. "$_.Name$_.CreationTim"中,您正在访问媒体资源。要在字符串中包含属性的值,您需要使用$()之类的子展开"$($_.Name)$($_.CreationTime)"或格式运算符,例如"{0}{1}" -f $_.Name, $_.CreationTime
  3. 您使用-Recurse,这意味着您需要子文件夹。文件夹也将被重命名,以后当文件的路径不再存在(父文件夹被重命名)时可能会导致错误。
  4. Name - 属性包含扩展名,因此如果您使用了-replace命令,那么" File1.txt"将成为" File1.txt23.01.2015 23.15.59"。没有扩展名的文件。要单独获取文件名和扩展名,请使用BaseName - 和Extension - 属性
  5. 我认为您正在寻找的是:

    Function RenameFolderFiles{
        Param([String]$path)
    
        Get-Childitem $path -Recurse |
        #Get files only
        Where-Object { !$_.PSIsContainer } |
        Rename-Item -NewName { "{0}{1}{2}" -f $_.BaseName, $_.CreationTime.ToString('ddMMyyyy-hhmmss'), $_.Extension }
    }
    

    演示:

    #Files before
    Get-ChildItem -Recurse "C:\Users\Frode\Desktop" | Where-Object { !$_.PSIsContainer } | Select-Object -ExpandProperty FullName
    C:\Users\Frode\Desktop\New Text Document - Copy (2).txt
    C:\Users\Frode\Desktop\New Text Document - Copy.txt
    C:\Users\Frode\Desktop\New Text Document.txt
    C:\Users\Frode\Desktop\test\asd - Copy.txt
    C:\Users\Frode\Desktop\test\asd.txt
    
    #Create and run function
    Function RenameFolderFiles{
        Param([String]$path)
    
        Get-Childitem $path -Recurse |
        #Get files only
        Where-Object { !$_.PSIsContainer } |
        Rename-Item -NewName { "{0}{1}{2}" -f $_.BaseName, $_.CreationTime.ToString('ddMMyyyy-hhmmss'), $_.Extension }
    }
    
    RenameFolderFiles -path "C:\Users\Frode\Desktop"
    
    #Files after
    Get-ChildItem -Recurse "C:\Users\Frode\Desktop" | Where-Object { !$_.PSIsContainer } | Select-Object -ExpandProperty FullName
    C:\Users\Frode\Desktop\New Text Document - Copy (2)01022015-122544.txt
    C:\Users\Frode\Desktop\New Text Document - Copy01022015-122543.txt
    C:\Users\Frode\Desktop\New Text Document01022015-121535.txt
    C:\Users\Frode\Desktop\test\asd - Copy01022015-122532.txt
    C:\Users\Frode\Desktop\test\asd01022015-122531.txt