문제

어떻게 검색할 수 있습니의 현재 작업 디렉토리 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에 있기 때문에 이것은 괜찮습니다. 항상 존재합니다. 성공/실패를 반환하려면 몇 가지 구조가 필요합니다.

  1. cmd.exe 프로세스를 처리하십시오.
  2. 거기에 약간의 기억을 할당합니다 (virtualallocex)
  3. 메모리에 DLL의 경로를 넣으십시오. (WriteProcessMemory)
  4. dll을 cmd.exe 주소 공간에로드하십시오. (Loadlibrary의 진입 점을 가진 CreateremoteThread, 논쟁은 이전에 할당 한 기억입니다.)
  5. waitforsingleobject 다음 getExitcodeThread ()가 CMD.exe 프로세스에서 DLL의 Hmodule을 제공합니다.
  6. readProcessMemory 현재 디렉토리를 얻으려면.
  7. CMD.EXE 주소 공간에서 DLL을 내립니다. 프리 브리 브리의 진입 점이있는 크리터 레모 테 스레드, 논쟁은 hmodule입니다.
  8. 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와 함께 작동하지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top