IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Commande c# non fonctionnelle, parfois


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 78
    Par défaut Commande c# non fonctionnelle, parfois
    Bonjour et meilleurs vœux à tout le monde


    Je lance une commande (cmd) comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    private void Bouton_Click(object sender, EventArgs e)
    {
        base.Enabled = false;
            Application.DoEvents();
            string arg = " -p " + textBox1.Text + " -y " + textBox2.Text + " -z " + comboBox1.Text + " -v " + comboBox2.Text + " -j 0 " + label1.Text;
            Process process = new Process
            {
                StartInfo = { Arguments = arg, FileName = Application.StartupPath + "\\action.exe", CreateNoWindow = true, UseShellExecute = false }
            };
            process.Start();
            process.WaitForExit();
            MessageBox.Show("Ok !");
     
     
    }
    Seulement voilà, ça ne fonctionne pas lorsque le chemin possède des espaces.
    J'ai lu ici et là qu'il faudrait mettre des " sur le chemin des arguments mais comment faire car si j'écris ceci ça ne fonctionne pas (forcement ^^) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string arg = "" -p " + textBox1.Text + " -y " + textBox2.Text + " -z " + comboBox1.Text + " -v " + comboBox2.Text + " -j 0 " + label1.Text;";
    Merci de votre aide.

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonjour,

    Il n'existe pas des fonctions de formatage de chaînes de caractères en C#, je sais qu'en python on pourrait utiliser la méthode format ?

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 428
    Par défaut
    Bonjour,
    Tu peux essayer avec une chaîne interpolée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string arg = $" -p \"{textBox1.Text}\" -y \"{textBox2.Text}\" -z \"{comboBox1.Text}\" -v \"{comboBox2.Text}\" -j 0 \"{label1.Text}\";";
    Tatayo.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 78
    Par défaut
    Merci pour vos réponses / aides.

    Tatayo : j'ai remplacé par ta ligne mais ça ne fonctionne pas comme précédemment.

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Tatayo : j'ai remplacé par ta ligne mais ça ne fonctionne pas comme précédemment.
    Il vous reste la solution String.Format à moins que vous souhaitiez recevoir une réponse toute faite ?

    Et puis si vous expliqueriez ce que vous voyez et ce que vous attendez, peut-être que la solution de @tatayo pourrait être adapté.

  6. #6
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Pour compléter la réponse de tatayo, il est possible de combiner l'interpolation de chaîne avec les raw strings pour se passer des caractère d'échappement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string arg = $""" -p "{textBox1.Text}" -y "{textBox2.Text}" -z "{comboBox1.Text}" -v "{comboBox2.Text}" -j 0 "{label1.Text}";""";
    Une autre options est d'en faire une liste de chaînes et d'entourer de guillemets si besoin, puis de joindre avec des espaces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    string[] args =
    {
        "-p",
        textBox1.Text,
        "-y",
        textBox2.Text,
        "-z",
        comboBox1.Text,
        "-v",
         comboBox2.Text,
         "-j",
         "0",
         label1.Text,
         ";"
    }
    .Select(s => s.Contains(" ") ? "\"{s}\"" : s)
    .ToArray();
     
    string argString = string.Join(' ', args);

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 78
    Par défaut
    Salut à tous,

    Bon j'ai passé quelques jours de recherche sur le web, sans succès, je désespère, j'essaie tout et surtout rien, je n'essaie même plus de comprendre, j'applique.



    Citation Envoyé par Noxen Voir le message
    Pour compléter la réponse de tatayo, il est possible de combiner l'interpolation de chaîne avec les raw strings pour se passer des caractère d'échappement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string arg = $""" -p "{textBox1.Text}" -y "{textBox2.Text}" -z "{comboBox1.Text}" -v "{comboBox2.Text}" -j 0 "{label1.Text}";""";
    J'ai tenté, il y a une erreur.

    Nom : 1.png
Affichages : 93
Taille : 39,6 Ko










    Citation Envoyé par Noxen Voir le message
    Une autre options est d'en faire une liste de chaînes et d'entourer de guillemets si besoin, puis de joindre avec des espaces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    string[] args =
    {
        "-p",
        textBox1.Text,
        "-y",
        textBox2.Text,
        "-z",
        comboBox1.Text,
        "-v",
         comboBox2.Text,
         "-j",
         "0",
         label1.Text,
         ";"
    }
    .Select(s => s.Contains(" ") ? "\"{s}\"" : s)
    .ToArray();
     
    string argString = string.Join(' ', args);
    Pareil.

    Nom : 2.png
