De temps en temps, l'incapacité du shell cmd à développer des chemins génériques peut vraiment être un inconvénient. J'ai dû passer 100 fichiers dans un répertoire à un programme et je ne pouvais pas taper * .ext. Au lieu de cela, j'ai utilisé le 'ls' de mingw pour vider la liste dans un fichier, puis j'ai remplacé les nouvelles lignes par des espaces, copiées et collées dans cmd. C'est un cauchemar.
Je suppose que la réponse sera non, mais est-ce que quelqu'un a réglé le problème ou a trouvé un moyen de le rendre plus facile?
windows-7
command-line
wildcards
batch
cemuler
la source
la source
I suspect the answer will be no, but has anyone dealt with this or come up with any way to make this easier?
En fait, j'ai le problème opposé, j'essaie de trouver un moyen de faire en sorte que l'interpréteur de commandes traite sa liste comme des chaînes et l' empêche de les représenter comme des caractères génériques. Par exemple,for %i in (foobar baz really?) do @echo %i
traitera le dernier élément (really?
) comme caractère générique de nom de fichier, et l' ignorer s'il n'y a pas de fichiers nommésreally1
,reallyz
etc. ☹?
n'est pas un caractère légal pour les noms de fichiers dans le système de fichiers Windows. Le caractère ne peut être interprété que comme un caractère générique. Voir Dénomination de fichiers, chemins d'accès et espaces de noms sur MSDN et Utilisation de caractères génériques dans TechNet.Réponses:
DOS, et par conséquent Windows
cmd.exe
, n’a jamais supporté l’extension générique par le shell. C'était toujours à l'application de faire 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:
dir /b > list.txt
pour utiliser ladir
commande afin de développer et de mettre la liste des fichiers dans un fichier texte (vous pouvez alors utiliser quelque chose comme une formule Excel si vous êtes vraiment désespéré de produire une liste de commandes à collercmd
, ou vous pouvez utiliser Excel pour transposer les cellules de sorte que tous les noms de fichiers soient sur la même ligne.)la source
Utilisez simplement 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 du chemin.
Pour démarrer Powershell, tapez simplement "powershell" dans le champ de recherche du menu Démarrer et appuyez sur Entrée.
Si l'application attend une chaîne contenant tous les noms de fichiers, c'est le bon script:
Passez
$delimiter = " "
à$delimiter = ","
si votre application attend une liste de noms de fichiers séparée par des virgules.Explication du code:
[string]$files = $nothing
- crée une variable vide de typestring
;
- est un séparateur pour plusieurs commandes, 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élimiteurapplication.exe $files
- appelle l'application et lui transmet la liste de fichiersVous pouvez même rechercher un modèle de fichier de manière récursive en ajoutant
-recurse
àls *.txt
afin que le code complet ressemble à ceci:Edit:
Pour éviter les irritations,
ls
etdir
sont des alias deGet-ChildItem
et%
est un aliasForEach-Object
. Je garde mon code avec des alias utilisés car ils sont plus courts.EDIT 2018/04/25:
En 2012, PowerShell était relativement nouveau pour moi. Bien sûr, il existe un moyen plus simple, bien que ce ne soit pas aussi facile que la capacité d'expansion globale de unix / linux:
app.exe $(ls *.txt | % {$_.FullName})
Explication:
ls *.txt
obtient les objets FileInfo de tous les fichiers qui correspondent au glob*.txt
% { $_.FileName }
fait cela pour nous.%
boucle sur tous les éléments retournés parls
et renvoie chaque objet FileName.la source
start notepad++ *.txt
(avec l' intention d'ouvrir tous les fichiers texte - notepad ++ utilisé comme il le fait de gérer plusieurs noms) vous mènera nulle partdir *.txt | % { notepad++.exe $_ }
. J'ai essayé cela avec un simple bloc-notes, parce que je n'ai pas de bloc-notes ++, et cela a fonctionné. La commande reçoit une liste de tous les fichiers txt du répertoire en cours, la transmet à la commande suivante qui parcourt la liste et exécute le bloc-notes ++ avec le nom de fichier comme paramètre.grep "a b c"
à rechercher l' une des chaînes répertoriées, où "ab c" serait élargiecopy a+b+c result
etcopy a result
copy b result
copy c result
. (et grep comme utilitaire existe dans PS, ça s'appelleselect-string
)Cela vous donnera une liste et la mettra également dans la variable nommée
expanded_list
. Mettez-le dans un fichier de commandes et exécutez-lemyBatchFile name myPattern
. Placez le motif avec des guillemets s'il contient des espaces. Correspond aux fichiers, pas de répertoires. Exécuter sans paramètres correspond à tous.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 (XP et plus), il est donc possible de la dépasser! Vous ne pouvez pas compter sur l'utilitaire pour vous fournir toujours une liste complète. D'autre part, la longueur maximale de la ligne de commande est également de 8191, vous ne pourrez donc pas l'exécuter de toute façon.
la source
Cela fonctionne dans cmd.exe
ou
la source
dir /b TortoiseSVN\bin\sv*.exe
montrerasvn.exe
etsvnadmin.exe
. Maisdir /b TortoiseSVN\bi*\svn.exe
montre une erreur de syntaxe.dir /s /b
. Cela vous donne le chemin complet.Notez que ceci est dans le commentaire aux affiches dans un fil séparé user619818 et styfle)
DIR peut et permet de rechercher dans tous les sous-répertoires les fichiers correspondant à un type spécifique.
Remarque: le répertoire racine dans lequel tous les sous-répertoires sont situés est supposé être "C: \ Mon programme \ Racine \", car l'auteur n'a pas indiqué de chemin d'accès sous lequel se trouvent ces répertoires.
cela donnera les chemins d'accès complets et les noms de fichiers des fichiers sources.
si vous ne voulez que les noms de fichiers, vous devrez procéder comme suit
En supposant que vous souhaitiez déplacer tous ces fichiers de "C: \ Mon programme \ Root \ Sub Directories \ *. ext" vers "D: \ Singlefolder \ *. ext", procédez comme suit:
Espérons que cela aide les autres à l'avenir. :)
la source
C'est vieux, mais avec le sous-système Linux pour Windows, il est assez commun d'avoir bash dans votre PATH maintenant. Si tel est le cas, cela pourrait faire l'affaire pour vous:
la source