Я думаю, то, что вы ищете, выглядит примерно так:
$sourceFolder = "C:\0\DG\a"
$folderToSearch = 'TheSpecificFolderName'
Get-ChildItem -Path $sourceFolder -Recurse -Directory | Where-Object {$_.Name -like "$folderToSearch*"} | ForEach-Object {
$folder = $_.FullName
foreach($file in (Get-ChildItem -Path $folder -File)) {
$NewName = '{0}-{1}{2}' -f $file.BaseName, $file.Directory.Name, $file.Extension
$target = Join-Path -Path $folder -ChildPath $NewName
if (!(Test-Path -Path $target -PathType Leaf)) {
$file | Rename-Item -NewName $NewName -WhatIf
}
else {
Write-Warning "Could not rename '$($file.Name)' as '$NewName' already exists!"
}
}
}
Если «указанное имя каталога», которое, как вы говорите, , может быть много папок через каталог - это массив имен папок, измените его на:
$sourceFolder = "C:\0\DG\a"
$foldersToSearch = 'FirstSpecificFolderName', 'SecondSpecificFolderName', 'ThirdSpecificFolderName'
# create a regex string where the foldernames to look for are combined with regex OR (`|`)
# use [regex]::Escape() to escape any characters that have special meaning in regex.
# the "^" anchors the match at the beginning of the string.
$findThese = '^({0})' -f (($foldersToSearch | ForEach-Object { [regex]::Escape($_) }) -join '|')
Get-ChildItem -Path $sourceFolder -Recurse -Directory | Where-Object {$_.Name -match $findThese} | ForEach-Object {
$folder = $_.FullName
foreach($file in (Get-ChildItem -Path $folder -File)) {
$NewName = '{0}-{1}{2}' -f $file.BaseName, $file.Directory.Name, $file.Extension
$target = Join-Path -Path $folder -ChildPath $NewName
if (!(Test-Path -Path $target -PathType Leaf)) {
$file | Rename-Item -NewName $NewName -WhatIf
}
else {
Write-Warning "Could not rename '$($file.Name)' as '$NewName' already exists!"
}
}
}
В целях тестирования я добавил переключатель -WhatIf
в командлет Rename-Item
. Это не будет фактически переименовывать какие-либо файлы, но покажет вам в консоли, что БУДЕТ переименовано . Если вас это устраивает, удалите переключатель -WhatIf
.