为什么For循环多次循环递增的数字?

时间:2019-04-26 16:22:01

标签: powershell

好的,所以我试图创建一个只重命名目录中文件的脚本。

目录中有2个文件夹,每个文件夹中有多张图片。

我正在使用递归来遍历所有这些。

我的目标是使用递增的数字重命名每个文件,但这不起作用,而是脚本将使用名称数字(1,1,1,1,2,2,2,2,2,3来重命名文件,3,3,3,4,4,4,4等)

有人可以帮助解决此问题吗?任何回应表示赞赏。


有效方法:

如果我将脚本块中的内容替换为:

M[s][0] = 0

它将毫无问题地增加(1、2、3、4等)

这不起作用:

echo $i

我要使用的代码:

$targetPath | Rename-Item -NewName {$_.Directory.Name + '_' + $I}

2 个答案:

答案 0 :(得分:0)

您也需要在for循环中遍历文件,如下所示:

for($i = 0 ; $i -le $numberOfFiles ; $i++ ) {
   #use indexing to pick the nTh file from the list
  $targetPath[$i] | Rename-Item -NewName $i -WhatIf

}

请注意,由于PowerShell从零开始索引,因此我将$i的初始设置降低为零。

但是我不会在生产中这样做,许多人发现for循环的逻辑很难理解。最好直接遍历文件,然后用这种方式重命名,就像这样。

#Set initial value to zero
$i = 0

ForEach ($file in $targetPath){
    $newName = "$($file.BaseName)_$i$($file.Extension)"
    Rename-Item -Path $file -NewName $newName -WhatIf
    $i++
}

答案 1 :(得分:0)

要使文件重命名后仍然可用,

  • 保留扩展名和可能的公共前缀。
  • 由于Rename-Item接受管道输入,因此不需要foreach
  • 为便于排序,我建议为计数器添加前导零

$Counter = 0
Get-ChildItem -File -path C:\Users\Alban\Pictures\Joshua32GBBackUp -Recurse|
    Rename-Item -NewName {'File_{0:D3}{1}' -f $Script:Counter++,$_.Extension} -WhatIf

如果输出看起来正常,请删除结尾的-WhatIf