Batch: Hapus ekstensi file


155

Saya memiliki skrip kumpulan dari Wikipedia:

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

Dalam for-loop semua file dengan flv ekstensi dapat digaungkan, tapi saya ingin membuat beberapa tindakan dengan file (s) di mana saya perlu satu kali file tanpa ekstensi dan satu kali dengan ekstensi. Bagaimana saya bisa mendapatkan keduanya?

Saya mencari solusi tetapi saya tidak menemukannya. Saya seorang pemula nyata dalam batch ...

Jawaban:


309

Anda dapat menggunakan %%~nfuntuk mendapatkan nama file hanya seperti yang dijelaskan dalam referensi untuk for:

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

Opsi berikut tersedia:

Variabel dengan Deskripsi pengubah

% ~ I ​​Memperluas% I yang menghilangkan segala yang ada di sekitarnya 
                        tanda kutip ("").
% ~ fI Perluas% I ke nama jalur yang sepenuhnya memenuhi syarat.
% ~ dI Perluas% I hanya untuk huruf drive.
% ~ pI Perluas% I ke jalur saja.
% ~ nI Perluas% I hanya untuk nama file.
% ~ xI Perluas% I hanya untuk ekstensi file.
% ~ sI Perluas jalur yang hanya berisi nama pendek.
% ~ aI Perluas% I ke atribut file dari file.
% ~ tI Perluas% I ke tanggal dan waktu file.
% ~ zI Memperluas% I ke ukuran file.
% ~ $ PATH: Saya Mencari direktori yang terdaftar di lingkungan PATH 
                        variabel dan memperluas% I ke nama sepenuhnya memenuhi syarat dari 
                        yang pertama ditemukan. Jika nama variabel lingkungan adalah
                        tidak ditentukan atau file tidak ditemukan oleh pencarian,
                        pengubah ini diperluas ke string kosong.    

8
Hanya sebuah catatan singkat: dalam contoh di atas %% f akan menjadi seperti C:\Users\Admin\Ordner\foo.flvdan %% ~ nf akan memberi Anda foo. Jika Anda menginginkan semuanya kecuali ekstensi gunakan %% ~ df %% ~ pf %% ~ nf yang akan memberi AndaC:\Users\Admin\Ordner\foo
ehambright

8
@ehambright Komentar terlambat, tapi saya kira menggunakan %%~dpnfakan menjadi alternatif yang lebih pendek.

Terima kasih untuk pengubah / deskripsi tabel Dirk. Kasus saya mendapatkan nama file tanpa ekstensi dari param %1dalam skrip batch. echo %~n1adalah apa yang saya kejar.
Dave Pile

26

Jika file yang Anda pegang variabel tidak benar-benar ada, FORpendekatannya tidak akan berfungsi. Satu trik yang bisa Anda gunakan, jika Anda tahu panjang ekstensi, adalah mengambil substring:

%var:~0,-4%

yang -4berarti bahwa 4 digit terakhir (mungkin Ext ) akan dipotong.


Ini tidak berfungsi untuk saya (pada Win8.1) - mungkin saya salah paham ketika mencoba echo %f:~0,-4%dalam konteks contoh yang digunakan dalam pertanyaan. Apa yang saya lakukan salah?
Wolf

2
Tampaknya itu berfungsi untuk variabel "normal", bukan untuk variabel (atau mungkin saya hanya tidak tahu sintaks yang benar). Pokoknya ini akan bekerja dalam konteks contoh OP: SET fl=%%fdan kemudianecho %fl:~0,-4%
Ohad Schneider

@ Serigala Anda perlu mengatur nilai variabel loop ke variabel normal kemudian melakukan substitusi string / pemotongan dalam variabel normal
phuclv

Dalam lebih dari cukup banyak kasus, panjang ekstensi tidak sama dengan 3 atau tidak diketahui. Anda masih dapat menggunakan for bahkan jika file tidak ada, lihat jawaban saya.
rawa

14

Saya juga orang asing di windows cmd, tetapi coba ini:

echo %%~nf

8

Ini adalah respon yang sangat terlambat, tetapi saya datang dengan ini untuk memecahkan masalah tertentu yang saya miliki dengan DiskInternals LinuxReader menambahkan '.efs_ntfs' ke file yang disimpan ke direktori non-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

Saya tidak yakin itu menjawab pertanyaan yang diajukan, tetapi itu benar-benar membantu saya, terima kasih!
matan7890

1
@ matan7890 Benar; op tidak menentukan apa yang diperlukan "Saya ingin melakukan beberapa tindakan dengan file", tetapi salah satu dari tindakan itu mungkin menamai ulangnya, dalam hal ini jawaban saya adalah perluasan dari jawaban yang diterima.
Agi Hammerthief

Ini membantu seorang teman saya yang membuka lampiran dan telah .encryptedmenambahkan ke semua file-nya, bersama dengan permintaan tebusan. Rupanya skrip penyerang harus berupa file batch yang merupakan kebalikan dari ini dan ditambahkan .encryptedke semua file.
AwokeKnowing

1
dibatalkan karena Anda menyebutkan drive, path, dan ekstensi ( %% ~ df %% ~ pf %% ~ nf ) yang paling mirip dengan output %% f dari pertanyaan awal, alih-alih hanya nama file tanpa ekstensi ( %% ~ nf )
ehambright

5

Saya menggunakan ini jika saya hanya ingin menghapus ekstensi dari variabel (tanpa mengulang direktori apa pun atau file yang ada):

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

Jika Anda ingin menghapus ekstensi dari path lengkap, gunakan %%dpnf:

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

Contoh:

(Gunakan langsung di konsol)

@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

Menggunakan cygwin bash untuk melakukan pemotongan

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

Jika variabel Anda adalah argumen, Anda bisa menggunakan %~dpndiikuti oleh nomor argumen, jadi Anda tidak perlu khawatir untuk memvariasikan panjang ekstensi.

Misalnya %~dpn0akan mengembalikan path file batch tanpa ekstensi, %~dpn1akan %1tanpa ekstensi, dll.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.