2009-11-12 4 views
3

현재 델파이 애플리케이션에서 일하고 있습니다. 델파이 애플리케이션에서 perl 스크립트를 실행해야합니다. 더 명확하게하기 위해 수동으로 우리는 유닉스 윈도우에서 펄 스크립트를 실행하고있다. 이제 응용 프로그램에서 perl 스크립트의 실행을 자동화해야합니다. Delphi에서 펄 스크립트를 자동화하는 방법은 무엇입니까?

난에서 ShellExecute하여 시도 : 초간

ShellExecute(Handle, 'open', PChar('C:\loaderperl.bat'), nil, nil, SW_SHOW); 

윈도우 점멸 및 폐쇄. 스크립트가 실행되었는지 여부는 알 수 없습니다.

안녕하세요, 답변 해 주셔서 감사 드리며 늦어서 반갑습니다. 아직도 나는이 자동화에 어려움을 겪고있다. 이제 나는이 과정을 명확하게 설명 할 것이다. 현재 퍼티 창을 열고, 원격 기계에 연결하고 펄 스크립트를 실행한다. perl 스크립트는 차례로 저장 프로 시저를 호출하고 테이블을 업데이트합니다. 이제 버튼을 클릭하여 위에서 설명한 과정을 자동으로 수행하려고합니다. 따라서 버튼을 클릭하면 원격 컴퓨터에 연결 한 다음 펄 스크립트를 실행하는 함수를 호출해야합니다. 내가 너에게 명확한가 ??? 이 문제를 해결하는 데 도움주세요. 델파이에서이 코드가 필요합니다

+0

네이티브 델파이 또는 .NET입니까? 유닉스 창은 무엇을 의미합니까? –

+0

로컬로 또는 원격 시스템에서 실행할지, 그리고 어떤 환경 (CygWin, MSys) 또는 어떤 쉘 (sh, bash, rxvt, ...)에서 사용할지를 명확히 밝혀주십시오. – mghie

+1

중복 된 http://stackoverflow.com/questions/1454501/how-do-i-run-a-command-line-program-in-delphi – mghie

답변

0

rsh 또는 유닉스 창과 관련하여 shellexecute를 사용하여 관련 인수 (perl 인터프리터 + 스크립트 위치 + 이름)를 시작 하시겠습니까?

1

(아래 의견에 대한 응답으로 수정 됨.)

이에 대한 몇 가지 단계가있다 : 첫째, 실제로 스크립트를 실행; 둘째, 성공적으로 실행 한 경우 (이 새로운 프로세스를 시작하는 관리 모두 있고 그 과정이 성공했는지.) 확인

1 부, 스크립트 실행 :

이 델파이 응용 프로그램에서 스크립트를 실행하려면를, "open"동사가있는 ShellExecuteEx을 사용하십시오 (아래 플래그에서 자세한 내용을 참조하십시오). 스크립트가 Perl 실행 파일과 연관되어 있으면 스크립트를 실행하거나 명령 줄 인수로 스크립트와 함께 Perl exe를 실행하십시오.

This article은이 API와 더 간단한 사촌 ShellExecute을 사용하기위한 좋은 출발점처럼 보입니다.

ShellExecute[Ex] 함수는 일반적으로 응용 프로그램이 나중에 메시지 루프를 실행할 것으로 예상합니다. 귀하의 응용 프로그램은 그렇지 않을 것입니다. 사용자가 버튼을 클릭하여 시작하면 응용 프로그램이 유휴 상태가되지만, 어떤 이유로 든 진행되지 않으면 SEE_MASK_NOASYNC 플래그를 전달해야합니다. MSDN에는 많은 정보가 있습니다.

2 부, 성공적으로 실행하고 작업에 성공하는 경우 확인 : 스크립트가 실행 된 경우

보고, 새로운 프로세스가 있다면 당신이 시작된 프로세스에 프로세스 핸들을 취득해야하고, 그것의 종료 코드를 확인하십시오. 작업이 실패 할 경우 스크립트가 0이 아닌 코드를 반환하도록 수정해야합니다. (어떻게 내가 특별히 말할 수 없습니다 펄에 익숙하지 않은 해요,하지만 일반적으로는 "주요"기능 또는 다른 첫번째/시작 함수의 반환 값입니다.) 당신은이 작업을 수행 할 수 있습니다 :

  • SEE_MASK_NOCLOSEPROCESS 플래그를 ShellExecuteEx으로 전달합니다. 성공적으로 과정을 시작하면 그 (이유를 찾을 GetLastError을 확인하세요.), 당신은 프로세스 핸들에 전달하는 구조체의 hProcess 멤버를 채울 것이, 아무것도 당신이 시작 만하면 (알 필요가없는 경우 만약 그것이 효과가 있다면) 당신은 끝났습니다.
  • 옵션 : 프로세스가 (유효한 hProcess를 가지고 있다면 물론,) 종료 코드를 찾을 수
  • 전화 GetExitCodeProcessWaitForSingleObject(YourParamStruct.hProcess, INFINITE)를 사용하여 종료 때까지 기다립니다. (STILL_ACTIVE을 반환하는지 확인하고 대기 상태를 유지하고 다시 시도하십시오.) 일반적으로 성공을 나타내려면 0과 함께 종료해야합니다. 뭔가 잘못되면 0이 아닌 값을 반환하도록 스크립트를 수정해야합니다. 코드를 원하는대로 간단하게 또는 복잡하게 만들 수 있습니다 (예 : 1을 오류로 반환하거나 오류 유형별로 여러 코드를 나누어 작성). (259은 사용하지 마십시오. 그 값이 STILL_ACTIVE이므로 코드 작성 방법에 따라 Delphi 코드가 무한 루프로 이어질 수 있습니다. 코드가 없으면 Perl 스크립트가 실행 중이기 때문에 종료 코드를 기다리는 중이라고 생각합니다.) 등의 메시지를 로그, 사용자에게

    한가지 -

