현재 작업 디렉터리 cmd.exe
문제
어떻게 검색할 수 있습니의 현재 작업 디렉토리 cmd.exe?
이 가능한 것 같습니다.예를 들어 사용 ProcessExplorer 선택 CMD.exe 서 마우스 오른쪽 버튼으로 클릭하고 속성을 이미지 tab,"현재 디렉토리"relects 디렉토리 설정을 사용하여 CD 또는 CHDIR 명령입니다.
나는 보았다.NET 프로세스 및 ProcessStartInfo 클래스(ProcessStartInfo.WorkingDirectory 반환 항상"")및 수 없는 것을 찾을 결정하는 방법이다.아무것도 물론 이와 관련된 눈에 띈다.
예로 내가 찾는 프로그래밍 방식으로 할 수있는 무언가를 말:과정입니다.GetCurrentWorkingDirectory(processID)는 processID 윈도우 프로세스 ID 의 다른 프로세스를 실행.
이 있 솔루션 WinAPI 또는.NET?
[Update]
이유에 대한 이 질문:
내가 사용하는"명령 프롬프트 탐색에 대한"동의한 경우를 제외하고 내가"CD"새로운 디렉토리,현재는 탐색기지 않도 변경됩니다.(예:동기화 1 는 방법 탐색기에서 명령 프롬프트).내가 찾는 이 2 가지의 방법.
해결책
테스트되지 않은 접근법 :
getThreadStartInformation ()을 사용하여 버퍼의 주소를 찾은 다음 GetCurrentDirectory를 사용하여 채우는 dllmain으로 dll을 만듭니다. 이 두 기능은 모두 kernel32에 있기 때문에 이것은 괜찮습니다. 항상 존재합니다. 성공/실패를 반환하려면 몇 가지 구조가 필요합니다.
- cmd.exe 프로세스를 처리하십시오.
- 거기에 약간의 기억을 할당합니다 (virtualallocex)
- 메모리에 DLL의 경로를 넣으십시오. (WriteProcessMemory)
- dll을 cmd.exe 주소 공간에로드하십시오. (Loadlibrary의 진입 점을 가진 CreateremoteThread, 논쟁은 이전에 할당 한 기억입니다.)
- waitforsingleobject 다음 getExitcodeThread ()가 CMD.exe 프로세스에서 DLL의 Hmodule을 제공합니다.
- readProcessMemory 현재 디렉토리를 얻으려면.
- CMD.EXE 주소 공간에서 DLL을 내립니다. 프리 브리 브리의 진입 점이있는 크리터 레모 테 스레드, 논쟁은 hmodule입니다.
- DLL이 언로드 될 때까지 대기하기 위해 WaitforsingleObject.
광범위한 스케치 : 세부 사항은 운동으로 남았습니다! 위험 : CMD.EXE 주소 공간에 메모리를 할당하고 상태를 변경합니다. dllmain에서 불리는 기능에주의를 기울여야합니다.
다른 팁
배치 파일의 % CD % 변수를 의미합니까?
이와 같이:
set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory
노력하다 에코 %CD % 명령 프롬프트에서. :)
이것이 당신이 필요로하는 것입니다. 여기 있습니다. 여기 있습니다. PowerShell 수행 할 기능 :
$(get-location)
도움이 되었기를 바랍니다.
나는 그것을 모두 찾았다 여기.
아마도 이거 Sysinternals 포럼의 포럼 항목 솔루션에 대한 힌트를 포함합니다. 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.
이 CodeProject 기사 "원격 프로세스의 환경 문자열을 읽으십시오"유용 할 수 있습니다.
업데이트: 이 지 솔루션 설명을 참조하십시오하는 이 대답: "로 Janm 말 .모듈[0].름(나 MainModuile.FileName)제공 위치의 실행 실행 는 과정입니다.내가 찾는 것을 찾기 현재 작업 디렉터리(할 수 있는 를 사용하여 변경 CD 또는 CHDIR 명령)."
당신이 사용할 수 시스템입니다.네임스페이스 진단.여기에 예를 들어 C#콘솔 응용 프로그램입니다.에서 파일 이름은 쉽게 추출할 수 있습니다 경로 정보(시스템입니다.IO.경로...).
당신이 가지고 있는지 확인하십시오 권한(관리자로 실행)이 작업을 수행 할 수 있습니다.
이게 도움이 되었으면 좋겠습니다.기 작동 코드 (테스트):
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);
}
}
}
}
}
여기에서 출력 내 컴퓨터에서(내가 열 네 명령 라인):
체 텍스트 http://img236.imageshack.us/img236/3547/processworkingdirvn4.png
이 간단한 환경 속성을 시도하십시오.
환경 .CurrentDirectory ()
보다 내 대답 비슷한 질문에 (혼자). 프로세스 환경 변수를 읽기 위해 명령 줄 유틸리티와 C# 래퍼를 작성했습니다. 내 질문 (Java에 대한 현재 DIR GETCING)을 위해 Catalina_Base 디렉토리를 읽습니다.
이것이 CMD.exe에 직접 적용되는지 확실하지 않습니다. 코드 프로젝트 기사에 제공된 유틸리티는 CMD.exe와 함께 작동하지 않았습니다.