Toplu İşlem: Dosya uzantısını kaldırın


155

Wikipedia'dan aşağıdaki toplu komut dosyası var:

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

For-loop içinde flv uzantılı tüm dosyalar yankılanır, ancak dosya (lar) ile bazı eylemler yapmak istiyorum. Bu ikisini nasıl alabilirim?

Çözüm aradım ama bir çözüm bulamıyorum. Ben toplu işte gerçek bir acemiyim ...

Yanıtlar:


309

%%~nfDosya adını yalnızca aşağıdakiler için başvuruda açıklandığı gibi almak için kullanabilirsiniz for:

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

Aşağıdaki seçenekler mevcuttur:

Değiştirici ile değişken Açıklama

% ~ I ​​Genişletme% I 
                        alıntı işaretleri ("").
% ~ fI% I değişkenini, tam yol adına genişletir.
% ~ dI% I öğesini yalnızca bir sürücü harfine genişletir.
% ~ pI% I öğesini yalnızca bir yola genişletir.
% ~ nI% I öğesini yalnızca bir dosya adına genişletir.
% ~ xI% I öğesini yalnızca bir dosya uzantısına genişletir.
% ~ sI Yolu yalnızca kısa adlar içerecek şekilde genişletir.
% ~ aI% I dosyasını dosyanın dosya özniteliklerine genişletir.
% ~ tI% I öğesini dosyanın tarih ve saatine genişletir.
% ~ zI% I öğesini dosya boyutuna genişletir.
% ~ $ PATH: I PATH ortamında listelenen dizinleri arar 
                        değişkeni ve% I değerini tam nitelikli adına genişletir. 
                        ilk bulundu. Ortam değişkeni adı
                        tanımlanmamış veya dosya arama tarafından bulunamadı,
                        bu değiştirici boş dizeye genişler.    

8
Sadece hızlı bir notu: Yukarıdaki örnekte %% f gibi bir şey olurdu C:\Users\Admin\Ordner\foo.flvve %% ~ nf size verecekti foo. Uzantı dışında her şeyi istiyorsanız, size verecek %% ~ df %% ~ pf %% ~ nf kullanınC:\Users\Admin\Ordner\foo
ehambright

8
@ehambright Geç yorum, ama sanırım kullanmak %%~dpnfdaha kısa bir alternatif olacaktır.

Değiştirici / açıklama tablosu Dirk için teşekkürler. Benim durumum %1bir toplu iş komut dosyasında param uzantısız dosya adını alıyordu . echo %~n1peşindeydim.
Dave Pile

26

Değişkeninizin sahip olduğu dosya aslında mevcut FORdeğilse yaklaşım çalışmaz. Kullanabileceğiniz bir numara, uzantının uzunluğunu biliyorsanız bir alt dize alıyor:

%var:~0,-4%

-4aracı (muhtemelen son 4 basamak bu .ext ) kesilir.


Bu benim için çalışmıyor (Win8.1'de) - belki echo %f:~0,-4%de soruda kullanılan örnek bağlamında denerken yanlış anlıyorum . Neyi yanlış yapıyorum?
Kurt

2
Görünüşe göre bu "normal" değişkenler için çalışır, FOR değişkenleri için değil (ya da ben sadece doğru sözdizimini bilmiyorum). Her neyse, bu OP örneği bağlamında çalışacaktır: SET fl=%%fve sonraecho %fl:~0,-4%
Ohad Schneider

@Wolf, döngü değişkeninin değerini normal bir değişkene ayarlamanız ve ardından normal değişkente dize değiştirme / kesme işlemini yapmanız gerekir
phuclv

Yeterince fazla durumda, uzatma uzunluğu 3'e eşit değildir veya bilinmiyor. Dosya mevcut olmasa bile bir için kullanabilirsiniz, yanıtıma bakın.
marsze

14

Ayrıca windows cmd'ye yabancıyım, ama şunu deneyin:

echo %%~nf

8

Bu gerçekten geç bir yanıt, ancak bunu NTFS olmayan (FAT32) dizinlere kaydettiği dosyalara '.efs_ntfs' ekleyerek DiskInternals LinuxReader ile yaşadığım belirli bir sorunu çözmek için geldim:

@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

Sorulan soruya cevap verdiğinden emin değilim, ama aslında bana yardımcı oldu, teşekkürler!
matan7890

1
@ matan7890 Doğru; op, "[sic] ile dosya (lar) ile bazı eylemler yapmak istiyorum" nu gerektirdiğini belirtmez, ancak bu eylemlerden biri onları yeniden adlandırıyor olabilir, bu durumda cevabım kabul edilen yanıtın genişletilmesidir.
Agi Hammerthief

Bu, bir eki açan ve .encryptedtüm dosyalarına fidye talebi ile eklenmiş bir arkadaşımın yardımcı olmasını sağladı . Görünüşe göre saldıran komut dosyası bunun tersi olan ve .encryptedtüm dosyalara eklenen bir toplu iş dosyası olmalıdır .
AwokeKnowing

1
yalnızca uzantısız dosya adı ( %% yerine dosya adı yerine %% f çıktısına en çok benzeyen sürücü, yol ve uzantıdan ( %% ~ df %% ~ pf %% ~ nf ) bahsettiğiniz için seçildi ~ nf )
ehambright

5

Ben sadece bir değişken (herhangi bir dizin veya mevcut dosyaları döngü olmadan) uzantısını şerit istiyorsanız bunu kullanıyorum:

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

Uzantıyı tam bir yoldan çıkarmak istiyorsanız %%dpnfbunun yerine şunu kullanın:

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

Misal:

(Doğrudan konsolda kullanı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

Doğrama yapmak için cygwin bash kullanma

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

Değişkeniniz bir bağımsız değişkense, bunu sadece %~dpnbağımsız değişken numarasını izleyerek kullanabilirsiniz , böylece değişen uzantı uzunlukları için endişelenmenize gerek kalmaz.

Mesela %~dpn0onun uzantısı olmadan toplu dosyanın yolunu döndürür, %~dpn1olacak %1uzantısı vs. olmadan

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.