46 votes

Existe-t-il un moyen de faire en sorte que la commande Windows cmd Shell étende les chemins d'accès à l'aide de caractères génériques ?

Parfois, l'incapacité du cmd Shell à développer les chemins d'accès avec des caractères génériques peut vraiment être un inconvénient. Je devais transmettre 100 fichiers d'un répertoire à un programme et je ne pouvais pas taper *.ext. A la place, j'ai utilisé 'ls' de mingw pour vider la liste dans un fichier, puis j'ai remplacé les nouvelles lignes par des espaces, copié et collé dans cmd. Un vrai cauchemar.

Je pense que la réponse sera négative, mais quelqu'un s'est-il penché sur la question ou a-t-il trouvé un moyen de faciliter les choses ?

23voto

Malvineous Points 2271

DOS, et par conséquent Windows cmd.exe n'a jamais pris en charge l'expansion des caractères génériques par le Shell. C'est toujours l'application qui se charge de l'expansion.

Cela signifie que vous devrez toujours trouver un autre itinéraire si vous utilisez une application qui ne prend pas en charge l'expansion. Vous pourriez :

  • Utiliser un boucle for. pour lancer des commandes sur tous les fichiers qui vous intéressent
  • Utilisation dir /b > list.txt pour utiliser le dir pour effectuer l'expansion et mettre la liste des fichiers dans un fichier texte (vous pouvez ensuite utiliser quelque chose comme une formule Excel si vous êtes vraiment désespéré de produire une liste de commandes à coller dans le fichier cmd Vous pouvez également utiliser Excel pour transposer les cellules afin que tous les noms de fichiers se trouvent sur la même ligne.)

11voto

Scott Ritchie Points 191

Il suffit d'utiliser Powershell, qui est préinstallé sur Windows 7. Powershell est capable d'exécuter des commandes cmd et comprend les caractères génériques à n'importe quel endroit d'un chemin d'accès.

Pour lancer Powershell, il suffit de taper "powershell" dans le champ de recherche du menu Démarrer et d'appuyer sur la touche Entrée.


Si l'application attend une chaîne contenant tous les noms de fichiers, il s'agit du bon script :

$delimiter = " "
[string]$files = $nothing ; ls *.txt | % { $files += $_.fullname + $delimiter } ; application.exe $files

Changer $delimiter = " " a $delimiter = "," si votre application attend une liste de noms de fichiers séparés par des virgules.

Explication du code :

  • [string]$files = $nothing - crée une variable vide de type string
  • ; - est un séparateur de commandes multiples, pas un pipeline !
  • ls *.txt | % { $files += $_.fullname + $delimiter } - obtient une liste de tous les fichiers texte et crée une chaîne avec tous les noms de fichiers séparés par le délimiteur
  • application.exe $files - appelle l'application et lui transmet la liste des fichiers

Vous pouvez même rechercher un modèle de fichier de manière récursive en ajoutant -recurse a ls *.txt de sorte que le code complet ressemblerait à ceci :

$delimiter = " "
[string]$files = $nothing ; ls *.txt -recurse | % { $files += $_.fullname + $delimiter } ; application.exe $files

Editer :
Pour éviter les irritations, ls y dir sont des alias de Get-ChildItem y % est un alias de ForEach-Object . Je garde mon code avec des alias utilisés parce qu'il est plus court.

ÉDITER 2018/04/25 :
En 2012, j'étais assez novice en matière de PowerShell. Bien sûr, il y a un moyen plus facile, bien qu'il ne soit pas aussi simple que la capacité d'expansion de globes d'Unix/linux :

app.exe $(ls *.txt | % {$_.FullName})

Explication :

  • $() évaluera d'abord l'expression à l'intérieur et se remplacera lui-même par la sortie de cette expression (comme le font les backticks en bash)
  • ls *.txt récupère les objets FileInfo de tous les fichiers qui correspondent au glob *.txt
  • parce que PowerShell est orienté objet, nous devons sortir le fichier nom complet de chaque objet FileInfo. Le simple fait de nommer un attribut/une propriété dans PowerShell l'affiche par défaut. % { $_.FileName } le fait pour nous. % boucle sur tous les éléments renvoyés par ls et produit le nom de fichier de chaque objet.

10voto

Rich Points 101

Vous obtiendrez ainsi une liste que vous placerez dans une variable nommée expanded_list . Mettez-le dans un fichier batch et exécutez-le avec myBatchFile name myPattern . Placez le motif entre guillemets s'il contient des espaces. Correspond aux fichiers, pas aux répertoires. L'exécution sans paramètres correspond à tous les fichiers.

@echo off
set expanded_list=
for /f "tokens=*" %%F in ('dir /b /a:-d "%~1"') do call set expanded_list=%%expanded_list%% "%%F"

echo expanded_list is: 
echo %expanded_list%

Vous pouvez ensuite exécuter votre commande avec my_command_exec %expanded_list%

ATTENTION ! La taille maximale de la variable cmd est de 8191 caractères (à partir de XP), il est donc possible de la dépasser ! Vous ne pouvez pas compter sur l'utilitaire pour vous donner toujours une liste complète. D'autre part, la longueur maximale de la ligne cmd est également de 8191 caractères, de sorte que vous ne pourriez pas l'exécuter de toute façon.

4voto

abbas.aniefa Points 1677

Note : ceci est en commentaire aux posters dans un fil séparé user619818 et styfle)

DIR permet de rechercher dans tous les sous-répertoires les fichiers correspondant à un type spécifique.

Note : Le répertoire racine sous lequel se trouvent tous les sous-répertoires est supposé être " C:\My Programme \Root "L'auteur n'a pas indiqué le chemin sous lequel se trouvent ces répertoires.

DIR /B /S "C:\My Program\Root\*.ext"

cela donnera les chemins d'accès et les noms de fichiers complets des fichiers sources.

si vous ne voulez que les noms de fichiers, vous devez procéder comme suit

FOR /F "Tokens=*" %A IN ('DIR /B /S "C:\My Program\Root\*.ext"') DO @( Echo.%~nxA )

en supposant que vous souhaitiez déplacer tous ces fichiers de " C:\My Programme \Root\Sub Les directions .ext" à " D:\Singlefolder\ .ext", il suffit de procéder ainsi :

FOR /F "Tokens=*" %A IN ('DIR /B /S "C:\My Program\Root\*.ext"') DO @( MOVE "%~A" "D:\Singlefolder\%~nxA" /Y )

J'espère que cela aidera d'autres personnes à l'avenir :)

3voto

user619818 Points 306

Cela fonctionne avec cmd.exe

dir /b *.ext

または

echo | dir /b *.ext

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X