1
votes

Répertoire actuel dans DOSBox [Facultatif: Utilisation de TURBO C]

Je souhaite exécuter une commande dans un répertoire spécifique, puis revenir en arrière. (Il y a une raison à cela [validité des paramètres ...]).

J'ai essayé de le faire dans un fichier batch pour DOSBox ...

@echo off
cd>cd.cd
cd %mypath%
dosomething 1 2 3
::I am not sure....
cd (type cd.cd) 

Boucle% CD% , % dI , FOR rien ne fonctionne dans DOSBox ...

J'ai écrit un programme C mais je n'ai pas pu trouver une fonction qui renvoie le répertoire actuel pour TURBO C 16 bits ...

Quelqu'un peut-il m'aider s'il vous plaît?


0 commentaires

3 Réponses :


2
votes

% CD% est une variable dans Windows cmd , vous ne pouvez donc pas l'utiliser sous MS-DOS. Vous pouvez contourner ce problème en stockant la sortie du répertoire actuel de la commande cd sans aucun paramètre dans une variable en redirigeant la sortie de la commande vers un fichier puis lit le fichier à partir du disque

  • Préparez un fichier contenant uniquement @set cd = sans aucune nouvelle ligne. Il peut être créé sous DOS en appuyant sur Ctrl + Z puis Entrée tout en exécutant COPY CON . Appelons-le init.txt
  • Ensuite, chaque fois que vous souhaitez exécuter le répertoire courant

    cd >cd.txt
    copy init.txt+cd.txt setcd.bat
    setcd
    
  • La dernière commande enregistrera le répertoire courant dans la variable % CD%

 Obtenir le répertoire actuel


9 commentaires

Existe-t-il un moyen d'ajouter une chaîne sur la même ligne DOS?


En fait, ma DOSBox se bloque sur copy con pour une raison quelconque.


@NephewofStackoverflow il ne se bloque pas. Il attend que vous entriez le contenu car CON < / code> est le clavier . Voir copy con . C'est la raison pour laquelle vous ne pouvez pas créer un dossier nommé «CON» sous Windows (facilement)


Oh ... c'était assez inattendu 😅. Y a-t-il un moyen par lequel nous pouvons écrire sur la même ligne au lieu de deux commandes différentes?


quelque chose comme @echo set cd = (somespecialcharacter)> mp puis @cd >> mp


@NephewofStackoverflow, il vous suffit de préparer init.txt une fois et de l'utiliser pour toujours. Pas besoin de se soucier de ce fichier. echo écrit une nouvelle ligne pour que vous ne puissiez pas utiliser echo pour faire cela


Y a-t-il un moyen par lequel je peux créer un script qui s'exécute après chaque changement de CD ou de lecteur?


créez probablement un fichier batch qui appelle le CD et fait tout ce que vous voulez, et évitez d'utiliser complètement le CD d'origine. Mais cela sort du cadre de cette question. Vous devriez en demander un autre


@phuclv: cela semble en quelque sorte familier



1
votes

Pour obtenir le répertoire actuel par programme à partir de Turbo C, vous devez lire la structure de répertoire actuelle (CDS ) . Le répertoire courant est le premier champ de 67 octets contenant une chaîne terminée par un nul

Pour obtenir l'adresse du premier CDS, vous utilisez la fonction 52h de DOS int 21h (set AH = 52h). Le CDS suivant peut être obtenu en ajoutant un décalage à la première adresse. Pour plus d'informations, lisez


0 commentaires

-1
votes
  1. La méthode de commande (première réponse de @ phuclv) (Inconvénient: un fichier permanent doit être maintenu)

  2. La méthode d'assemblage (première réponse de @ phuclv) (Inconvénient: je ne trouve pas vraiment de moyen d'effectuer des appels système en assembleur, ce serait génial si quelqu'un pouvait fournir un exemple et demandez à un utilisateur privilégié de modifier cette réponse pour supprimer cette information)

  3. La méthode TURBOC (Puisque j'écrivais de toute façon du code C90, j'ai juste utilisé la façon dont j'allais de toute façon.)

Voici l'exemple de code C90 qui peut être utilisé pour obtenir et effectuer des opérations dans TURBOC3:

#include<stdio.h>
//#include<string.h>

void main()
{

  char path[128];
  system("cd>__p_");
  fscanf(fopen("__p_","r"),"%[^\n]",path);
  remove("__p_");

  //path variable/array/pointer contains your current path.

  //printf(path);

  //strcat(command,path); //char command[128]="cd ";
  //system(command); 

}