有许多主题具有相同的标题,但尝试/修补它们以满足我的需要迄今为止都没有成功。
这接近我想要实现的目标,但排除不起作用,它重命名所有子文件夹中的PDF文件而不是唯一剩余的文件夹“文件夹3”。在这里,我尝试了其他主题的解决方案,到目前为止,这些主题对我来说都没有用。
[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:\test\2704814
\Folder 1
|- file1.pdf
|- file2.pdf
\Folder 2
|- file1.pdf
|- file2.pdf
\Folder 3
|- file1.pdf
|- file2.pdf
C:\test\2704815
\Folder 1
|- file1.pdf
|- file2.pdf
\Folder 2
|- file1.pdf
|- file2.pdf
\Folder 3
|- file1.pdf
|- file2.pdf
等
要得到这个:
C:\test\2704814\Folder 3\2704814-file1.pdf
和
C:\test\2704814\Folder 3\2704814-file2.pdf
等
答案 0 :(得分:2)
EDIT为firstlevel子文件夹插入另一个$ ExcludeL1
最安全的方法是一步一步地做到这一点:
$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
。
我的ramdrive上的示例重新打印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