如何在Powershell中的多个文件夹中递归更改名称

时间:2019-07-25 13:11:16

标签: powershell

我正在尝试递归重命名包含一堆文件夹的文件夹中的文件。

为了更好地说明这一点,我有一个带有10个子文件夹的父文件夹,这10个子文件夹中的每一个都有17个声音文件。

我需要重命名17个声音文件1,2,3 ... 17

我设法提供了以下代码(目前,它写文件名而不是实际更改文件名)

$files = gci -Path "D:\PARENT_FOLDER" -Recurse
$i = 1
foreach ($file  in $files) {

$newName = 0
1..$i | % {$newName = $newName+1}
$i++
Write-Host "name is " $newName
}

但是我不知道如何使它重置文件夹之间的计数。 现在代码输出的名称从1到180 ...

有人可以帮我解决这个问题吗? 预先感谢

3 个答案:

答案 0 :(得分:1)

好吧,经过一天的工作,我回到家,从头开始解决这个问题,并提出了一个更简单的解决方案: 我只是嵌套“ foreach”,一个在另一个内部循环,以循环遍历父文件夹内的所有文件夹以及每个文件夹内的所有文件。

如果有人对此感兴趣,请输入代码:

$path = "MASTER FOLDER PATH"

$list = Get-ChildItem -Path $path -Directory

foreach ($folder in $list)
{
Write-Host "working on Directory" $folder.FullName -ForegroundColor Green

        foreach ($files in $folder)
        {$files = Get-ChildItem -Path $path\$folder
                $i=1
                foreach ($file in $files) {


                $newName = 0
                1..$i | % {$newName = $newName+1}
                $i++

                Write-Host "Changing file " $file.FullName -NoNewline -ForegroundColor Yellow
                Write-Host " ..." -ForegroundColor Yellow
                Rename-Item -Path $file.FullName -NewName $newName


                }
        }
} 

感谢您的帮助。 :)

答案 1 :(得分:0)

我建议暂时不要使用-Recurse部分,而要手动执行递归操作(又称为循环)。

$list = Get-ChildItem -Path $path -Name -Directory

for ($i=0;$i -le $list.Length-1;$i++) {
$list[$i] = $path + '\' + $list[$i]
}

现在您有了一系列的文件夹,现在可以分别对其进行访问了。

$path = "(path)" 
$list = Get-ChildItem -Path $path -Name -Directory

for ($i=0;$i -le $list.Length-1;$i++) {
$list[$i] = $path + '\' + $list[$i]
$temp = Get-ChildItem -Path $list[$i] -Name

for ($h=0;$h -le $temp.Length-1;$h++) {
$temp[$h] = $list[$i] + $temp[$h]
Rename-Item -LiteralPath $temp[$h] -NewName $h
}}

这就是我想出的,希望对您有所帮助。

答案 2 :(得分:0)

这是另一种方式。我看不到如何递归和重置每个文件夹的编号。这样,我一次只做一个文件夹。具有两个脚本块的Foreach会将第一个脚本块视为“开始”脚本块。

foreach($dir in get-childitem parent) {
  get-childitem parent\$dir | foreach {$i = 1} { rename-item $_.fullname $i -whatif; $i++ }
}

What if: Performing the operation "Rename File" on target "Item: C:\users\js\parent\foo\a Destination: C:\users\js\parent\foo\1".
What if: Performing the operation "Rename File" on target "Item: C:\users\js\parent\foo\b Destination: C:\users\js\parent\foo\2".
What if: Performing the operation "Rename File" on target "Item: C:\users\js\parent\foo\c Destination: C:\users\js\parent\foo\3".
What if: Performing the operation "Rename File" on target "Item: C:\users\js\parent\foo2\a Destination: C:\users\js\parent\foo2\1".
What if: Performing the operation "Rename File" on target "Item: C:\users\js\parent\foo2\b Destination: C:\users\js\parent\foo2\2".
What if: Performing the operation "Rename File" on target "Item: C:\users\js\parent\foo2\c Destination: C:\users\js\parent\foo2\3".