2012-04-29 41 views
5

Tôi không tìm thấy trong sự giúp đỡ một lời giải thích đầy đủ về sự khác biệt giữa Shellexec và Exec. LàShellexec vs Exec vs Shellexec tập tin batch của tôi

Shellexec('','program.exe',params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode) 

tương đương với

Exec('program.exe',params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode) 

khi làm việc với các tập tin exe? Tất nhiên, khi tôi muốn thực hiện một tập tin khác với exe hoặc batch, sử dụng Shellexec.

Đôi khi, tuy nhiên, tôi không thể làm cho istruction hoạt động chính xác, không phải bởi Shellexec cũng như Exec. Giải pháp duy nhất luôn hoạt động là viết một tập tin batch và chạy nó qua shellexec. Cá nhân tôi không thích giải pháp này bởi vì tôi phải đối phó với một tập tin tạm thời và tôi không tin tưởng các resultcode thu được. Bây giờ tôi sẽ phải quay lại giải pháp tập tin batch, bởi vì tôi không biết làm thế nào để lệnh này hoạt động: (lỗi là nó làm tăng chỉ lệnh nếu tập tin đích chưa có, trong khi lệnh nhắc lệnh chỉ hoạt động ngay cả khi tệp đích không tồn tại).

mysqldump := 'C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin\mysqldump.exe'; 
params := '-uroot -ppassword myschema>C:\myappdir\backup\newbackup.sql'; 
//the destination folder exists, the file newbackup.sql does not exist  
Shellexec('',mysqldump,params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode); 

tôi đang làm việc trên Windows 7 64 bit, chương trình (một Inno Setup cài đặt) được chạy với quyền quản trị

+1

Chắc chắn gõ '{}' pf32 liên tục thay vì 'C: \ Program Files (x86)'. Nó sẽ trả về cho bạn đường dẫn chính xác đến thư mục tệp chương trình 32 bit. Tôi nghĩ rằng nó có thể là nguyên nhân của vấn đề của bạn, nhưng khó nói. Bạn cũng có thể kiểm tra xem tệp có tồn tại với hàm 'FileExists' trước khi bạn cố thực hiện nó hay không. – TLama

Trả lời

4

Trong trường hợp đó trong Cài đặt Inno, hai cuộc gọi tương tự nhau. Tuy nhiên, nếu thiết lập đang chạy ở các đặc quyền thấp nhất và bạn thử và chạy một quá trình yêu cầu độ cao, ShellExec() sẽ cho phép nó nhắc trong khi Exec() sẽ không thành công.

Sự khác biệt giữa hai lần xuất hiện khi truyền các dòng lệnh đơn nguyên khối, truyền các tệp không thực thi hoặc khi sử dụng các động từ khác ngoài "open".

Lưu ý rằng không có chức năng nào sẽ cho phép bạn chạy các lệnh hoặc thao tác được cung cấp bởi trình thông dịch lệnh như toán tử chuyển hướng (... > ...). Các lệnh này sẽ cần được chuyển đến {cmd} để có thể chạy.

Dưới đây là một số mã không khí:

mysqldump := 'C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin\mysqldump.exe'; 
params := '-uroot -ppassword myschema'; 
dumpfile : = 'C:\myappdir\backup\newbackup.sql'; 

command := AddQuotes(mysqldump) + ' ' + params + ' >' + AddQuotes(dumpfile); 
Exec(ExpandConstant('{cmd}'), '/C ' + command, '', SW_HIDE, ewWaitUntilTerminated, ResultCode); 
+0

+1, câu trả lời đầu tiên xem xét thẻ InnoSetup và chính câu hỏi đó! Nhưng * Nó cũng xử lý độ cao nếu quá trình cần nó, nơi CreateProcess() không * là một chút bối rối ở đây, cả hai chức năng 'ShellExec' và' Exec' sử dụng các quyền giống như thiết lập chính nó. – TLama

+1

Ah, tôi đã bỏ lỡ thẻ cài đặt inno, trong trường hợp đó, chúng khá giống nhau và đến doen để phân tích cú pháp. Nếu howwver, thiết lập được chạy như một người dùng bị hạn chế, hoặc 'ShellExecAsOriginalUser' thì nó sẽ yêu cầu nâng cao nếu được yêu cầu. 'Exec()' sẽ thất bại trong trường hợp đó. – Deanna

+0

Câu trả lời đã được viết lại với Inno. – Deanna

2

bạn đã xem xét sử dụng CreateProcess để bắt đầu quá trình này? Cuộc gọi này cung cấp một vài tùy chọn bổ sung để kiểm soát quá trình kết quả, và cũng có thể xử lý các paramaters thông qua tốt hơn.

+0

+1 cho CreateProcess –

+0

Cảm ơn bạn, tôi chưa thử hướng dẫn đó trước đây. Tôi đã không tìm thấy một hướng dẫn CreateProcess trong Innosetup. Dù sao, tôi nghĩ rằng nó có thể hữu ích trong các dự án Delphi của tôi. Trong quá trình tìm hiểu việc sử dụng CreateProcess tôi đã gặp [câu hỏi này] (http://stackoverflow.com/q/343476/1136458).Hướng dẫn của tôi vẫn không hoạt động, có thể do chuyển hướng đầu ra. – lib

+0

Bạn có thể không cần chuyển hướng và hành vi mặc định có thể chỉ làm tốt, có một thử mà không có 'hoặc STARTF_USESTDHANDLES' và tạo/thiết lập các chốt. –

2

Nếu bạn có thể sử dụng thư viện JEDI JVCL, họ có một thành phần tốt đẹp mà gói gọn CreateProcess cho bạn:

http://jvcl.delphi-jedi.org/

Nhìn vào thành phần JvCreateProcess và JvCreateProcessExtended. JEDI JVCL là nguồn mở và miễn phí và được phát hành theo Giấy phép Công cộng Mozilla.

Các vấn đề liên quan