Lot: supprimer l'extension de fichier

155

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 repris, mais je veux faire des actions avec le (s) fichier (s) où j'ai besoin une fois du fichier sans l'extension et une fois avec l'extension. Comment pourrais-je avoir ces deux?

J'ai cherché des solutions mais je n'en trouve pas. Je suis un vrai novice en batch ...

Poru
la source

Réponses:

309

Vous pouvez utiliser %%~nfpour obtenir le nom de fichier uniquement comme décrit dans la référence pour 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 qui supprime tout environnement 
                        guillemets ("").
% ~ fI Développe% I en un nom de chemin complet.
% ~ dI Développe% I en une lettre de lecteur uniquement.
% ~ pI Développe% I vers un chemin uniquement.
% ~ nI Développe% I en un nom de fichier uniquement.
% ~ xI Développe% I en une extension de fichier uniquement.
% ~ sI Développe le chemin pour ne contenir que des noms courts.
% ~ aI Étend% I aux attributs de fichier du fichier.
% ~ tI Étend% I à la date et à l'heure du fichier.
% ~ zI Étend% I à la taille du fichier.
% ~ $ PATH: I Recherche les répertoires répertoriés dans l'environnement PATH 
                        variable et étend% I au nom complet de 
                        le premier trouvé. Si le nom de la variable d'environnement est
                        non défini ou le fichier n'est pas trouvé par la recherche,
                        ce modificateur se développe en une chaîne vide.    
Dirk Vollmar
la source
8
Juste une petite note: dans l'exemple ci-dessus, %% f serait quelque chose comme C:\Users\Admin\Ordner\foo.flvet %% ~ nf vous donnerait foo. Si vous voulez tout sauf l'extension, utilisez %% ~ df %% ~ pf %% ~ nf qui vous donneraitC:\Users\Admin\Ordner\foo
ehambright
8
@ehambright Commentaire tardif, mais je suppose que l'utilisation %%~dpnfserait une alternative plus courte.
Merci pour le tableau de modification / description Dirk. Mon cas obtenait le nom de fichier sans extension de param %1dans un script batch. echo %~n1était ce que je cherchais.
Dave Pile
26

Si le fichier contenu dans votre variable n'existe pas, l' FORapproche ne fonctionnera pas. Une astuce que vous pourriez utiliser, si vous connaissez la longueur de l'extension, consiste à prendre une sous-chaîne:

%var:~0,-4%

les -4moyens que les 4 derniers chiffres (probablement .ext ) sont tronqués.

Ohad Schneider
la source
Cela ne fonctionne pas pour moi (sur Win8.1) - peut-être que je l'ai mal compris en essayant echo %f:~0,-4%dans le contexte de l'exemple utilisé dans la question. Qu'est-ce que je fais mal?
Wolf
2
Apparemment, cela fonctionne pour les variables "normales", pas pour les variables FOR (ou peut-être que je ne connais tout simplement pas la syntaxe correcte). Quoi qu'il en soit, cela fonctionnera dans le contexte de l'exemple OP: SET fl=%%fet puisecho %fl:~0,-4%
Ohad Schneider
@Wolf, vous devez définir la valeur de la variable de boucle sur une variable normale, puis effectuer une substitution / troncature de chaîne dans la variable normale
phuclv
Dans plus de cas qu'assez, la longueur d'extension n'est pas égale à 3 ou est inconnue. Vous pouvez toujours utiliser un pour même si le fichier n'existe pas, voir ma réponse.
marsze le
14

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

echo %%~nf
Vineet
la source
8

C'est une réponse très tardive, mais j'ai proposé ceci pour résoudre un problème particulier que j'avais avec DiskInternals LinuxReader ajoutant '.efs_ntfs' aux fichiers qu'il a enregistrés 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
Agi Hammerthief
la source
Je ne suis pas sûr que cela réponde à la question posée, mais cela m'a vraiment aidé, merci!
matan7890
1
@ matan7890 Vrai; l'opération ne spécifie pas ce qu'implique "Je veux effectuer des actions avec le (s) fichier (s)" [sic], mais l'une de ces actions peut être de les renommer, auquel cas ma réponse est une extension de la réponse acceptée.
Agi Hammerthief
Cela a aidé un de mes amis qui a ouvert une pièce jointe et a .encryptedajouté à tous ses fichiers, avec une demande de rançon. Apparemment, le script attaquant doit avoir été un fichier batch qui est l'inverse de cela et ajouté .encryptedà tous les fichiers.
AwokeKnowing
1
voté parce que vous mentionnez le lecteur, le chemin et l'extension ( %% ~ df %% ~ pf %% ~ nf ) qui ressemble le plus à la sortie de %% f de la question originale, au lieu du seul nom de fichier sans extension ( %% ~ nf )
ehambright
5

J'utilise ceci si je veux simplement supprimer l'extension d'une variable (sans boucler de répertoires ou de fichiers existants):

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

Si vous souhaitez supprimer l'extension d'un chemin complet, utilisez à la %%dpnfplace:

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

Exemple:

(Utiliser directement dans la 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
marsze
la source
0

Utilisation de cygwin bash pour faire le hachage

  :: 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
mosh
la source
0

Si votre variable est un argument, vous pouvez simplement utiliser %~dpnsuivi du numéro d'argument, de sorte que vous n'ayez pas à vous soucier des longueurs d'extension variables.

Par exemple %~dpn0 retournera le chemin du fichier batch sans son extension, %~dpn1sera %1sans extension, etc.

Martin Braun
la source