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 ?

2voto

Richard Points 169

C'est vieux, mais avec le sous-système Linux pour Windows, il est assez courant d'avoir bash dans votre PATH maintenant. Si c'est le cas, cela pourrait vous aider :

bash -c 'cat *.txt'

0voto

Zimba Points 753

Pourquoi pas for pour transmettre la liste des fichiers au programme :

for %i in (*.txt) do start notepad %i

Ou si vous voulez passer tous les fichiers (liste) à l'exécution de un seul cas du programme (par exemple, transmettre une liste de fichiers séparés par des espaces) :

set list=.& (for %i in (*.txt) do set list=!list! %i)& start app.exe !list:~2!

Dans le 2e cas, la variable list contient tous les fichiers représentés par *.txt :

echo !list:~2!

Si le programme ne peut pas détecter les noms de fichiers contenant des espaces, citez les noms :

set list=.& (for %i in (*.txt) do set list=!list! "%i")& start app.exe !list:~2!

Testé avec Win CMD

0voto

DataJanitor Points 1

Microsoft propose une solution très simple à ce problème : https://docs.microsoft.com/en-us/cpp/c-language/expanding-wildcard-arguments?view=msvc-170

En fait, il suffit d'utiliser l'une des deux bibliothèques qui étendent les caractères génériques dans la liste argv[] fournie à votre programme.

Pour clarifier à l'aide d'un exemple, disons que vous avez le code :

// ExampleFileExpansion.cpp : This outputs the cmd line arguments
//

#include <iostream>
#include <tchar.h>

using namespace std;

int wmain(int argc, _TCHAR* argv[]) {
    for (int i = 0; i < argc; i++) {
        wcout << i << "\t" << argv[i] << endl;
    }
}

Ce qui donne normalement des résultats comme :

C:\x64\Debug>ExampleFileExpansion *.*

0       ExampleFileExpansion
1       *.*

Dans Visual Studio, accédez à la page des propriétés du projet et choisissez les options d'entrée de l'éditeur de liens | Dépendances supplémentaires. Ajoutez ensuite la bibliothèque (dans ce cas "wsetargv.obj") et appliquez la modification. Ensuite, construisez à nouveau le projet à partir du menu principal.

Après la modification, l'exécution du même code donne quelque chose comme :

C:\x64\Debug>ExampleFileExpansion *.*

0       ExampleFileExpansion
1       ExampleF.a660785c.tlog
2       ExampleFileExpansion.exe
3       ExampleFileExpansion.exe.recipe
4       ExampleFileExpansion.ilk
5       ExampleFileExpansion.log
6       ExampleFileExpansion.obj
7       ExampleFileExpansion.pdb
8       ExampleFileExpansion.vcxproj.FileListAbsolute.txt
9       vc143.idb
10      vc143.pdb

Voici quelques captures d'écran de VS 2022 pour illustrer les étapes :

Menu des propriétés du projet Visual Studio

Choisissez les options d'entrée de l'éditeur de liens, puis Editer pour obtenir la boîte de dialogue

Saisir le nom du fichier obj approprié, soit wsetargv.obj, soit setargv.obj, selon que la fonction wmain ou main est déclarée.

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