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

Rename All files in a Folder and replace the name with the creationTime Using PowerShell

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

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

但是没用。有任何想法吗?谢谢

我注意到多个问题。最重要的是您的新名称值为 { $_.Name -Replace "$_.Name$_.CreationTim" }-replace 的语法是 -replace 'PatternToReplace', 'NewValue'。如果只定义了模式,如-replace 'PatternToReplace',那么匹配的文本将被删除。

假设文件名当前为 "File1.txt"。这永远不会匹配您的 $_.Name$_.CreationTime-pattern,例如。 "File1.txt23.01.2015 23.15.59",因此它永远不会 replace/modify 名称,结果将是您的文件被重命名为它们当前的名称。

还有:

  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-properties

我认为这就是您要查找的内容:

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