Question

Comment puis-je récupérer le répertoire de travail actuel de cmd.exe?

Cela semble possible. Par exemple, en utilisant ProcessExplorer, sélectionnez CMD.exe, cliquez avec le bouton droit de la souris sur Propriétés, sur l’onglet Image, " Répertoire actuel " renvoie le jeu de répertoires à l’aide des commandes CD ou CHDIR.

J'ai consulté les classes .NET Process et ProcessStartInfo (ProcessStartInfo.WorkingDirectory renvoie toujours "") et ne parais pas en mesure de le déterminer. Rien à PInvoke ne se démarque non plus.

Par exemple, je cherche par programmation à pouvoir dire quelque chose comme: Process.GetCurrentWorkingDirectory (processID) où processID est un ID de processus Windows d'un autre processus en cours d'exécution.

Existe-t-il une solution, WinAPI ou .NET?

[Mise à jour]

Raison de poser cette question:

J'ai utilisé la "Barre d'explorateur d'invite de commande". pendant un certain temps et c’est génial, sauf si je "CD" Dans un nouveau répertoire, la fenêtre de l'explorateur actuelle ne change pas non plus. (c’est-à-dire que la synchronisation ne se fait que dans un sens, de l’explorateur à l’invite de commande). Je cherche à faire cela 2 voies.

Était-ce utile?

La solution

Non testé, une approche possible:

Créez une DLL avec un objet DllMain qui utilise GetThreadStartInformation () pour rechercher l'adresse du tampon, puis utilise GetCurrentDirectory pour le remplir. Cela devrait être OK, car ces deux fonctions sont dans kernel32, qui est toujours présent. Vous aurez besoin d’une structure pour renvoyer la réussite / l’échec.

  1. Obtenez un descripteur du processus cmd.exe.
  2. Allouez de la mémoire à cet emplacement (VirtualAllocEx)
  3. Mettez le chemin de votre DLL dans la mémoire. (WriteProcessMemory)
  4. Chargez votre dll dans l'espace d'adressage cmd.exe. (CreateRemoteThread avec un point d'entrée de LoadLibrary, l'argument est la mémoire allouée précédemment.)
  5. WaitForSingleObject suivi de GetExitCodeThread (), vous donne le HMODULE de votre DLL dans le processus cmd.exe.
  6. ReadProcessMemory pour obtenir le répertoire actuel.
  7. Déchargez votre dll de l'espace d'adressage cmd.exe. CreateRemote Thread avec un point d’entrée de FreeLibrary, l’argument est le HMODULE.
  8. WaitForSingleObject attend le déchargement de la DLL.

Large sketch: Les détails sont laissés comme un exercice! Risques: alloue de la mémoire dans l'espace d'adressage cmd.exe et change son état. Il faut faire attention avec les fonctions appelées dans DllMain.

Autres conseils

Voulez-vous dire la variable% CD% dans un fichier de commandes?

Comme ceci:

set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory

Essayez echo% CD% dans une invite de commande. :)

Comme c'est ce dont vous avez besoin, une fonction PowerShell vous permet de le faire:

$(get-location)

J'espère que cela vous aidera.

J'ai tout trouvé dans ici .

Peut-être que cette entrée du forum sur le forum Sysinternals contient un indice pour le Solution. Recherchez ceci dans la fonction GetProcessStrings:

// Get Command Line Block

// At offset 0x00020498 is the process current directory followed by

// the system PATH. After that is the process full command line, followed

// by the exe name and the windows station it's running on.

Cet article CodeProject & Lecture des chaînes d'environnement du processus distant " pourrait être utile aussi.

  

MISE À JOUR: cette solution n'est pas , voir les commentaires sur cette réponse: "Comme le disait Janm   .Modules [0] .FileName (ou   MainModuile.FileName) donne le   emplacement de l'exécutable en cours d'exécution dans   ce processus. Je cherche à trouver le   répertoire de travail actuel (qui peut être   changé avec le CD ou CHDIR   commandes). "

Vous pouvez utiliser Espace de noms System.Diagnostics . Voici un exemple d’application console C #. A partir du nom de fichier, vous pouvez facilement extraire les informations de chemin (System.IO.Path ...).

Vous devez vous assurer d’avoir les autorisations nécessaires (exécuter en tant qu’administrateur).

J'espère que ça aide. Voici le code de travail (testé):

using System;
using System.Diagnostics;
using System.IO;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] procList =  Process.GetProcessesByName("cmd");

            string sFileName;

            for (int i = 0; i < procList.Length; i++ )
            {
                Console.Write(procList[i].Id);
                Console.Write(" ");

                try
                {
                    sFileName = procList[i].Modules[0].FileName;
                    Console.Write("(");
                    Console.Write(Path.GetFileName(sFileName));
                    Console.Write("): ");
                    Console.WriteLine(Path.GetDirectoryName(sFileName));
                }
                catch (Exception ex)
                {
                    // catch "Access denied" etc.
                    Console.WriteLine(ex.Message);
                }


            }

        }
    }
}

Voici la sortie de ma machine (j'ai ouvert quatre lignes de commande):

texte alternatif http://img236.imageshack.us/img236/3547/processworkingingdirvn4 .png

Essayez cette propriété d'environnement simple:

Environment.CurrentDirectory ()

Voir ma réponse à une question similaire (de ma part). J'ai écrit un utilitaire de ligne de commande et un wrapper C # pour lire les variables d'environnement de processus. Pour ma question (obtenir le répertoire actuel de java), je lis simplement le répertoire catalina_base.

Je ne sais pas si cela s'applique directement à cmd.exe. L'utilitaire fourni dans l'article de Code Project n'a pas fonctionné avec cmd.exe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top