Batch: Xóa phần mở rộng tập tin


155

Tôi có tập lệnh bó sau từ Wikipedia:

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

Trong vòng lặp for, tất cả các tệp có phần mở rộng flv đều được lặp lại, nhưng tôi muốn thực hiện một số hành động với (các) tệp mà tôi cần một lần tệp mà không có phần mở rộng và một lần với phần mở rộng. Làm thế nào tôi có thể có được hai?

Tôi đã tìm kiếm giải pháp nhưng tôi không tìm thấy. Tôi là một người mới thực sự trong đợt ...

Câu trả lời:


309

Bạn chỉ có thể sử dụng %%~nfđể lấy tên tệp như được mô tả trong tài liệu tham khảo cho for:

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

Lựa chọn tiếp theo đã khả thi:

Biến với mô tả sửa đổi

% ~ Tôi mở rộng% I, loại bỏ mọi xung quanh 
                        dấu ngoặc kép ("").
% ~ fI Mở rộng% I thành tên đường dẫn đủ điều kiện.
% ~ dI Chỉ mở rộng% I thành ký tự ổ đĩa.
% ~ pI Chỉ mở rộng% I tới một đường dẫn.
% ~ nI Chỉ mở rộng% I thành tên tệp.
% ~ xI Chỉ mở rộng% I thành phần mở rộng tệp.
% ~ sI Mở rộng đường dẫn chỉ chứa các tên ngắn.
% ~ aI Mở rộng% I cho các thuộc tính tệp của tệp.
% ~ tI Mở rộng% I đến ngày và giờ của tệp.
% ~ zI Mở rộng% I theo kích thước của tệp.
% ~ $ PATH: Tôi tìm kiếm các thư mục được liệt kê trong môi trường PATH 
                        biến và mở rộng% I thành tên đủ điều kiện của 
                        người đầu tiên tìm thấy. Nếu tên biến môi trường là
                        không được xác định hoặc tập tin không được tìm thấy
                        công cụ sửa đổi này mở rộng thành chuỗi rỗng.    

8
Chỉ cần một lưu ý nhanh: trong ví dụ trên, %% f sẽ giống như thế C:\Users\Admin\Ordner\foo.flv%% ~ nf sẽ cung cấp cho bạn foo. Nếu bạn muốn mọi thứ ngoại trừ tiện ích mở rộng, hãy sử dụng %% ~ df %% ~ pf %% ~ nf sẽ cung cấp cho bạnC:\Users\Admin\Ordner\foo
ehambright

8
@ehambright Nhận xét muộn, nhưng tôi đoán sử dụng %%~dpnfsẽ là một thay thế ngắn hơn.

Cảm ơn các sửa đổi / bảng mô tả Dirk. Trường hợp của tôi là lấy tên tệp mà không cần gia hạn từ param %1trong tập lệnh bó. echo %~n1là những gì tôi đã sau.
Dave Pile

26

Trong trường hợp tệp giữ biến của bạn không thực sự tồn tại, FORcách tiếp cận sẽ không hoạt động. Một mẹo bạn có thể sử dụng, nếu bạn biết độ dài của tiện ích mở rộng, là lấy một chuỗi con:

%var:~0,-4%

các -4phương tiện mà 4 chữ số cuối cùng (có lẽ .ext ) sẽ được rút ngắn.


Điều này không hiệu quả với tôi (trên Win8.1) - có thể tôi hiểu nhầm nó khi thử echo %f:~0,-4%trong ngữ cảnh của ví dụ được sử dụng trong câu hỏi. Tôi đang làm gì sai?
Sói

2
Rõ ràng là hoạt động cho các biến "bình thường", không phải biến FOR (hoặc có thể tôi chỉ không biết cú pháp đúng). Dù sao, điều này sẽ hoạt động trong bối cảnh của ví dụ OP: SET fl=%%fvà sau đóecho %fl:~0,-4%
Ohad Schneider

@Wolf bạn cần đặt giá trị của biến vòng lặp thành biến bình thường, sau đó thực hiện thay thế / cắt chuỗi trong biến thông thường
phuclv

Trong các trường hợp quá đủ, độ dài mở rộng không bằng 3 hoặc không xác định. Bạn vẫn có thể sử dụng cho ngay cả khi tệp không tồn tại, xem câu trả lời của tôi.
soái ca

14

Tôi cũng là một người xa lạ với windows cmd, nhưng hãy thử điều này:

echo %%~nf

8

Đây là một phản hồi thực sự muộn, nhưng tôi đã nghĩ ra cách này để giải quyết một vấn đề cụ thể mà tôi gặp phải với DiskIternals LinuxReader đang nối thêm '.efs_ntfs' vào các tệp mà nó đã lưu vào các thư mục không phải là 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

Tôi không chắc nó trả lời câu hỏi được hỏi, nhưng nó thực sự đã giúp tôi, cảm ơn!
matan7890

1
@ matan7890 Đúng; op không chỉ định "Tôi muốn thực hiện một số hành động với (các) tệp" [sic] đòi hỏi, nhưng một trong những hành động đó có thể đổi tên chúng, trong trường hợp đó câu trả lời của tôi là mở rộng câu trả lời được chấp nhận.
Búa búa Agi

Điều này đã giúp một người bạn của tôi, người đã mở một tệp đính kèm và đã .encryptedthêm vào tất cả các tệp của anh ta, cùng với yêu cầu tiền chuộc. Rõ ràng kịch bản tấn công phải là một tệp bó ngược lại với điều này và được thêm .encryptedvào tất cả các tệp.
AwokeKnowing 22/03/2016

1
được nâng cấp bởi vì bạn đề cập đến ổ đĩa, đường dẫn và phần mở rộng ( %% ~ df %% ~ pf %% ~ nf ) gần giống với đầu ra của %% f từ câu hỏi ban đầu, thay vì chỉ tên tệp không có phần mở rộng ( %% ~ nf )
ehambright

5

Tôi đang sử dụng điều này nếu tôi chỉ đơn giản muốn loại bỏ phần mở rộng khỏi một biến (không lặp bất kỳ thư mục hoặc tệp hiện có nào):

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

Nếu bạn muốn loại bỏ phần mở rộng từ một đường dẫn đầy đủ, %%dpnfthay vào đó hãy sử dụng :

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

Thí dụ:

(Sử dụng trực tiếp trong bảng điều khiển)

@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

Sử dụng cygwin bash để cắt nhỏ

  :: 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

Nếu biến của bạn là một đối số, bạn chỉ cần sử dụng %~dpntheo sau là số đối số, do đó bạn không phải lo lắng về việc thay đổi độ dài tiện ích.

Chẳng hạn, %~dpn0sẽ trả về đường dẫn của tệp bó mà không có phần mở rộng của nó, %~dpn1sẽ %1không có phần mở rộng, v.v.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.