web-dev-qa-db-fra.com

Comment afficher uniquement les noms de fichiers sans extensions à l'aide de la commande dir

J'essaie de lister les noms de fichiers en excluant leur extension,

Comment je le veux:

File1
File2
File3

Comment c'est actuellement:

File1.txt
File2.txt
File3.txt

J'ai essayé d'utiliser

@echo off
dir /A:-D /B
pause

mais ça ne marche pas. Je l'ai essayé à la fois dans un fichier de commandes et dans l'invite de commandes.

Suis-je en utilisant la bonne commande?

4
Jeremy Bierley

Utilisez FOR et ECHO pour y parvenir

Par exemple, en supposant que l'extension est toujours .txt:

for %f  in ("*.txt") do @echo %~nf

Au lieu d'utiliser DIR, nous utilisons la commande FOR pour parcourir la liste et envoyer chacun à ECHO, avec l'option "~ n" insérée dans le% f, pour que l'extension ne soit pas affichée.

Une alternative est

FORFILES /c "cmd /c echo @fname"

Cependant, j'obtiens des guillemets autour de chaque nom de fichier de sortie, ce qui n'est pas ce que vous voulez.

Si vous exécutez dans un fichier batch, vous devez doubler le% pour les variables

for %%f in ("*.txt") do @echo %%~nf

Si vous devez gérer plusieurs extensions de fichier

Tant que le répertoire ne contient aucun sous-répertoire dont les noms ont une extension, vous pouvez généraliser le *.txt à *.*:

for %f in ("*.*") do @echo %~nf

Si vous pouvez avoir des fichiers sans extension

Où le fichier a une extension mais rien avant, par exemple .gitignore, la commande ECHO vide qui en résulte affichera un message stupide, tel que ECHO is on. Pour éviter cela, vous pouvez filtrer les lignes contenant ECHO is, avec la commande FIND et la commande /V option:

for %f in ("*.*") do @echo %~nf | find /v "ECHO is"

Bien sûr, si votre langue locale fait que DOS affiche autre chose que ECHO is alors ce filtrage ne fonctionnera pas. Et il manquera tout fichier qui contient ECHO is dans le nom de fichier.

Conclusion

Cette folie, mais c'est le prix angoissant que nous payons pour utiliser le langage Batch au lieu de toute autre langue (du tout!). Je suis comme un alcoolique, promettant à tout le monde que je n'écrirai plus jamais une ligne de code de lot, puis je me retrouve à revenir pour le faire à nouveau, timidement.

4
Eureka

Ceci est possible avec une commande dir et une boucle for:

@echo off

for /F "delims= eol=" %%A IN ('dir /A-D /B') do echo %%~nA

Si vous voulez le chemin complet sans l'extension, essayez:

@echo off

for /F "delims= eol=" %%A IN ('dir /A-D /B') do echo %%~dpnA

Pour cmd une ligne:

for /F "delims= eol=" %A IN ('dir /A-D /B') do echo %~nA

Et pour le chemin complet sans l'extension, essayez:

for /F "delims= eol=" %A IN ('dir /A-D /B') do echo %~dpnA

Ces petits programmes parcourent tous les fichiers du dossier à l'exception des répertoires et echo uniquement les noms de fichiers/chemins d'accès complets sans l'extension.

1
double-beep

Pour compléter la réponse d'Eureka, la commande Vanilla dir ne peut pas réaliser ce que vous recherchez.

C:\Users\jacob>dir /?
Displays a list of files and subdirectories in a directory.

DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
  [/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]

  [drive:][path][filename]
              Specifies drive, directory, and/or files to list.

  /A          Displays files with specified attributes.
  attributes   D  Directories                R  Read-only files
               H  Hidden files               A  Files ready for archiving
               S  System files               I  Not content indexed files
               L  Reparse Points             -  Prefix meaning not
  /B          Uses bare format (no heading information or summary).
  /C          Display the thousand separator in file sizes.  This is the
              default.  Use /-C to disable display of separator.
  /D          Same as wide but files are list sorted by column.
  /L          Uses lowercase.
  /N          New long list format where filenames are on the far right.
  /O          List by files in sorted order.
  sortorder    N  By name (alphabetic)       S  By size (smallest first)
               E  By extension (alphabetic)  D  By date/time (oldest first)
               G  Group directories first    -  Prefix to reverse order
  /P          Pauses after each screenful of information.
  /Q          Display the owner of the file.
  /R          Display alternate data streams of the file.
  /S          Displays files in specified directory and all subdirectories.
  /T          Controls which time field displayed or used for sorting
  timefield   C  Creation
              A  Last Access
              W  Last Written
  /W          Uses wide list format.
  /X          This displays the short names generated for non-8dot3 file
              names.  The format is that of /N with the short name inserted
              before the long name. If no short name is present, blanks are
              displayed in its place.
  /4          Displays four-digit years

Switches may be preset in the DIRCMD environment variable.  Override
preset switches by prefixing any switch with - (hyphen)--for example, /-W.

De plus, comme alternative à la suggestion d'utiliser ("*.txt"), si votre liste de fichiers comprend plusieurs extensions, vous pouvez exclure différentes extensions o utiliser *.* pour obtenir tous les fichiers avec un . dans le nom. Jouez avec ce glob pour obtenir ce que vous voulez en tirer.

0
Jacob

Ce sera beaucoup plus facile dans PowerShell

(Get-ChildItem -File).BaseName

ou

Get-ChildItem | ForEach-Object { $_.BaseName }

Get-ChildItem peut être remplacé par les alias ls, gci ou dir et ForEach-Object peut être remplacé par %

Donc, à partir de cmd, vous pouvez exécuter l'un ou l'autre de ces éléments pour atteindre l'objectif

powershell -Com "(ls -File).BaseName"
powershell -Com (ls^ -File).BaseName
0
phuclv