귀하의 델파이 응용 프로그램은 다음 Perl 스크립트가 작동 여부 있는지 확인하기 위해이 코드를 확인하고 실패 할 경우 응답 뭔가를 할 수 - 당신은 단지 스크립트가 실행되었는지 여부와 위와 같이 제공해야 하는지를 알고 싶다고 말합니다. Perl 스크립트이고 커맨드 라인에서 실행된다면, 에러 코드를 반환하지 않으면 오류를 검사하거나 사용자를 기록하거나 보여주기 위해 출력을 얻는 것이 좋습니다. CreateProcesscapturing the output을 실행하여이 작업을 수행 할 수 있습니다. 당신이 말한 것에서 이것은 당신이 쫓고있는 것에 대해 아마도 과잉이라고 할 수 있습니다!

+0

와일드 카드, 입출력 리디렉션 등을 허용하기 위해 항상 쉘을 실행하여 스크립트 이름을 매개 변수로 전달합니다. shebang 행은 perl 인터프리터가 시작되었는지 확인합니다. – mghie

+0

그건 절대로 나에게 일어난 적은 없어요, 좋은 지적이야! –

+0

자동화는 인간의 방해가 없어야 함을 의미합니다. 버튼을 클릭하는 동안 코드는 자동으로 perl 스크립트를 실행해야합니다. ShellExecute를 사용해 보았습니다 : ShellExecute (핸들, 'open', Pchar ('C : \ loaderperl.bat'), nil, nil, SW_SHOW); 창이 잠시 깜박이고 닫힙니다. 나는 스크립트가 실행되었는지 여부를 모른다. 이걸 제발 제발 좀 주시겠습니까? – JVNR

0

외부 프로그램 (로컬 컴퓨터에서 실행하려면 perl 인터프리터, 원격 컴퓨터에서 실행하려면 ssh 또는 smth)을 호출해야합니다. 다음은 외부 프로그램을 호출하고 종료 될 때까지 기다리는 절차입니다 (종료 될 때까지 기다릴 필요가 없거나 WaitForSingleObject를 제거하거나 다른 사람들이 제안한대로 ShellExecute를 호출하는 경우).

UPDATE : 스크립트 출력을 확인하려면, 당신은 ShellExecute()에 당신과 같이, cmd.exe를 실행하고 매개 변수로 스크립트를 전달해야하는 배치 파일을 원하는 경우 this article

function ExecAndWait(const FileName, Params: ShortString; const WinState: Word): boolean; export; 
var 
    StartInfo: TStartupInfo; 
    ProcInfo: TProcessInformation; 
    CmdLine: ShortString; 
begin 
    { Put the name of file between quotes, due to spaces in names of files in system Win9x } 
    CmdLine := '"' + Filename + '" ' + Params; 
    FillChar(StartInfo, SizeOf(StartInfo), #0); 
    with StartInfo do 
    begin 
    cb := SizeOf(SUInfo); 
    dwFlags := STARTF_USESHOWWINDOW; 
    wShowWindow := WinState; 
    end; 
    Result := CreateProcess(nil, PChar(String(CmdLine)), nil, nil, false, 
          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, 
          PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo); 
    { Wait the finish of program } 
    if Result then 
    begin 
    WaitForSingleObject(ProcInfo.hProcess, INFINITE); 
    { Free the Handles } 
    CloseHandle(ProcInfo.hProcess); 
    CloseHandle(ProcInfo.hThread); 
    end; 
end; 
0

에서 솔루션을 사용하려고 :

ShellExecute(Handle, 'open', 'cmd.exe', '/C C:\loaderperl.bat', nil, SW_SHOW); 

출력 리디렉션을 사용하여 파일의 스크립트 출력을 캡처 할 수 있습니다. 스크립트가 성공적으로 실행되었는지 여부를 확인하려면 테스트 목적으로 pause을 끝에 추가 할 수 있습니다.

관련 문제