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?
4 Réponses :
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.
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
à *.*
:
FORFILES /c "cmd /c echo @fname"
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.
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.
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.
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.
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.
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
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 .
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.