2016-11-12 52 views
2

我有一系列的文件夹和子文件夹中,以这种方式构成:递归重命名文件在所有子文件夹按顺序

  • 001 /面料/蓝/(.jpg文件,顺序命名)
  • 001 /面料/绿/(.jpg文件,依次命名)
  • 002 /光纤/蓝/(.jpg文件,依次命名)
  • 002 /光纤/绿/(.jpg文件,依次命名)

文件名有多余的字符串我想删除,我想将它们的文件名转换为更简单的顺序格式(0.jpg,1.jpg等)。

我试着用几个不同的PowerShell例子来使这个工作。我有递归搜索功能工作,但是当尝试重命名ForEach-Object循环中的文件时,我收到有关InvalidOperationException的错误。此外,恐怕我的顺序编号并未针对重命名文件的每个文件夹进行“重置”。

$i = 0 
Get-ChildItem -Filter "*.jpg" -Recurse | ForEach-Object { 
    Rename-Item $_ -NewName ('$i.jpg' -f $i++) 
} 

于是,两个问题:

  1. 我怎样才能修复与Rename-Item错误?
  2. 如何确保我的变量重置为每个子文件夹脚本开始重命名文件?

回答

2

如果你采取两步办法,首先获取所有包含jpg的文件夹,然后遍历这个列表,但从1开始没有问题。但是我总是使用前导零来实现这样的重新编号。

$BaseFld = "Q:\Test\" 
$Ext = "*.jpg" 
$jpgFolders = gci $($BaseFld+$Ext) -Recurse | 
    Select -ExpandProperty Directory -Unique | 
    select -ExpandProperty Fullname | Sort 

ForEach ($Folder in $jpgFolders) { 
    Set-location $Folder 
    $i = 1 
    Get-ChildItem $Ext | %{Ren $_ -NewName ('{0:D4}.jpg' -f $i++) -whatif} 
} 

如果ouptut适合你,取出-whatif在倒数第二行

+0

哇,太神奇了!我不知道我可以用这种方式使用Powershell。 Re:重新编号中的前导零;有什么办法可以避免你的例子中的前导零?我如何才能将这些短代码转换为当前的$ i var编号? – connormw

+0

将'{0:D4}'更改为'{0}',您应该完成。 – LotPings

+0

你是一个绝对的救星。非常感谢! – connormw

0

其他方法

$rootdir="C:\temp" 
gci $rootdir -Recurse -Directory | %{$i=1; gci $_.FullName -Recurse -File -Filter "*.jpg" | %{Ren $_.FullName -NewName ('{0}.jpg' -f $i++)} } 
相关问题