Powershell добавляет имя папки в качестве суффикса к файлам рекурсивно, только если имя папки соответствует строке - PullRequest
0 голосов
/ 18 июня 2020

Как я могу изменить этот скрипт для выполнения следующих действий:

  1. Рекурсия по всему указанному каталогу
  2. Поиск папок с указанным именем (может быть много папок в каталоге )
  3. Для каждого файла внутри каждой папки добавьте имя папки в виде суффикса

Это то, что мне удалось найти / попробовать; однако этот код добавляет суффикс ко всем найденным файлам, независимо от того, в какой папке они находятся.

Get-ChildItem -Path "C:\0\DG\a/" -Include *.* -Recurse | Where {$_.Name -notlike "$($_.Directory.Name)*"} | ForEach-Object {
    $NewName = $_.Basename + '-' + $_.Directory.Name + $_.Extension
    If (!(Test-Path "$($_.DirectoryName)\$NewName" -PathType Leaf)) {Rename-Item -Path "$($_.FullName)" -NewName $NewName}
    Else {Write-Warning "Could not rename '$($_.Name)' as '$($_.DirectoryName)\$NewName' already exists!"}
}

Спасибо

1 Ответ

0 голосов
/ 19 июня 2020

Я думаю, то, что вы ищете, выглядит примерно так:

$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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...