Affichages : 89
Taille : 60,5 Ko

  8. #8
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Pour la première erreur, c'est la version du langage qui est en cause, comme l'indique l'erreur, les raw strings ne sont pas disponibles dans celle que tu utilises. La correction proposée par fred1599 devrait fonctionner.

    Pour la deuxième c'est ma faute. Ça aurait fonctionné si on avait directement assignée à une variable de type string[]. On l'occurrence on passe le résultat de l'expression à une méthode d'extension (Select) qui prend en paramètre un IEnumerable<string>, du coup il manque d'informations pour valider l'expression. Pour corriger, on peut soit faire l'assignation en deux fois (un tableau avec les valeurs d'origine puis un avec les valeurs finales), soit rajouter new[] devant l'expression pour lever l'ambiguïté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    string[] args = new[] // la correction est ici
    {
    	"-p",
    	textBox1.Text,
    	"-y",
    	textBox2.Text,
    	"-z",
    	comboBox1.Text,
    	"-v",
    	 comboBox2.Text,
    	 "-j",
    	 "0",
    	 label1.Text,
    	 ";"
    }
    .Select(s => s.Contains(" ") ? "\"{s}\"" : s)
    .ToArray();
     
    string argString = string.Join(' ', args);
    Tu fais un projet en Net Framework (c'est-à-dire pas en .Net Core ou .Net 5+) ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 78
    Par défaut
    Salut et merci de vos aides, c'est super cool,

    J'ai suivi ce qu'avait donné fred1599, il y manquait 2 caractères en fin de ligne mais ça semble fonctionner ensuite !

    Merci encore à tous !

    La ligne qui a fonctionné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \string arg = $" -p \"{textBox1.Text}\" -y \"{textBox2.Text}\" -z \"{comboBox1.Text}\" -v \"{comboBox2.Text}\" -j 0 \"{label1.Text}\"";

  10. #10
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Il vous reste la solution String.Format à moins que vous souhaitiez recevoir une réponse toute faite ?

    Et puis si vous expliqueriez ce que vous voyez et ce que vous attendez, peut-être que la solution de @tatayo pourrait être adapté.
    Il y a string.Format, mais l'interpolation de chaîne est préférable, c'est l'équivalent des f-string en python :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    f"-p {text(textbox1)}"

  11. #11
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Il y a string.Format, mais l'interpolation de chaîne est préférable, c'est l'équivalent des f-string en python :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    f"-p {text(textbox1)}"
    Préférable, c'est un point de vue.
    C'est plus simple, certes.
    Mais, string.Format() permet d'adapter à la culture (même si cela n'est pas nécessaire dans ce cas précis).

  12. #12
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Citation Envoyé par popo Voir le message
    Préférable, c'est un point de vue.
    C'est plus simple, certes.
    Mais, string.Format() permet d'adapter à la culture (même si cela n'est pas nécessaire dans ce cas précis).
    En fait il y a moyen de faire avec l'interpolation de chaîne :
    https://learn.microsoft.com/en-us/do...-interpolation

    Par ailleurs ce sont des arguments de ligne de commande, donc il n'est vraiment question ici de culture. De mon point de vue c'est surtout plus lisible. De plus il me semble qu'il y a des optimisations faites à la compilation (bien qu'ici ce ne soit pas vraiment un goulot d'étranglement).

  13. #13
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    L'exemple que tu montre, utilise String.Create.
    Or, String.Create utilise DefaultInterpolatedStringHandler.ToStringAndClear en interne.
    Ce qui signifie que la chaine est transformée deux : une fois par l'interpolation, et une deuxième fois pour y appliquer la culture.
    Ce n'est pas le cas avec String.Format.

    L'argument de la visibilité n'est valable que pour des exemple simple.
    L'argument de la ligne de commande qui n'a pas besoin de culture est tout simplement faux car les commandes lancées ont généralement besoin que les dates ou les nombres soient passés dans un format (le plus souvent CurrentCulture ou InvariantCulture).

    L'optimisation à la compilation fonctionne sur les chaines fixes, ce qui de fait ne fonctionne pas avec l'interpolation.
    La chaine $"Welcome back dear {customerName} !" ne peux être optimisée à la compilation car elle a une partie variable qui est customerName.
    La chaine "Welcome back dear {0} !" est optimisée à la compilation car elle est fixe.

    Edit :
    En dernier lieu, l'interpolation n'est pas possible dans un fichier de ressources.

Discussions similaires

  1. Incrementer type text parfois non fonctionnel
    Par fabulon46 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 08/04/2014, 12h47
  2. commande non fonctionnel
    Par djdidi2010 dans le forum WinDev
    Réponses: 2
    Dernier message: 07/05/2012, 13h47
  3. Ligne de commande non fonctionnelle en VB.NET
    Par CLeBeR dans le forum VB.NET
    Réponses: 4
    Dernier message: 25/04/2012, 23h38
  4. Update non fonctionnel
    Par kissmytoe dans le forum Access
    Réponses: 7
    Dernier message: 07/03/2006, 18h37
  5. [REPORTS] Order BY non fonctionnel
    Par sdiack dans le forum Reports
    Réponses: 2
    Dernier message: 10/02/2006, 18h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo