Переименование файлов в несколько итераций - PullRequest
1 голос
/ 29 марта 2019

У меня есть папка с различным количеством файлов одинаковой формы, которые я загружаю партиями с общего сайта.

Загруженные файлы имеют автоматическое именование с похожим шаблоном, однако это не конечный шаблон, который мне требуется для моего сервера. Приведенный ниже код выполняет свою работу, но он кажется неуклюжим, и моя интуиция говорит, что есть лучший способ написать несколько замен для имени файла. Пожалуйста, помогите мне перекодировать это.

Я перепробовал несколько конвейеров, и, похоже, проблема заключается в том, что после переименования файлов с первой итерации все мои ссылки после этого не сохраняются. Следовательно, после замены мне нужно создать новую переменную для этой новой итерации.

$pathToRFIs = 'C:\Users\user\Downloads\*.pdf'
$path2ToRFIs = 'C:\Users\user\Downloads'

$text = [System.Threading.Thread]::CurrentThread.CurrentCulture.TextInfo


$lowerRFIs = gci -path $pathToRFIs -filter *rfi*
$lowerRFIs | ren -newname {"$($text.ToTitleCase($_.BaseName))$($_.Extension)"}

$properRFIs = gci -path $pathToRFIs -filter *rfi*
$properRFIs | ren -newname {$_.name -replace '___',' & '}

$andRFIs = gci -path $pathToRFIs -filter *rfi*
$andRFIs | ren -newname {$_.name -replace '_',' '}

$spaceRFIs = gci -path $pathToRFIs -filter *rfi*
$spaceRFIs | ren -newname {$_.name -replace 'Encinitas Beach Resort-Rfi ','RFI 00'}

$RFIs = gci -path $pathToRFIs  -filter *RFI*
$RFIs | ren -newname {$_.name -replace '^(.*?)-', '$1_'}

$RFIs_ = gci -path $pathToRFIs -filter *RFI*
$RFIs_ | ren -newname {$_.name.substring(0,$_.name.length-17)}

$finalRFIs = gci -path $path2ToRFIs *"RFI 0"*
$finalRFIs | ren -newname {$_.fullname + ".pdf"}

Для справки файл, который я получаю, будет выглядеть так:

"encinitas beach resort-rfi 31-public water closets-201903221442.pdf"

Желаемое имя конечного результата будет:

"RFI 0031_Public Water Closets.pdf"

Ответы [ 3 ]

0 голосов
/ 29 марта 2019

Ответ: да. Обратите внимание, что это просто преобразование работы, которую вы уже сделали. Используя один вызов Rename-Item и foreach вместо ForEach-Object, он также будет значительно быстрее.

$text = [System.Threading.Thread]::CurrentThread.CurrentCulture.TextInfo
foreach ($file in Get-ChildItem -Path $Env:USERPROFILE\Downloads\*.pdf -Filter *rfi*) {
    $rename = $text.ToTitleCase($file.BaseName) + $file.Extension
    $rename = $rename -replace '_{3}', ' & ' -replace '_', ' ' -replace 'Encinitas Beach Resort-Rfi ', 'RFI 00'
    $rename = $rename -replace '^(.*?)-', '$1_'
    $rename = $rename.Substring(0, $rename.Length - 17) + '.pdf'
    $file | Rename-Item -NewName $rename
}

одно регулярное выражение, чтобы управлять всеми без минуса:

$n -replace '.*?-rfi (\d+)-(.*?)-.*', 'RFI $1_$2.pdf'
0 голосов
/ 29 марта 2019
  • Никаких промежуточных переменных не требуется
  • и ForEach-Object
  • все преобразователи могут быть связаны друг с другом, здесь в отдельных строках с обратным тиком
  • и завершающий -Whatif, чтобы показать только то, что произошло, если ..

## Q:\Test\2019\03\29\SO_55424102.ps1
$pathToRFIs = 'C:\Users\user\Downloads\*.pdf'

$text = [System.Threading.Thread]::CurrentThread.CurrentCulture.TextInfo

Get-ChildItem -Path $pathToRFIs -Filter *rfi* |
    Rename-Item -NewName {($text.ToTitleCase($_.BaseName) `
       -replace '___',' & ' `
       -replace '_',' ' `
       -replace 'Encinitas Beach Resort-Rfi ','RFI 00' `
       -replace '(?<=^[^-]*)-', '_' `
       -replace '-\d{12}$')+$_.Extension} -WhatIf

Пример вывода (немецкий язык):

WhatIf: Ausführen des Vorgangs "Datei umbenennen" für das 
Ziel "Element: Q:\Test\2019\03\29\encinitas beach resort-rfi 31-public water closets-201903221442.pdf 
         Ziel: Q:\Test\2019\03\29\RFI 0031_Public Water Closets.pdf".

Если вывод выглядитОК, удалите -WhatIf

0 голосов
/ 29 марта 2019

Используя ForEach-Object в качестве Lee_Daily , вы можете использовать регулярное выражение -match для захвата частей имени файла, которые вы хотите.(номер и тема).

Затем внутри цикла выполните такие действия по переименованию:

$pathToRFIs = 'C:\Users\user\Downloads'

Get-ChildItem -Path $pathToRFIs -Filter '*rfi*' -File | ForEach-Object {
    if ($_.BaseName -match '.*rfi\s+(?<number>\d+)-(?<subject>.*)\s*-\d+$') {
        $subject = (Get-Culture).TextInfo.ToTitleCase($matches['subject']) -replace '___',' & ' -replace '_', ' '
        $newName = 'RFI {0:D4}_{1}{2}' -f ([int]$matches['number']), $subject, $_.Extension

        $_ | Rename-Item -NewName $newName -WhatIf
    }
}

Снимите переключатель -WhatIf, если вы довольны результатами.

Используя это, файл типа encinitas beach resort-rfi 31-public water closets-201903221442.pdf станет
RFI 0031_Public Water Closets.pdf.

Детали регулярного выражения:

.              # Match any single character that is not a line break character
   *           # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
rfi            # Match the characters “rfi” literally
\s             # Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
   +           # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
(?<number>     # Match the regular expression below and capture its match into backreference with name “number”
   \d          # Match a single digit 0..9
      +        # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
-              # Match the character “-” literally
(?<subject>    # Match the regular expression below and capture its match into backreference with name “subject”
   .           # Match any single character that is not a line break character
      *        # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
)
\s             # Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
   *           # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
-              # Match the character “-” literally
\d             # Match a single digit 0..9
   +           # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
$              # Assert position at the end of the string (or before the line break at the end of the string, if any)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...