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 :

Problème pour le lancement d'une commande DOS


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut Problème pour le lancement d'une commande DOS
    Bonjour, après avoir cherché partout des solutions qui ne fonctionnait pas je m'en remet à vous.
    Je souhaite lancer une application DOS (ex : toto.exe) avec des paramètres comprenant 2 chemins et un chaine de caractères.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    string cheminApp = "C:\\toto.exe";
    string commande = cheminSource + " " + cheminSortie + " test.txt");
    // en faisant ceci ça marche presque :
    Process.Start(cheminApp, commande);
    Le problème c'est que dans les "cheminSource" et "cheminSortie" il y a des espaces que je ne peut enlever et donc quand on lance le Process, je perds des parties de mon chemin :
    cheminSource = C:\Documents and Settings
    sera pris en compte : C:\Documents

    J'ai testé avec Path.GetFullPath(cheminSource); mais le problème est toujours le même
    // d'ailleurs qu'est-ce que ça fait si je met @cheminSOurce le "@" je l'ai vu de temps en temps...
    Sinon j'avais une idée qui serait de convertir mes chemins Windows en chemin DOS.
    Ex :
    Windows : C:\Documents and Settings
    DOS : C:\Docume~1
    Cela me permettrai certainement de résoudre mon problème mais pas moyen de trouver une méthode qui me fasse ça ! Je pourrais le coder moi même mais je sais pas comment est fais l'algo pour couper ces chemins et pour qu'il soit compris par MSDOS...

    Merci pour vos réponses
    Si tout semble bien marcher c'est que vous avez oublié quelque chose !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    En général, lorsqu'un paramètre contient des espaces il faut le mettre entre guillemets pour que l'interpréteur de commande considère la totalité de la chaîne comme un seul paramètre :

    C:\\Toto.exe "Mon Paramètre 1" "Mon Paramètre 2" Paramètre3

    Concernant le @ en C# placé devant une chaîne, il permet d'écrire \ au lieu de \\.

  3. #3
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 206
    Points : 28 131
    Points
    28 131
    Par défaut
    comme le dit kaidan, lorsque un chemin contient des espaces, il faut l'encadrer de " pour qu'il soit compris dans sa totalité par le système. Ca vaut aussi pour l'executable qui doit être lancé.


    Pour ce qui est de l'algo de création des nom courts, il est très simple. On prend les 6 premiers caractères du nom et on rajoute ~1. Si un fichier ou de dossier existe déjà avec ce nom là dans le dossier, on met ~2 à la place de ~1, ou ~3 ou ~4, .... jusqu'à trouver un nom qui n'est pas déjà pris.
    Ceci est au moment de la création du nom court.
    Ensuite au moment de l'utilisation, il n'y a aucun moyen de déterminer, à ma connaissance, le nom court qui a été utilisé (sauf à utiliser une API de Windows qui donne le nom court à partir du nom long, mais là on tourne en rond)
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut
    Ok j'avais oublié de dire que j'avais aussi essayé avec les " (double quote) et que ça me sortait un résultat complétement bizarre et ça marchait pas.
    Supposons :
    cheminSource = "C:\Documents and Settings\toto"
    cheminSortie = "C:\Documents and Settings\bozo"

    si je fais comme vous dites :
    commande = "\"" + cheminSource + "\" \"" + cheminSortie + "\" test.txt"

    les 2 arguments (le 3ème n'est pas visible dans la fenêtre DOS) pris en compte seront :
    cheminSource :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Documents and Settings\toto" C:\Documents
    // bizarre le " en plein milieu
    cheminSortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Documents and Settings\Administrateur\Mes documents\Visual Studio 2008\Projects\MonProjet\MonProjet\bin\Debug\and
    Alors peut être ai je fais une erreur dans la gestion des ", mais je vois pas où.
    Si tout semble bien marcher c'est que vous avez oublié quelque chose !

  5. #5
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 206
    Points : 28 131
    Points
    28 131
    Par défaut
    Test effectué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                string cheminApp = "C:\\temp\\test.bat";
                string cheminSource = "C:\\Documents and Settings\\toto";
                string cheminSortie = "C:\\Documents and Settings\\bozo";
                string commande = "\"" + cheminSource + "\" \"" + cheminSortie + "\" test.txt";
     
                Process.Start(cheminApp, commande);
    Résultat obtenu (fichier test.txt) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "C:\Documents and Settings\toto" 
    "C:\Documents and Settings\bozo" 
    test.txt
    avec le fichier test.bat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    echo %1 >>%3
    echo %2 >>%3
    echo %3 >>%3
    pause
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut
    Merci mais c'est pas ça. J'explique un peu l'application DOS :
    J'ai un fichier "hobo.exe" que j'ai récupérer sur le net.
    Ce fichier me permet de copier un ou plusieurs fichier(s) ("test.txt" est un exemple) d'un répertoire source (cheminSource) vers un répertoire de sortie (cheminSortie).

    pour le lancer, il faut faire de cette façon quand on utilise un fichier .bat :
    dans le fichier Copie.bat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hobo.exe cheminSource cheminSortie typeDeFichier
    ex : typeDeFichier = *.tch // ce qui veut dire de me copier tout les fichiers dont l'extension est tch

    moi ce que je veut c'est lancer ce fichier "hobo.exe" avec les paramètres "cheminSource cheminSortie typeDeFichier".
    De plus les chemins ne sont pas codés en dur mais détectés au démarrage de mon projet (cheminSource) et aussi via saisie de l'utilisateur (cheminSortie).
    Si tout semble bien marcher c'est que vous avez oublié quelque chose !

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut
    Bon j'ai résolu mon problème en utilisant les nom courts de dossiers.

    Voilà la fonction que j'ai faites pour :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    // fonction de transformation des noms long de dossier en noms court
            public string shortPath(string path)
            {
                string finalPath = "";
                string[] tabNom = path.Split('\\'); // on sépare tout ce qui se trouve entre des "\"
     
                // ici on détecte les noms long, c'est à dire > 6
                if (tabNom != null)
                {
                    for (int i = 0; i < tabNom.Length; i++)
                    {
                        if (tabNom[i].Length > 6) // si le nom est > 6 
                        {
                            tabNom[i] = String.Concat(tabNom[i].Split(' ')); // permet de supprimer les espaces entre les mots du nom du répertoire
                            tabNom[i] = tabNom[i].Substring(0, 6) + "~1"; // alors on le coupe et on ajoute ~1
                        }
                    }
                }
     
                // ici on reconstruit le chemin avec les nom cours
                foreach (string s in tabNom)
                {
                    if(s != "")
                        finalPath += s + "\\";
                }
     
                return finalPath;
            }
    bon y a encore des bricoles à faire pour qu'il n'y ai aucun cas particulier comme les accents et je ne gère pas si 2 dossiers porte le même nom court.
    Si tout semble bien marcher c'est que vous avez oublié quelque chose !

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    L'espace System.IO propose pas mal de fonctions managées pour déplacer les fichiers.

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par Kaidan Voir le message
    L'espace System.IO propose pas mal de fonctions managées pour déplacer les fichiers.
    Certes mais en propose t'il pour copier des fichier en cours d'utilisation ?
    Je n'en suis pas sur.
    Si tout semble bien marcher c'est que vous avez oublié quelque chose !

  10. #10
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 206
    Points : 28 131
    Points
    28 131
    Par défaut
    Tu parts du principe que ton nom court se terminera par ~1, comme je l'ai expliqué plus haut, absolument rien ne te garantie que ton nom court se terminera par ~1. Si c'est vrai la plupart du temps, ce n'est pas obligatoire.

    Une chose qui n'a pas été précisé aussi, c'est que les noms court peuvent ne pas être renseignés sur les fichiers ou dossiers, ce n'est pas une information obligatoire.

    De plus, je ne comprend pas en quoi le 1er code que tu donne (celui que j'ai testé) ne convient pas.
    As-tu au moins testé en remplaçant test.bat par hobo.exe dans le code que j'ai testé ????
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par sevyc64 Voir le message
    Tu parts du principe que ton nom court se terminera par ~1, comme je l'ai expliqué plus haut, absolument rien ne te garantie que ton nom court se terminera par ~1. Si c'est vrai la plupart du temps, ce n'est pas obligatoire.
    t'en fais pas pour ça je pense avoir trouvé comment faire.

    Citation Envoyé par sevyc64 Voir le message
    Une chose qui n'a pas été précisé aussi, c'est que les noms court peuvent ne pas être renseignés sur les fichiers ou dossiers, ce n'est pas une information obligatoire.
    En même temps mon problème c'est les espaces donc si le nom du dossier est court je ne fais aucune transformation... Ah mince j'ai pas testé si le répertoire est court mais contient des espaces et là ça marche plus...
    Et l'algo m'a l'air différent :
    pour un répertoire "t a" (avec un espace entre le "t" et le "a") j'ai le nom court : "TA01B9~1" gulp...
    bon j'ai trouvé ça en utilisant la commande dir /x dans une invite de commande.

    Citation Envoyé par sevyc64 Voir le message
    De plus, je ne comprend pas en quoi le 1er code que tu donne (celui que j'ai testé) ne convient pas.
    As-tu au moins testé en remplaçant test.bat par hobo.exe dans le code que j'ai testé ????
    c'est simple ça marche pas a cause des ESPACES !!
    ex : C:\Documents and Settings sera traduit en C:\Documents

    et si je met des " cela marche toujours pas :
    "C:\Documents and Settings\toto" "C:\Documents and Settings\bozo"
    sera traduit en :
    C:\Documents and Settings\toto" C:\Documents
    et
    C:\Documents and Settings\Administrateur\Mes documents\Visual Studio 2008\Projects\MonProjet\MonProjet\bin\Debug\and
    là si tu voit pas ce que c'est le and à la fin ben c'est le and de "Documents and Settings"

    Bon demain, enfin aujourd'hui à une heure normale, j'essaierai de mettre les chemins en dur (comme t'as fait) pour voir ce que ça donne.
    Si tout semble bien marcher c'est que vous avez oublié quelque chose !

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut
    Bon j'ai essayé en mettant les chemins en dur et ça marche à 50% :
    les chemins sont correctement détecté dans le logiciel mais la copie ne se fait pas. Y a un truc qui me dépasse quand même.

    Edit : oh la loose, j'y crois pas...
    je vient de trouver pourquoi ça marchait pas en utilisant le chemin dynamique (celui que je voulais) :
    voilà ce que j'avais quand je laissais mon projet saisir le répertoire temporaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "\"C:\\Documents and Settings\\Administrateur\\Local Settings\\Temp\\\" \"C:\\Documents and Settings\\Administrateur\\Bureau\\test\" fla22EB.tmp"
    Et voilà ce qu'il se passait quand je mettais ces même chemin en dur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "\"C:\\Documents and Settings\\Administrateur\\Local Settings\\Temp\" \"C:\\Documents and Settings\\Administrateur\\Bureau\\test\" fla22EB.tmp"
    Alors j'espère que tu as vu là où il y a une différence :
    c'est à la fin du répertoire temporaire quand je laisse mon projet le saisir en faisant un "Path.GetTempPath()" il me met un \ à la fin du répertoire et c'est ce \ qui empêchait le bon fonctionnement de tout le reste.
    Je l'enlève avec un substring et mon projet fonctionne à merveille sans utiliser les noms courts de dossier.

    Bon j'ai appris pas mal de chose pour un petit logiciel qui récupère le contenu vidéo et audio d'internet lorsque celui ci est en streaming. Oui je sais il y a des plugins mozilla qui le font mais je voulais voir si je pouvais le faire en c#...

    Salut.
    Si tout semble bien marcher c'est que vous avez oublié quelque chose !

  13. #13
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 206
    Points : 28 131
    Points
    28 131
    Par défaut
    C'est un problème classique dans la gestion des dossiers, le \ final présent ou pas.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Généralités] Jauge de progression au lancement d'une commande dos
    Par Jeje9 dans le forum WinDev
    Réponses: 5
    Dernier message: 22/06/2012, 15h25
  2. Problème pour lancer une commande DOS
    Par groslou2 dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 16/03/2011, 15h38
  3. Impersonification pour le lancement d'une commande
    Par yridwenn dans le forum Windows Forms
    Réponses: 0
    Dernier message: 06/07/2009, 15h06
  4. [MS-DOS] Une commande DOS pour activer les mises à jour auto
    Par Furius dans le forum Scripts/Batch
    Réponses: 20
    Dernier message: 02/12/2005, 16h21

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