Batch: rimuove l'estensione del file


155

Ho il seguente script batch da Wikipedia:

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

Nel ciclo for tutti i file con estensione flv vengono ripetuti, ma voglio eseguire alcune azioni con i file in cui ho bisogno una volta del file senza l'estensione e una volta con l'estensione. Come ho potuto ottenere questi due?

Ho cercato soluzioni ma non ne trovo una. Sono un vero principiante in batch ...

Risposte:


309

È possibile utilizzare %%~nfper ottenere il nome file solo come descritto nel riferimento per for:

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

Sono disponibili le seguenti opzioni:

Variabile con modificatore Descrizione

% ~ I ​​Espande% I che rimuove qualsiasi ambiente circostante 
                        Virgolette ("").
% ~ fI Espande% I in un nome percorso completo.
% ~ dI Espande% I solo in una lettera di unità.
% ~ pI Espande% I solo in un percorso.
% ~ nI Espande% I solo in un nome file.
% ~ xI Espande% I solo in un'estensione di file.
% ~ sI Espande il percorso per contenere solo nomi brevi.
% ~ aI Espande% I negli attributi di file del file.
% ~ tI Espande% I alla data e ora del file.
% ~ zI Espande% I alle dimensioni del file.
% ~ $ PATH: I Cerca le directory elencate nell'ambiente PATH 
                        variabile ed espande% I al nome completo di 
                        il primo trovato. Se il nome della variabile di ambiente è
                        non definito o il file non è stato trovato dalla ricerca,
                        questo modificatore si espande nella stringa vuota.    

8
Solo una breve nota: nell'esempio sopra %% f sarebbe qualcosa di simile C:\Users\Admin\Ordner\foo.flve %% ~ nf ti darebbe foo. Se vuoi tutto tranne l'estensione usa %% ~ df %% ~ pf %% ~ nf che ti darebbeC:\Users\Admin\Ordner\foo
ehambright

8
@ehambright Commento in ritardo, ma immagino che usare %%~dpnfsarebbe un'alternativa più breve.

Grazie per la tabella di modifica / descrizione Dirk. Il mio caso era ottenere il nome del file senza estensione da param %1in uno script batch. echo %~n1era quello che stavo cercando.
Dave Pile,

26

Nel caso in cui il file conservato dalla variabile non esista effettivamente, l' FORapproccio non funzionerà. Un trucco che potresti usare, se conosci la lunghezza dell'estensione, è prendere una sottostringa:

%var:~0,-4%

i -4mezzi che le ultime 4 cifre (presumibilmente .ext ) verranno troncati.


Questo non funziona per me (su Win 8.1) - forse lo fraintendo quando provo echo %f:~0,-4%nel contesto dell'esempio usato nella domanda. Che cosa sto facendo di sbagliato?
Lupo,

2
Apparentemente funziona con variabili "normali", non con variabili FOR (o forse non conosco la sintassi corretta). Comunque funzionerà nel contesto dell'esempio di PO: SET fl=%%fe poiecho %fl:~0,-4%
Ohad Schneider il

@Wolf devi impostare il valore della variabile loop su una variabile normale, quindi fai la sostituzione / troncamento della stringa nella variabile normale
phuclv

In casi più che sufficienti, la lunghezza dell'estensione non è uguale a 3 o è sconosciuta. Puoi ancora usare un per anche se il file non esiste, vedi la mia risposta.
Marsze

14

Sono anche estraneo a Windows cmd, ma prova questo:

echo %%~nf

8

Questa è una risposta molto tardiva, ma mi è venuta in mente questa soluzione per risolvere un particolare problema che avevo con DiskInternals LinuxReader che aggiungeva '.efs_ntfs' ai file salvati in directory 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

Non sono sicuro che risponda alla domanda, ma in realtà mi ha aiutato, grazie!
matan7890,

1
@ matan7890 True; l'op non specifica cosa comporta "Voglio che esegua alcune azioni con i file" [sic], ma una di quelle azioni potrebbe essere quella di rinominarle, nel qual caso la mia risposta è un'espansione della risposta accettata.
Agi Hammerthief

Ciò ha aiutato un mio amico che ha aperto un allegato e .encryptedaggiunto a tutti i suoi file, insieme a una richiesta di riscatto. Apparentemente lo script di attacco deve essere stato un file batch che è il contrario di questo e aggiunto .encrypteda tutti i file.
AwokeKnowing

1
è stato votato perché menzionate l'unità, il percorso e l'estensione ( %% ~ df %% ~ pf %% ~ nf ) che assomiglia più da vicino all'output di %% f dalla domanda originale, anziché solo il nome del file senza estensione ( %% ~ nf )
ehambright il

5

Lo sto usando se voglio semplicemente rimuovere l'estensione da una variabile (senza eseguire il loop di alcuna directory o file esistente):

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

Se si desidera eliminare l'estensione da un percorso completo, utilizzare %%dpnfinvece:

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

Esempio:

(Utilizzare direttamente nella console)

@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

Usando Cygwin Bash per fare il taglio

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

Se la tua variabile è un argomento, puoi semplicemente usare %~dpnseguito dal numero dell'argomento, quindi non devi preoccuparti di variare la lunghezza dell'estensione.

Ad esempio %~dpn0restituirà il percorso del file batch senza la sua estensione, %~dpn1sarà %1senza estensione, ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.