Frage

Wie kann ich das aktuelle Arbeitsverzeichnis von cmd.exe abrufen?

Dies scheint möglich. Zum Beispiel unter Verwendung von Process Wählen CMD.exe die rechte Maustaste, Eigenschaften, Registerkarte Bild „Aktuelles Verzeichnis“ relects das Verzeichnis eingestellt, um die CD oder CHDIR Befehle.

Ich habe auf dem .NET-Prozess gesucht und Process Klassen (ProcessStartInfo.WorkingDirectory gibt immer „“) und können nicht scheinen, einen Weg zu bestimmen, dies zu finden. Nichts unter PInvoke steht entweder aus.

Als Beispiel suche ich programmatisch der Lage sein, etwas zu sagen wie: Process.GetCurrentWorkingDirectory (processID), wo processID ist ein Windows-Prozess-ID eines anderen laufenden Prozess.

Gibt es eine Lösung, WinAPI oder .NET?

[Update]

Grund für diese Frage:

Ich habe die „Eingabeaufforderung Explorer Bar“ für eine Weile und es ist toll, außer wenn ich „CD“ in ein neues Verzeichnis, das aktuelle Explorer-Fenster nicht ändert auch verwendet. (Dh die Sync nur 1 Weg von Explorer zum commmand prompt). Ich suche diese 2-Wege zu machen.

War es hilfreich?

Lösung

Ungeprüfte, ein möglicher Ansatz:

Erstellen Sie eine DLL mit einem DllMain, die GetThreadStartInformation () verwendet die Adresse des Puffers zu finden, und verwendet dann GetCurrentDirectory um es zu füllen. Dies sollte in Ordnung sein, weil diese beiden Funktionen in kernel32 sind, die immer vorhanden ist. Sie müssen eine gewisse Struktur haben dort Erfolg / Misserfolg zurück.

  1. Holen Sie sich einen Griff in die cmd.exe Prozess.
  2. Weisen Sie etwas Speicher gibt (VirtualAllocEx)
  3. Setzen Sie den Pfad zu Ihrem DLL in den Speicher. (Write)
  4. Laden Sie Ihre DLL in den cmd.exe-Adressraum. (Create mit einem Eintrittspunkt von Loadlibrary, das Argument ist der Speicher, den Sie früher zugewiesen.)
  5. WaitForSingleObject gefolgt von GetExitCodeThread (), gibt Ihnen die HMODULE Ihrer DLL in dem cmd.exe-Prozess.
  6. Readprocessmemory das aktuelle Verzeichnis zu erhalten.
  7. Entladen Sie Ihre DLL-Datei von dem cmd.exe-Adressraum. Create Gewinde mit einem Eintrittspunkt von Freelibrary, das Argument ist die HMODULE.
  8. WaitForSingleObject für die DLL zu warten, zu entladen.

Broad Skizze: Details als excercise links! Risiken: Ordnet Speicher in der cmd.exe-Adressraum, ändert seinen Zustand. Es muss mit den in DllMain aufgerufenen Funktionen genommen werden.

Andere Tipps

Wollen Sie die% CD% Variable in einer Batch-Datei?

Wie folgt aus:

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

Versuchen Sie echo% CD% in einer Eingabeaufforderung. :)

Nun, wie das ist, was Sie benötigen, ist hier ein Powershell Funktion, es zu tun:

$(get-location)

Hope, das hilft.

Ich fand sie alle von hier .

Vielleicht Forum Eintrag auf dem Sysinternals Forum einen Hinweis auf das enthält Lösung. Geben Sie für diese in der GetProcessStrings Funktion:

// 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.

Dieser Artikel Codeproject " lesen Environment Strings von Remote-Prozess " könnte nützlich zu.

  

UPDATE: Dies ist nicht die Lösung finden Sie in den Anmerkungen zu dieser Antwort: "Wie Janm sagte   .Modules [0] .FileName (oder   MainModuile.FileName) gibt die   Speicherort des ausführbaren Laufes in   dieser Prozess. Ich suche die finden   aktuelles Arbeitsverzeichnis (das kann sein   mit der CD oder CHDIR geändert   Befehle). "

könnten Sie System.Diagnostics Namespace . Hier ist ein Beispiel, wie C # Konsolenanwendung. Aus dem Dateinamen können Sie bequem die Pfadinformationen extrahieren (System.IO.Path ...).

Sie würden sicherstellen, dass die Berechtigungen haben (als Administrator ausgeführt werden), dies zu tun.

Hoffe, das hilft. Hier ist der Arbeits Code (geprüft):

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);
                }


            }

        }
    }
}

Hier ist das der Ausgang auf meinem Rechner (ich habe vier Befehlszeilen geöffnet):

alt text http://img236.imageshack.us/img236/3547/processworkingdirvn4 .png

Versuchen Sie diese einfache Umgebung Eigenschaft:

Environment.CurrentDirectory ()

Siehe meine Antwort auf eine ähnliche Frage (von mir). Ich schrieb ein Kommandozeilenprogramm und C # Wrapper die Prozessumgebungsvariablen zu lesen. Für meine Frage (aktuelles Verzeichnis für Java bekommen), habe ich einfach das CATALINA_BASE Verzeichnis lesen.

Ich bin mir nicht sicher, ob dies direkt auf cmd.exe gilt. Das Dienstprogramm in dem Artikel Code Project vorgesehen ist fehlgeschlagen mit cmd.exe arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top