Удаление определенного слова в имени файла

Я хочу убрать слово «.pdf» в имени файла. Это не расширение файла, как я ранее называл его «.pdf». Как мне удалить его со всех файлов? Мои файлы находятся во многих папках в основной папке.

C: \ MainFolder \ Folder1 \ document.pdf

C: \ MainFolder \ Folder2 \ документ

C: \ MainFolder \ Folder3 \ document.pdf

Get-ChildItem | Rename-Item -NewName { $_.BaseName.Replace(“.pdf”,””) + $_.Extension }

Я пробовал использовать это, но он удаляет только в самой папке. Мне нужно сделать это для всех папок


person Kimber Ker    schedule 23.10.2019    source источник
comment
Я не видел вашего фрагмента кода, структуры папок и имен файлов примеров. Пожалуйста, отредактируйте вопрос и поделитесь тем же. Также, исходя из своего предположения, я даю ответ.   -  person Ranadip Dutta    schedule 23.10.2019
comment
Пожалуйста, не удаляйте и не публикуйте один и тот же вопрос повторно. Отредактируйте и улучшите свой существующий вопрос, чтобы не потерять все разъяснения, уже обсужденные в комментариях.   -  person Filburt    schedule 23.10.2019
comment
Просто добавьте параметр -Recurse в Get-ChildItem для сканирования всех вложенных папок.   -  person Filburt    schedule 23.10.2019
comment
Позвольте мне дать вам стандартный совет для новичков: если ответ решает вашу проблему, примите его, щелкнув большую галочку (✓) рядом с ним и, при желании, проголосуйте за него (для голосования требуется не менее 15 очков репутации ). Если вы нашли другие ответы полезными, проголосуйте за них. Принятие (за которое вы получите 2 очка репутации) и голосование поможет будущим читателям. Дополнительную информацию см. В этой статье. Если на ваш вопрос еще нет полного ответа, оставьте отзыв или ответьте самостоятельно.   -  person mklement0    schedule 24.10.2019


Ответы (3)


Это должно помочь:

    $files = Get-ChildItem 'C:\mypath' -Recurse

    foreach( $file in $files ) {

    if( !$file.PSIsContainer ) {

        $extension = $file.Extension
        $newname   = $file.BaseName.Replace('.pdf', '' ) + $extension
        Rename-Item -Path $file.FullName -NewName $newname | Out-Null
    }

}
person f6a4    schedule 23.10.2019
comment
Здесь вам не нужен цикл foreach. Rename-item может технически переименовать все одним выстрелом. - person Ranadip Dutta; 23.10.2019
comment
Это не работает. В файле все еще есть слово «.pdf». - person Kimber Ker; 23.10.2019
comment
Я тестировал это здесь. test.pdf.txt становится test.txt. Это то, что вы хотите? - person f6a4; 23.10.2019
comment
Он теряет протяженность. Это был файл PDF - person Kimber Ker; 23.10.2019
comment
Не здесь. test.pdf остается test.pdf. Какое имя у вашего файла? - person f6a4; 23.10.2019
comment
Img038374.pdf - это имя файла - person Kimber Ker; 23.10.2019
comment
Когда я запускаю свой скрипт, Img038374.pdf остается Img038374.pdf. Какое должно быть ожидаемое имя? - person f6a4; 23.10.2019
comment
Это должно быть Img038374, так как у меня есть расширение для известных файлов. - person Kimber Ker; 23.10.2019
comment
Ах, вы хотите удалить .pdf из ВСЕХ файлов. Я соответствующим образом обновил свой сценарий, попробуйте это. - person f6a4; 23.10.2019
comment
Он также полностью удаляет расширение. Я не могу открыть файл. Прошу прощения за недоразумение. Имя файла - «image123.pdf». У меня есть расширение для известных файлов. Если я сниму флажок, это будет «image123.pdf.pdf». Я хотел бы изменить имя на «image123», отметив расширение скрытия в параметрах папки. - person Kimber Ker; 23.10.2019
comment
Ах, мы подходим ближе. :) Взгляните на мой обновленный скрипт, он должен сработать. - person f6a4; 23.10.2019
comment
У меня все заработало! Большое тебе спасибо!! Если я хочу удалить определенное слово для своих папок. Что я должен делать? - person Kimber Ker; 23.10.2019
comment
Создайте новый вопрос и приведите пример, пожалуйста. - person f6a4; 23.10.2019

Замените свой фрагмент кода следующим:

#Finds all files with the string “pdf” anywhere in the name recursively and will replace with nothing(which will remove basically).
Get-ChildItem -Path C:\your\root\folder\path -Filter "*pdf*" -Recurse  | Rename-Item -NewName {$_.Name -replace "pdf",''}

Надеюсь, это поможет.

person Ranadip Dutta    schedule 23.10.2019
comment
Это также удалит расширение из файлов PDF. - person f6a4; 23.10.2019
comment
Так что выберите расширение и после удаления добавьте его обратно. :) - person Ranadip Dutta; 23.10.2019
comment
Или измените оператор замены на -replace '.pdf.pdf' to '.pdf' - person PaulG; 23.10.2019
comment
@PaulG: Если это не pdf, это может вызвать проблему. Но если это только pdf, то да, у нас это хорошо получается. - person Ranadip Dutta; 23.10.2019

Как указывает Filburt в комментарии к вопросу, в вашей команде не хватает только -Recurse переключателя < / strong> для обработки файлов во всем поддереве каталогов входного пути.

Кроме того, на всякий случай добавьте переключатель -File, чтобы ограничить обработку файлами (а не каталогами):

Get-ChildItem -Recurse -File |
  Rename-Item -NewName { $_.BaseName.Replace('.pdf', '') + $_.Extension } -WhatIf

-WhatIf common < / a> предварительный просмотр операции. Удалите его, как только убедитесь, что он будет делать то, что вы хотите.

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

Чтобы ускорить обработку, вы можете сделать Get-ChildItem предварительный выбор интересующих файлов с помощью
-Filter *.pdf?*

person mklement0    schedule 23.10.2019