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.