使用 powershell 重命名具有文件夹名称和排除项的文件
Rename files with foldername and exclusions using powershell
有很多标题相同的主题,但是trying/mending它们都满足我的需要目前还没有成功。
这接近我想要实现的目标,但排除不起作用,它重命名所有子文件夹中的 PDF 文件,而不是唯一剩余的文件夹“文件夹 3”。同样在这里,我尝试了其他主题的解决方案,none 到目前为止对我有用。
[string[]]$Path = @('C:\test\')
[string[]]$Excludes = @('*folder 1*', '*Folder 2*')
Get-ChildItem $Path -Filter *.pdf -Recurse | ?{$_.DirectoryName -notlike $Excludes } | Rename-Item -NewName { $_.Directory.Parent.BaseName + '-' + $_.Name }
我想要实现的是使用第一个子文件夹的名称重命名子文件夹的子文件夹中的所有 PDF 文件,请参见下面的结构。
C:\test04814
\Folder 1
|- file1.pdf
|- file2.pdf
\Folder 2
|- file1.pdf
|- file2.pdf
\Folder 3
|- file1.pdf
|- file2.pdf
C:\test04815
\Folder 1
|- file1.pdf
|- file2.pdf
\Folder 2
|- file1.pdf
|- file2.pdf
\Folder 3
|- file1.pdf
|- file2.pdf
等等
得到这个:
C:\test04814\Folder 304814-file1.pdf
和
C:\test04814\Folder 304814-file2.pdf
等等
EDIT 为一级子文件夹插入了另一个 $ExcludeL1
最稳妥的方法是循序渐进:
- 遍历test的子文件夹,将名字存入一个var
- 迭代子文件夹并排除不需要的(-notin 要求排除是文字)
- 在其中迭代 pdf 并检查它们是否已经以存储的文件夹名称为前缀。
- 终于重命名了。
$Base = 'C:\test\'
$ExcludeL1 = @('folder 1', 'Folder 2')
$ExcludeL2 = @('Othername')
Get-ChildITem -Path $Base -Directory | Where {$_.Name -notin $ExcludeL1}|ForEach {
$PreFix = $_.Name
Get-ChildItem -Path $_.FullName -Directory |
Where-Object {$_.Name -notin $ExcludeL2 } |
ForEach-Object {
Get-ChildItem $_.FullName -Filter *.PDF |
Where-Object {$_.BaseName -notmatch $PreFix}|
Rename-Item -NewName { "$PreFix-$($_.Name)"} -WhatIf
}
}
如果您的输出看起来不错,请删除最后一行中的 -WhatIf
。
我的内存驱动器 A 上的示例结果:
> tree /F
A:.
└───test
├───2704814
│ ├───Folder 1
│ │ file1.pdf
│ │ file2.pdf
│ ├───Folder 2
│ │ file1.pdf
│ │ file2.pdf
│ └───Folder 3
│ 2704814-file1.pdf
│ 2704814-file2.pdf
└───2704815
├───Folder 1
│ file1.pdf
│ file2.pdf
├───Folder 2
│ file1.pdf
│ file2.pdf
└───Folder 3
2704815-file1.pdf
2704815-file2.pdf
有很多标题相同的主题,但是trying/mending它们都满足我的需要目前还没有成功。
这接近我想要实现的目标,但排除不起作用,它重命名所有子文件夹中的 PDF 文件,而不是唯一剩余的文件夹“文件夹 3”。同样在这里,我尝试了其他主题的解决方案,none 到目前为止对我有用。
[string[]]$Path = @('C:\test\')
[string[]]$Excludes = @('*folder 1*', '*Folder 2*')
Get-ChildItem $Path -Filter *.pdf -Recurse | ?{$_.DirectoryName -notlike $Excludes } | Rename-Item -NewName { $_.Directory.Parent.BaseName + '-' + $_.Name }
我想要实现的是使用第一个子文件夹的名称重命名子文件夹的子文件夹中的所有 PDF 文件,请参见下面的结构。
C:\test04814
\Folder 1
|- file1.pdf
|- file2.pdf
\Folder 2
|- file1.pdf
|- file2.pdf
\Folder 3
|- file1.pdf
|- file2.pdf
C:\test04815
\Folder 1
|- file1.pdf
|- file2.pdf
\Folder 2
|- file1.pdf
|- file2.pdf
\Folder 3
|- file1.pdf
|- file2.pdf
等等
得到这个:
C:\test04814\Folder 304814-file1.pdf
和
C:\test04814\Folder 304814-file2.pdf
等等
EDIT 为一级子文件夹插入了另一个 $ExcludeL1
最稳妥的方法是循序渐进:
- 遍历test的子文件夹,将名字存入一个var
- 迭代子文件夹并排除不需要的(-notin 要求排除是文字)
- 在其中迭代 pdf 并检查它们是否已经以存储的文件夹名称为前缀。
- 终于重命名了。
$Base = 'C:\test\'
$ExcludeL1 = @('folder 1', 'Folder 2')
$ExcludeL2 = @('Othername')
Get-ChildITem -Path $Base -Directory | Where {$_.Name -notin $ExcludeL1}|ForEach {
$PreFix = $_.Name
Get-ChildItem -Path $_.FullName -Directory |
Where-Object {$_.Name -notin $ExcludeL2 } |
ForEach-Object {
Get-ChildItem $_.FullName -Filter *.PDF |
Where-Object {$_.BaseName -notmatch $PreFix}|
Rename-Item -NewName { "$PreFix-$($_.Name)"} -WhatIf
}
}
如果您的输出看起来不错,请删除最后一行中的 -WhatIf
。
我的内存驱动器 A 上的示例结果:
> tree /F
A:.
└───test
├───2704814
│ ├───Folder 1
│ │ file1.pdf
│ │ file2.pdf
│ ├───Folder 2
│ │ file1.pdf
│ │ file2.pdf
│ └───Folder 3
│ 2704814-file1.pdf
│ 2704814-file2.pdf
└───2704815
├───Folder 1
│ file1.pdf
│ file2.pdf
├───Folder 2
│ file1.pdf
│ file2.pdf
└───Folder 3
2704815-file1.pdf
2704815-file2.pdf