2010-07-09 13 views
112

Mam następujący skrypt wsadowy z Wikipedii:serii: Usuń rozszerzenie pliku

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

W pętli for wszystkich plików z flv przedłużającego się echem, ale chcę poczynić pewne działania z pliku (s) gdzie potrzebuję jeden raz plik bez rozszerzenia i jeden raz z rozszerzeniem. Jak mogę uzyskać te dwie?

Szukałem rozwiązań, ale nie znalazłem. jestem prawdziwym nowicjuszem w partii ...

Odpowiedz

221

Można użyć %%~nf uzyskać tylko nazwę pliku, jak opisano w wniosek o for:

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

dostępne są następujące opcje:

 
Variable with modifier Description 

%~I      Expands %I which removes any surrounding 
         quotation marks (""). 
%~fI     Expands %I to a fully qualified path name. 
%~dI     Expands %I to a drive letter only. 
%~pI     Expands %I to a path only. 
%~nI     Expands %I to a file name only. 
%~xI     Expands %I to a file extension only. 
%~sI     Expands path to contain short names only. 
%~aI     Expands %I to the file attributes of file. 
%~tI     Expands %I to the date and time of file. 
%~zI     Expands %I to the size of file. 
%~$PATH:I    Searches the directories listed in the PATH environment 
         variable and expands %I to the fully qualified name of 
         the first one found. If the environment variable name is 
         not defined or the file is not found by the search, 
         this modifier expands to the empty string.  
+0

Świetna robota. Pomógł mi. –

+2

Po prostu krótka uwaga: w powyższym przykładzie ** %% f ** byłoby coś w stylu 'C: \ Users \ Admin \ Ordner \ foo.flv' i ** %% ~ nf ** dałoby ci' foo' . Jeśli chcesz wszystko _except_ rozszerzenie użyj ** %% ~ df %% ~ pf %% ~ nf ** co dałoby ci 'C: \ Users \ Admin \ Ordner \ foo' – ehambright

13

Jestem też obcy okna CMD, ale spróbuj tego:

echo %%~nf 
8

To jest naprawdę późno odpowiedzi, ale wpadłem na to, aby rozwiązać konkretny problem miałem z DiskInternals LinuxReader dołączanie”.efs_ntfs do plików zapisanych na to, że nie-NTFS (FAT32) katalogach:

@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 
+0

Nie jestem pewien, czy odpowiada na pytanie pytanie, ale to mi naprawdę pomogło, dzięki! – matan7890

+1

@ matan7890 True; operacja nie określa, co "chcę, aby niektóre akcje z plikami (plikami)" [sic] pociąga za sobą, ale jedna z tych akcji może zmieniać ich nazwy, w takim przypadku moja odpowiedź jest rozszerzeniem zaakceptowanej odpowiedzi. –

+0

Pomogło to mojemu przyjacielowi, który otworzył załącznik i dodał ".encrypted" do wszystkich swoich plików wraz z żądaniem okupu. Wygląda na to, że atakujący skrypt musiał być plikiem wsadowym, który jest odwrotnością tego i dodał ".encrypted" do wszystkich plików. – AwokeKnowing

23

Jeśli plik, który zawiera zmienna, w rzeczywistości nie istnieje, podejście FOR nie będzie działać. Jeden trick można użyć, jeśli znasz długość rozszerzenia, bierze podciąg:

%var:~0,-4% 

-4 oznacza, że ​​ostatnie 4 cyfry (przypuszczalnie .ext) zostaną obcięte.

+0

To nie działa dla mnie (na Win8.1) - może źle to rozumiem podczas próby 'echo% f: ~ 0, -4% "w kontekście przykładu użytego w pytaniu. Co ja robię źle? – Wolf

+2

Wygląda na to, że działa dla "normalnych" zmiennych, a nie dla zmiennych (a może po prostu nie znam poprawnej składni).W każdym razie będzie to działać w kontekście przykładu OP: 'SET fl = %% f', a następnie' echo% fl: ~ 0, -4% ' –

+1

Działa dla mnie w Win10 dla prostych parametrów wiersza poleceń, takich jak% 1,% 2 itd. Niż! – deko

0

Jak usunąć więcej niż jedno rozszerzenie? Powiedzmy, że mój plik ma rozszerzenie filename.abc.def.xyz.anything i chcę wyodrębnić tylko nazwę pliku.