7
votes

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

J'essaye de lister les noms de fichiers à l'exclusion de leur extension,

Comment je le veux:

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

Comment c'est actuellement:

File1.txt
File2.txt
File3.txt

J'ai essayé d'utiliser

File1
File2
File3

mais cela ne fonctionne pas. Je l'ai essayé à la fois dans un fichier batch et dans l'invite de commande.

Est-ce que j'utilise la bonne commande?


2 commentaires

Résolu! Merci à tous pour votre aide.


Si vous avez résolu ce problème vous-même sans l’aide de l’une des réponses ci-dessous , envisagez de répondre à votre manière, y compris la manière dont vous avez résolu votre problème. Sinon, acceptez la réponse qui vous a aidé à le résoudre.


4 Réponses :


5
votes

Utilisez FOR et ECHO pour y parvenir

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

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

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

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

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

Si vous utilisez un fichier batch, vous devez doubler les% 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 à *.*:

FORFILES /c "cmd /c echo @fname"

Si vous le 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 inepte, tel que ECHO est activé. Pour éviter cela, vous pouvez filtrer les lignes contenant ECHO est , avec la commande FIND et l'option / V :

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

Bien sûr, si votre langue locale oblige DOS à produire autre chose que ECHO is , ce filtrage ne fonctionnera pas. Et il manquera tout fichier contenant ECHO is dans le nom du fichier.

Conclusion

Cette folie, mais c'est le prix angoissant que nous payons en utilisant la langue 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 Batch, puis me retrouve à revenir pour le faire à nouveau, penaud.


3 commentaires

Ceci n'atteint pas ce que l'OP veut: il ignorera les fichiers cachés et système (à propos de la première manière) et le second trouvera également des répertoires. La troisième méthode ne fonctionnera pas car elle devrait être %% f .


La dernière option a placé un% devant chaque nom de fichier de sortie, mais a fonctionné comme prévu (pour mes besoins) lorsque j'ai supprimé un% de %% ~ nf


Merci @hshah, j'ai corrigé! Sur la ligne de commande, nous pouvons simplement taper "for% f", mais dans un fichier batch, ce doit être "for %% f". le double bip est également correct: la première manière manque les fichiers cachés et système, et la seconde capture les répertoires de manière indésirable.



0
votes

Pour compléter la réponse d'Eureka, la commande vanilla dir ne peut pas atteindre 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 soit exclure différentes extensions soit utiliser *. * pour tout obtenir fichiers avec un . dans le nom. Jouez avec ce globe pour en tirer ce que vous voulez.


0 commentaires

1
votes

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

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

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

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

Pour cmd une ligne:

@echo off

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

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

@echo off

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

Ces petits programmes parcourent tous les fichiers du dossier sauf les répertoires, et echo code> uniquement les noms de fichiers / chemins complets sans l'extension.


0 commentaires

0
votes

Ce sera beaucoup plus facile dans PowerShell

powershell -Com "(ls -File).BaseName"
powershell -Com (ls^ -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 %

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

(Get-ChildItem -File).BaseName


3 commentaires

Les exemples ci-dessus supposent que vous utilisez au moins Windows 8 ou que vous avez spécifiquement installé PowerShell v3 +. En utilisant PowerShell 2, qui fait partie de Windows 7, vous devez utiliser: Get-ChildItem | Where-Object {-Pas $ _. PSIsContainer} | ForEach-Object {$ _. BaseName} . Cela signifierait à partir d'un fichier de commandes dont vous auriez besoin au moins, @PowerShell -NoP "Ls |? {! $ _. PSIsContainer} | %% {$ _. BaseName}"


@Compo merci pour votre commentaire. Dans ce cas, vous pouvez réduire la commande à ls *. * |% {$ _. BaseName} si les dossiers n'ont jamais de point dans leurs noms et que le fichier le fait toujours


Bien sûr, vous pouvez, mais il est important de noter que sur n'importe quel PC, la grande majorité des répertoires ne sont pas nommés / créés par l'utilisateur, il est donc peu probable de savoir à l'avance s'il y en a un qui utilise un point. De plus, comme vous supprimez des extensions, il serait impossible de distinguer les répertoires des fichiers dans la liste résultante, après tout, c'est généralement l'extension qui identifie l'un de l'autre .