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?
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.
for %%f in ("*.txt") do @echo %%~nf
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
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.
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.
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.
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.
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