web-dev-qa-db-fra.com

Lot: Supprimer l'extension de fichier

J'ai le script batch suivant de Wikipedia:

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

Dans la boucle for, tous les fichiers avec l'extension flv sont répercutés, mais je souhaite effectuer certaines actions avec le (s) fichier (s) pour lesquels j'ai besoin une fois du fichier sans l'extension et une fois avec l'extension. Comment pourrais-je obtenir ces deux?

J'ai cherché des solutions mais je n'en trouve pas. Je suis un vrai débutant dans le lot ...

136
Poru

Vous pouvez utiliser %%~nf pour obtenir le nom de fichier uniquement, comme décrit dans la référence de for :

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

Les options suivantes sont disponibles:

 Variable avec modificateur Description 
 
% ~ I ​​Développe% I, ce qui supprime les guillemets entourant 
 (""). 
% ~ FI Développe % I en un nom de chemin complet. 
% ~ DI Développe% I en une lettre de lecteur uniquement. 
% ~ PI Étend% I en un chemin uniquement. 
% ~ NI Développe% I en nom de fichier uniquement. 
% ~ XI Développe% I en extension de fichier uniquement. 
% ~ SI Développe le chemin d'accès pour ne contenir que les noms abrégés. 
% ~ AI Étend% I aux attributs de fichier d'un fichier. 
% ~ TI Étend% I à la date et à l'heure du fichier. 
% ~ ZI Agrandit% I à la taille du fichier. 
% ~ $ PATH: I Recherche dans les répertoires de la variable d’environnement PATH 
 Et développe% I jusqu’au nom complet de 
 Le f premier trouvé. Si le nom de la variable d'environnement est 
 Non défini ou si le fichier n'a pas été trouvé par la recherche, 
 Ce modificateur s'étend à la chaîne vide. 
281
Dirk Vollmar

Si le fichier que votre variable contient n’existe pas réellement, l’approche FOR ne fonctionnera pas. Une astuce que vous pouvez utiliser, si vous connaissez la longueur de l’extension, consiste à prendre une sous-chaîne:

%var:~0,-4%

le -4 signifie que les 4 derniers chiffres (vraisemblablement . ext) seront tronqués.

26
Ohad Schneider

Je suis également étranger à Windows cmd, mais essayez ceci:

echo %%~nf
14
Vineet

C'est une réponse très tardive, mais j'ai proposé cela pour résoudre un problème particulier rencontré avec DiskInternals LinuxReader qui ajoutait '.efs_ntfs' à des fichiers qu'il enregistrait dans des répertoires 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
8
Agi Hammerthief

J'utilise ceci si je veux simplement effacer l'extension d'une variable (sans boucler aucun répertoire ni fichier existant):

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

Si vous souhaitez supprimer l'extension d'un chemin complet, utilisez plutôt %%dpnf:

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

Exemple:

(Écriture de % au lieu de %% pour l'utiliser directement dans la console et non dans un script.)

for %f in ("file name.dat") do echo %~nf
for %f in ("C:\Dir\file.dat") do echo %~nf

REM ===========
REM OUTPUT:
REM file name
REM C:\Dir\file
1
marsze

Utiliser cygwin bash pour couper

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