2014-01-20 3 views
0

저는 Windows 7x64 및 Excel 2010x32를 사용하고 있습니다. 나는 명령 프롬프트 프로세스가 끝나기를 기다리는 Microsoft function 인 ExecCmd를 사용하여 vba를 통해 32 비트 dos 프로그램 (Fortran으로 작성)을 호출합니다. 명시 적으로 프로그램 경로와 입력 파일과 출력 파일의 경로를 포함하는이 함수에 명령 줄을 보냅니다.쉘을 통해 프로그램 실행

내 PC와 동일한 소프트웨어 (OS 및 Office)를 실행하는 회사 PC에서 정상적으로 실행되며 C : 드라이브에 대한 일반적인 액세스 권한이 있습니다.

C : 드라이브에 대한 일반 액세스 권한이없는 다른 회사의 PC에서는 이것이 작동하지 않습니다. 즉 dos 프로그램이 출력 파일을 생성하지 않습니다. 이 PC에서는 명령 프롬프트에서 수동으로 프로그램을 실행할 수 있습니다. 이 명령 프롬프트를 호출하면 Excel VBA를 통해 작동하지 않습니다.

이상한 점은 명령 줄 시작 부분에 "cmd.exe/c"를 추가하여 이러한 프로그램 중 하나를 성공적으로 실행할 수 있다는 것입니다. 명령 프롬프트 (!)에서 명령 프롬프트를 실행하는 것으로 보입니다. 덧붙여 말하면, 다른 프로그램은이 PC에서 vba를 통해 전혀 작동하지 않습니다. 나는 다른 직원들에게 일하는 것을 제공 할 수 있어야한다.

여기에서 어떤 일이 일어나고 있는지 알려주고 해결 방법을 제안 할 수 있습니까? 나는 약간의 코드를 지나칠 수 있었지만 위의 내용은 자명하다.

+0

나는 네가 질문을 편집하고 가지고있는 코드의 핵심 줄을 붙여야한다고 생각합니다. 시도했다. –

+0

명령 프롬프트에서 관리자 권한을 가질 수 있으며 Excel에서 실행할 때 부족한 명령 프롬프트 일 수 있습니다. 잘못된 작업 디렉토리와 관련이있을 수도 있습니다. 너무 추측 하기엔 너무 어렵습니다. –

+0

"32 비트 DOS 프로그램"이라는 용어는 모순점이 아니지만 그것이 의미하는 바가 아닐 것이라고 생각합니다. 한 가지로 DOS 프로그램은 64 비트 버전의 Windows에서 실행되지 않습니다. 32 비트 명령 줄 프로그램을 의미합니까? –

답변

4

콘솔 셸과 명령 셸을 혼동하는 것입니다. 이러한 맥락에서 구별이 중요합니다.

콘솔 모드 프로그램 (일명 "명령 줄 프로그램")은 콘솔 창을 통해 입력과 출력을 제공해야합니다. 콘솔 모드 프로그램이 GUI 프로그램에서 시작되면 Windows는 자동으로 콘솔 창을 만듭니다 (별도의 지시가없는 한).

명령 셸 (별칭 "명령 프롬프트")은 콘솔 모드 프로그램 인 cmd.exe입니다.

여기서 중요한 점은 모든 콘솔 창의 인스턴스가 cmd.exe 인 것은 아닙니다. 콘솔 모드 프로그램이 GUI 프로그램에서 시작되면 Windows는 자동으로 콘솔 창을 생성하지만 이 아니기 때문에cmd.exe의 인스턴스를 자동으로 생성하지 않습니다. cmd.exe에 명령을 전달하려면 직접 처리해야하며 그렇지 않은 경우 런타임 라이브러리 루틴을 사용해야합니다.

ExecCmd이 작업을 수행하지 않습니다. 프로그램을 직접 실행합니다. 따라서 cmd /c <command>ExecCmd으로 전달하는 것은 "명령 프롬프트 내에서 명령 프롬프트를 실행하는 것"이 ​​아닙니다. cmd /c이 없으면 명령 쉘 명령을 실행하지 않고 실행 파일을 시작하는 것입니다.

전달중인 명령을 명령 셸에 제공해야하는 이유는 여러 가지가 있습니다. 예를 들어 :

  • 이 될 수있는 내장 dir 또는 유일한 명령 쉘 내에 존재 type 같은 명령;

  • 리디렉션 연산자 또는 파이프 라인 연산자 또는 환경 변수 대체가 포함될 수 있습니다.

  • 실행 파일이 아닌 스크립트 일 수 있습니다.

다른 경우가 있습니다. ExecCmd으로 전달되는 명령 줄을 표시하면보다 구체적인 조언을 제공 할 수 있습니다. (일부 컴퓨터에서 같은 명령 행이 작동하고있는 것은 당황 스럽지만 자세한 정보 없이는 해결할 수 없습니다.)

+0

Thanks Harry. 이 사실을 알고 싶습니다. 중요한 것은 cmd.exe를 호출하고 호출하지 않는 것이 프로그램에 전달 된 명령 줄의 길이에 차이가 있다는 것입니다. 출력을 구문 분석 할 수 없습니다. 파일 이름이 특정 길이 이상인 경우 파일 이름. –

관련 문제