Exécuter une commande dos sans quitter son application sous windows

Soyez le premier à donner votre avis sur cette source.

Vue 32 743 fois - Téléchargée 1 161 fois

Description

Copie un fichier en passant par la commande Copy du DOS, en utilisant un fichier batch.
Utile éventuellement (à tester) si ce fichier est verrouillé sous Windows (s'il est utilisé par une autre appli, par exemple).

Ce code vient en réponse (?) à un problème évoqué sur le forum.

Mais ça ouvre pas mal d'autres possibilités, à vous de juger...

Pour faire un fichier batch, c'est très simple:
- ouvrir Notepad,
- écrire les commandes (toutes les commandes DOS sont acceptées),
- l'enregistrer avec l'extension ".bat".

Pour la syntaxe, se référer à son vieux manuel de DOS.

L'idée m'était venue pour concevoir une interface qui lance un "vieux" jeu tournant sous Dos, en l'occurence "Duke Nukem 3D". Ce programme lance également les niveaux conçus avec l'éditeur de niveaux fourni avec ce jeu.
Clin d'oeil complice à ceux qui auraient passé des nuits blanches à pratiquer "build", se heurtant à l'incompréhension totale de leur entourage...
Si mon "DukeMap Launcher" intéresse quelqu'un, je balancerai le source.

Pour en revenir au fichier batch utilisé ici, la syntaxe est des plus simples :

@ECHO OFF
CLS
REM (%1: origine, %2: destination)
COPY /y %1 %2
REM (EXIT permet de sortir du DOS)
EXIT

COPY est suivi de l'option "/y" indispensable puisqu'elle évite la demande de confirmation de copie par Dos, ensuite l'argument "%1" est le chemin et le nom du fichier à copier, l'argument "%" le chemin et le nom du fichier qui sera copié.

Les noms longs sont acceptés, à ma grande surprise (Destination.txt)...

La démonstration dans le zip est minimale, elle se contente de copier le fichier "Origine.txt" dans le même répertoire sous le nom de "Destination.txt". A vous de développer , je n'ai pas le temps pour l'instant ;)

AUTRE POSSIBILITÉ (ajout du 12-06-04)

Si vous ne désirez pas profiter des joies de la programmation batch sous DOS, il existe une autre manière de procéder beaucoup plus simple à mettre en oeuvre, utilisant cette fois WinExec.

Voir le code rajouté ci-dessous.

P-S: ATTENTION AUX ESPACES, ils ont leur importance dans les commandes DOS.
Le risque étant que ça ne fonctionne pas...

Source / Exemple :


uses ShellApi;

procedure CopyFileDos(Source, Destination: String);
begin
  ShellExecute(
    Application.Handle,
    'Open',
    PChar(CheminAppli + '\COPYDOS.BAT'),  // lancement de COPYDOS.BAT
    PChar(Source + ' ' + Destination),    // 2 paramètres séparés par un espace
    '',
    SW_HIDE
    );
end;

Voir le zip !

AUTRE POSSIBILITÉ (plus simple à mettre en oeuvre...)

procedure CopyFileDos(Source, Destination: String);
begin
  WinExec(
    PChar('COMMAND.COM /K COPY /y ' + Source + ' ' + Destination),
    SW_HIDE
    );
end;

Conclusion :


Bonne prog' !

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

DRJEROME
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015
-
ça va tu me rassures je passais pour un vieux crouton sur le forum (mais bon je suis encore jeune et toi aussi malgrè notre différence d'âge lol)...mais bon les 2 méthodes marchent

DrJerome DorotheeJ JROD ;)
japee
Messages postés
1708
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
5 octobre 2019
1 -
Quoi d'neuf, docteur ? ;)
Lien intéressant, je ne connaissais pas bien que je sois un adepte de Google...
Je crois savoir que WinExec est adapté aux applications 16 bits, et qu'il vaut mieux, si c'est possible, utiliser ShellExecute.
Simplement, malgré ma résignation à vivre avec mon temps, je n'ai pas trouvé, dans le contexte, comment utiliser ShellExecute sans passer par un fichier batch (ce qui est très "rétro", tu en conviendras, lol...).
DRJEROME
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015
-
je te laisse la référence de la discussion (si tu veux voir le bla-bla à 3cts d'euro !):

http://www.phidels.com/php/forum/forum.php3?forumtable=posts&mode=showpost&postid=67024
_________________________________________________

Sinon une méthode pour créer un disque virtuel (ou en tout cas un pseudo-disque virtuel) par la méthode utilisant Shellexecute :

http://www.phidels.com/php/forum/forum.php3?forumtable=posts&mode=showpost&postid=67616

DrJerome DorotheeJ JROD (mon pseudo est JROD dans les références citées)
DRJEROME
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
5 février 2015
-
Oui nous en avions déjà discuté sur d'autres forums, j'avais donné la même fonction que toi toutefois on m'a reproché d'utiliser la fonction WinExec, on m'a dit qu'il valait mieux utilise Shellexecute (use=Shellapi) d'où
____________________________________________________________
ShellExecute(Handle,'open','cmd.exe','/C copy C:\vu\vumeter.rtf C:\Windows',0,SW_HIDE);
____________________________________________________________

l'exemple, ci-dessus, copie le fichier vumeter.rtf du dossier C:\vu vers C:\Windows

Pourquoi ShellExecute est meilleur que WinExec ?

Il semblerait que WinExec a été conservé pour compatibilité (on m'a dit : "il faut vivre avec son temps !")

Alors j'ai suivi la nouvelle vague des utilisateurs de ShellExecute au détriment de WinExec... modernité oblige, soit-disant !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.