2015-01-31 30 views
0

我想编写一个函数,它替换当前的名称,后面加上creatiomTime每个文件的名称替换名称。 这是我的功能:重命名所有文件在一个文件夹,并与创建时间使用PowerShell

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

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

+0

CreationTim或CreationTime - 错字? – JohnLBevan 2015-01-31 23:34:39

回答

0

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

比方说,一个文件名是当前“FILE1.TXT”。这永远不会匹配你的$_.Name$_.CreationTime -pattern,ex。 “File1.txt23.01.2015 23.15.59”,所以它永远不会替换/修改名称,结果将是您的文件被重命名为它们的当前名称。

另外:

  1. CreationTim缺少的e
  2. "$_.Name$_.CreationTim",你所访问的性能。要在字符串中包含属性的值,需要使用$()(如"$($_.Name)$($_.CreationTime)")或格式运算符(如"{0}{1}" -f $_.Name, $_.CreationTime
  3. )您使用-Recurse,这意味着您期望子文件夹。文件夹也将被重新命名,当文件的路径不再存在时(父文件夹被重命名),稍后可能会导致错误。
  4. Name -property包含扩展名,所以如果您已经使用了-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 
+0

谢谢你的aanswer,事实上,当我执行它时,我得到这个错误: 'Rename-Item:Impossible de renommer la ciblespécifiée,car ellereprésenteun chemin d'accèsou un nom d'appareil。 金caractère利涅:5:5 +重命名,项目-NewName { “{0} {1} {2}” -f $ _基础名称,$ _创建时间,$ _讯号分配延长... + ~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidArgument:(:) [重命名-项目],PSArgumentException + FullyQualifiedErrorId:参数, Microsoft.PowerShell.Commands.RenameItemCommand ' – Somar 2015-02-01 00:27:40

+0

该脚本。你得到的错误是因为新文件名被作为完整路径进行了处理。你的文件名是否包含任何特殊字符?如果没有,那么我猜你的区域设置正在返回'CreationTime',如'01 \ 02 \ 2015 ...'。您需要指定日期时间的格式。你没有指定一个,所以我使用默认格式作为我的区域设置。尝试更新的答案。 – 2015-02-01 11:24:32

+0

是的你是对的,因为当我执行这个命令'Get-ChildItem |选择对象创建时间我得到'mm/dd/yyyy'格式。我试图修复它... – Somar 2015-02-01 11:42:19

相关问题