net exist create commands .net winapi directory cmd

.net - exist - Obtenga el directorio actual de trabajo para cmd.exe



exist directory c# (7)

¿Cómo puedo recuperar el directorio de trabajo actual de cmd.exe?

Esto parece posible. Por ejemplo, usando ProcessExplorer, seleccione CMD.exe, haga clic con el botón derecho, propiedades, pestaña Imagen, "Directorio actual", selecciona el directorio establecido usando los comandos CD o CHDIR.

He observado las clases .NET Process y ProcessStartInfo (ProcessStartInfo.WorkingDirectory siempre devuelve "") y parece que no se puede encontrar una forma de determinarlo. Tampoco se destaca nada en PInvoke .

Como ejemplo, quiero programar algo como: Process.GetCurrentWorkingDirectory (processID) donde processID es una identificación de proceso de Windows de otro proceso en ejecución.

¿Hay alguna solución, WinAPI o .NET?

[Actualizar]

Motivo para hacer esta pregunta:

He usado la "Barra de comandos del Explorador de comandos" durante un tiempo y es genial, excepto que si "CD" a un nuevo directorio, la ventana actual del Explorador tampoco cambia. (es decir, Sync está solo a 1 camino del Explorador al indicador de comando). Estoy buscando hacer esto de 2 maneras.


No probado, un posible enfoque:

Cree una DLL con un DllMain que use GetThreadStartInformation () para buscar la dirección del búfer y luego use GetCurrentDirectory para completarla. Esto debería estar bien, porque ambas funciones están en kernel32, que siempre está presente. Necesitará tener alguna estructura allí para devolver el éxito / fracaso.

  1. Obtenga un control sobre el proceso cmd.exe.
  2. Asigna algo de memoria allí (VirtualAllocEx)
  3. Ponga la ruta a su DLL en la memoria. (WriteProcessMemory)
  4. Cargue su dll en el espacio de direcciones cmd.exe. (CreateRemoteThread con un punto de entrada de LoadLibrary, el argumento es la memoria que asignó anteriormente).
  5. WaitForSingleObject seguido de GetExitCodeThread (), le proporciona el HMODULE de su DLL en el proceso cmd.exe.
  6. ReadProcessMemory para obtener el directorio actual.
  7. Descarga tu dll desde el espacio de direcciones cmd.exe. CreateRemote Thread con un punto de entrada de FreeLibrary, el argumento es HMODULE.
  8. WaitForSingleObject para esperar la descarga de la DLL.

Boceto amplio: detalles dejados como un ejercicio! Riesgos: Asigna memoria en el espacio de direcciones de cmd.exe, cambia su estado. Se debe tener cuidado con las funciones llamadas en DllMain.


¿Te refieres a la variable% CD% en un archivo por lotes?

Me gusta esto:

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

Pruebe echo% CD% en un símbolo del sistema. :)

Bueno, como esto es lo que necesita, aquí hay una función de PowerShell para hacerlo:

$(get-location)

Espero que esto ayude.

Lo encontré todo desde aquí .


Tal vez esta entrada al foro en el Sysinternals Forum contenga una pista sobre la solución. Busque esto en la función 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.

Este artículo de CodeProject " Leer cadenas de entorno del proceso remoto " podría ser útil también.


ACTUALIZACIÓN: Esta no es la solución, ver los comentarios a esta respuesta: "Como dijo Janm .Modules [0] .FileName (o MainModuile.FileName) da la ubicación del ejecutable que se ejecuta en ese proceso. Estoy buscando para encontrar el directorio de trabajo actual (que se puede cambiar usando los comandos CD o CHDIR). "

Podría usar el espacio de nombres System.Diagnostics . Aquí un ejemplo como la aplicación de consola C #. Desde el nombre de archivo puede extraer fácilmente la información de ruta (System.IO.Path ...).

Asegúrate de tener los permisos (ejecutar como administrador) para hacer esto.

Espero que esto ayude. Aquí está el código de trabajo (probado):

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

Aquí está la salida de mi máquina (he abierto cuatro líneas de comando):

texto alternativo http://img236.imageshack.us/img236/3547/processworkingdirvn4.png


Pruebe esta propiedad de entorno simple:

Environment.CurrentDirectory ()


string workingDirectory = Environment.SystemDirectory;


Ver mi respuesta a una pregunta similar (por mí mismo). Escribí una utilidad de línea de comandos y un contenedor C # para leer las variables de entorno del proceso. Para mi pregunta (obtener el directorio actual para java), simplemente leí el directorio catalina_base.

No estoy seguro de si esto se aplica directamente a cmd.exe. La utilidad proporcionada en el artículo de Code Project no funcionó con cmd.exe.