Пакет: Видаліть розширення файлу


155

У мене є такий пакетний сценарій з Вікіпедії:

@echo off
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%f
)
pause

У циклі for-loop лунають усі файли з розширенням flv, але я хочу зробити деякі дії з файлом (ими), де мені потрібно один раз файл без розширення та один раз з розширенням. Як я міг отримати цих двох?

Я шукав рішення, але не знаходжу його. Я справжній новачок у партії ...

Відповіді:


309

Ви можете використовувати %%~nfім'я файлу лише як описано в посиланні на for:

@echo off
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%~nf
)
pause

Доступні наступні варіанти:

Змінна з модифікатором Опис

% ~ I ​​Розширює% I, що видаляє будь-яке оточення 
                        Лапки ("").
% ~ fI Розширює% I на повністю кваліфіковану назву шляху.
% ~ dI Розширює% I лише на букву диска.
% ~ pI Розширює% I лише на шлях.
% ~ nI Розширює% I лише на ім'я файлу.
% ~ xI Розширює% I лише на розширення файлу.
% ~ sI Розширює шлях, щоб містити лише короткі імена.
% ~ aI Розширює% I на атрибути файлу файлу.
% ~ tI Розширює% I на дату і час файлу.
% ~ zI Розширює% I на розмір файлу.
% ~ $ PATH: Я шукає каталоги, перелічені у середовищі PATH 
                        змінна і розширює% I на повністю кваліфіковане ім'я 
                        перший знайдений. Якщо назва змінної середовища є
                        не визначено або пошук не знайде файл,
                        цей модифікатор розширюється до порожнього рядка.    

8
Лише коротка примітка: у наведеному вище прикладі %% f буде щось подібне, C:\Users\Admin\Ordner\foo.flvі %% ~ nf дасть вам foo. Якщо ви хочете всього, крім розширення, використовуйте %% ~ df %% ~ pf %% ~ nf, яке дасть вамC:\Users\Admin\Ordner\foo
ehambright

8
@ehambright Пізній коментар, але, мабуть, використання %%~dpnfбуло б коротшою альтернативою.

Дякую за модифікатор / таблицю описів Dirk. У моєму випадку було отримати ім'я файлу без розширення з парами %1в пакетному сценарії. echo %~n1було те, що я був після.
Дейв Пайл

26

У випадку, якщо файл, що містить вашу змінну, насправді не існує, FORпідхід не працюватиме. Один трюк, який ви можете використовувати, якщо знаєте довжину розширення, - це підрядка:

%var:~0,-4%

що -4означає , що останні 4 цифри (імовірно .ext будуть усічені).


Це не працює для мене (на Win8.1) - можливо, я неправильно розумію це при спробі echo %f:~0,-4%в контексті прикладу, який використовується у питанні. Що я роблю неправильно?
Вовк

2
Мабуть, це працює для "нормальних" змінних, а не для змінних (а може, я просто не знаю правильного синтаксису). У будь-якому випадку це буде працювати в контексті прикладів ОП: SET fl=%%fа потімecho %fl:~0,-4%
Охад Шнайдер

@Wolf вам потрібно встановити значення змінної циклу на звичайну змінну, після чого виконайте підстановку / усічення в нормальній змінній
phuclv

Більш ніж достатньо випадків довжина розширення не дорівнює 3 або невідома. Ви все ще можете використовувати для, навіть якщо файл не існує, дивіться мою відповідь.
марш


8

Це дійсно пізня відповідь, але я придумав це, щоб вирішити конкретну проблему, з якою у мене DiskInternals LinuxReader додає '.efs_ntfs' до файлів, які вони зберегли до каталогів, які не належать до NTFS (FAT32):

@echo off
REM %1 is the directory to recurse through and %2 is the file extension to remove
for /R "%1" %%f in (*.%2) do (
    REM Path (sans drive) is given by %%~pf ; drive is given by %%~df
    REM file name (sans ext) is given by %%~nf ; to 'rename' files, move them
    copy "%%~df%%~pf%%~nf.%2" "%%~df%%~pf%%~nf"
    echo "%%~df%%~pf%%~nf.%2" copied to "%%~df%%~pf%%~nf"
echo.
)
pause

Я не впевнений, що відповідає на поставлене запитання, але насправді це мені допомогло, дякую!
matan7890

1
@ matan7890 Правда; оп не вказує, що "Я хочу зробити деякі дії з файлом (ими)" [sic] тягне за собою, але одна з цих дій може бути перейменуванням їх, і в цьому випадку моя відповідь - це розширення прийнятої відповіді.
Agi Hammerthief

Це допомогло моєму другові, який відкрив вкладення та .encryptedдодав до всіх своїх файлів, а також вимогу про викуп. Очевидно, що скрипт, що атакує, повинен бути пакетним файлом, який є зворотним для цього і доданий .encryptedдо всіх файлів.
AwokeKnowing

1
прихильне тому, що ви згадуєте диск, шлях та розширення ( %% ~ df %% ~ pf %% ~ nf ), яке найбільш нагадує висновок %% f з початкового питання, а не просто ім'я файлу без розширення ( %% ~ nf )
ehambright

5

Я використовую це, якщо просто хочу зняти розширення зі змінної (не маючи циклів жодних каталогів чи наявних файлів):

for %%f in ("%filename%") do set filename=%%~nf

Якщо ви хочете зняти розширення з повного шляху, використовуйте %%dpnfзамість цього:

for %%f in ("%path%") do set path=%%~dpnf

Приклад:

(Використовуйте безпосередньо в консолі)

@for %f in ("file name.dat") do @echo %~nf
@for %f in ("C:\Dir\file.dat") do @echo %~dpnf

OUTPUT:

file name
C:\Dir\file

0

Використовуючи cygwin bash, щоб зробити рубання

  :: e.g. FILE=basename.mp4 => FILE_NO_EXT=basename
  set FILE=%1
  for /f "delims=" %%a in ('bash -c "FILE=%FILE%; echo ${FILE/.*/}" ') do set FILE_NO_EXT=%%a

0

Якщо ваша змінна є аргументом, ви можете просто використовувати %~dpnнаступний номер аргументу, тому вам не доведеться турбуватися про різну довжину розширення.

Наприклад %~dpn0, поверне шлях пакетного файлу без його розширення, %~dpn1буде %1без розширення і т.д.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.