2010-06-23 34 views
6

Tôi đang làm cho các trình cài đặt cho cửa sổ sử dụng NSIS và có nhiều tùy chỉnh tùy chọn mà người dùng có thể xác định bằng cách sử dụng dòng lệnh cài đặt, ví dụ như:NSIS - in để nhắc trong dòng lệnh cài đặt

installer.exe /IDPATH=c:\Program Files\Adobe\Adobe InDesign CS5 /S 

gì Tôi muốn làm là hiển thị các tùy chọn này cho người cài đặt. Tôi có thể dễ dàng phân tích cú pháp /? hoặc/giúp các tham số với $ {GetParameters} và $ {GetOptions}, nhưng làm cách nào để thực hiện việc in ấn thực tế vào dấu nhắc lệnh?

Trả lời

9

NSIS là một chương trình GUI và không thực sự có khả năng viết thành stdout.

Trên XP và sau đó bạn có thể làm điều này với các plugin hệ thống:

System::Call 'kernel32::GetStdHandle(i -11)i.r0' 
System::Call 'kernel32::AttachConsole(i -1)' 
FileWrite $0 "hello" 

On < XP, không có AttachConsole và bạn cần phải gọi AllocConsole trên những hệ thống (có thể là sẽ mở một cửa sổ giao diện điều khiển mới)

Edit: Bạn có thể mở một giao diện điều khiển mới nếu quá trình cha mẹ không có một cái nào với

!include LogicLib.nsh 
System::Call 'kernel32::GetStdHandle(i -11)i.r0' 
System::Call 'kernel32::AttachConsole(i -1)i.r1' 
${If} $0 = 0 
${OrIf} $1 = 0 
System::Call 'kernel32::AllocConsole()' 
System::Call 'kernel32::GetStdHandle(i -11)i.r0' 
${EndIf} 
FileWrite $0 "hello$\n" 

Nhưng nó không thực sự làm cho bất kỳ ý nghĩa như xa như /? xử lý đi, bạn cũng có thể mở hộp thư khi không có bảng điều khiển

!include LogicLib.nsh 
StrCpy $9 "USAGE: Hello world!!" ;the message 
System::Call 'kernel32::GetStdHandle(i -11)i.r0' ;try to get stdout 
System::Call 'kernel32::AttachConsole(i -1)i.r1' ;attach to parent console 
${If} $0 <> 0 
${AndIf} $1 <> 0 
FileWrite $0 "$9$\n" 
${Else} 
MessageBox mb_iconinformation $9 
${EndIf} 
+0

Có vẻ như việc dán mã này vào .oninit không hiển thị trên máy XP. Tôi có cần thiết lập bất kỳ thứ gì như các giá trị của i và r0 không? Tôi cũng không hoàn toàn hiểu những gì từng dòng này làm. Tôi sẽ cho rằng dòng đầu tiên được xử lý của giao diện điều khiển hiện tại, dòng thứ hai liên kết $ 0 đến bàn điều khiển đó để ghi tiếp theo vào tệp ảo đó sẽ kết thúc trong bảng điều khiển. Nó thật sự đúng? Tôi cũng đã thử các mẫu mã dài hơn được tìm thấy trên các diễn đàn winamp khi googling cho nsis kernel32 :: attachconsole, nhưng chúng dường như có cùng một vấn đề. – MatsT

+1

Sau khi nhiều googling hơn để các trang ngẫu nhiên tôi nghĩ rằng tôi đã tìm ra rằng tất cả các 'tôi' chỉ đơn giản là biểu thị rằng sau đây là một số nguyên. Như bạn có thể nói kiến ​​thức của tôi về các cửa sổ api là rất cơ bản. – MatsT

+0

Bạn cần chạy chương trình từ bên trong bảng điều khiển mở (cmd.exe) – Anders

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