2010-08-05 37 views
14

Tôi có một tệp thực thi trên ổ đĩa của tôi trên dir \ program \ prog.exe Tôi muốn có một lối tắt đến tệp thực thi trên thư mục gốc của DoK, tức là, prog.lnk sẽ chỉ đến thư mục \ chương trình \ prog.exe.Làm cách nào để tạo lối tắt (.lnk) với mục tiêu tương đối?

Tuy nhiên, có vẻ như prog.lnk không thể có mục tiêu tương đối. Đây là một vấn đề khi DoK sẽ có các ký tự ổ đĩa khác nhau được gán cho nó, tùy thuộc vào PC được kết nối với nó.

Bất kỳ đề xuất nào, ngoài việc hiển thị prog.exe rõ ràng trong thư mục gốc?

(cuối cùng, tôi muốn làm điều này lúc cài đặt thời gian sử dụng NSIS)

Cảm ơn,

Rony

Trả lời

8

Trong khi có thể các phím tắt chứa đường dẫn tương đối đến đích (tệp .lnk có cờ gọi là SLDF_HAS_RELPATH) NSIS không hỗ trợ tạo bất kỳ thứ gì khác ngoài lối tắt "bình thường", do đó bạn cần ghi dữ liệu nhị phân trực tiếp (các định dạng .lnk là khá ổn định và đã được ghi nhận bởi MS)

!macro FileWriteHexBytes h b 
push ${h} 
push ${b} 
call FileWriteHexBytes 
!macroend 
Function FileWriteHexBytes 
exch $9 
exch 
exch $0 
push $1 
push $2 
loop: 
    StrCpy $2 $9 2 
    StrLen $1 $2 
    IntCmp $1 2 0 end 
    FileWriteByte $0 "0x$2" 
    StrCpy $9 $9 "" 2 
    goto loop 
end: 
pop $2 
pop $1 
pop $0 
pop $9 
FunctionEnd 


Function CreateRelativeLnk 
exch $9 
exch 
exch $0 
push $1 
FileOpen $0 "$0" w 
StrCmp $0 "" clean 
!insertmacro FileWriteHexBytes $0 "4C0000000114020000000000C000000000000046" 
!insertmacro FileWriteHexBytes $0 48010400 ;flags 
!insertmacro FileWriteHexBytes $0 00000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000 

StrLen $1 $9 ;must be < 255! 
FileWriteByte $0 $1 
FileWriteByte $0 0 
FileWrite $0 "$9" ;relative target path 

!if 0 
;The icon is problematic, does not seem like it works with relative paths (but you can use system icons...) 
StrCpy $9 "explorer.exe" 
StrLen $1 $9 
FileWriteByte $0 $1 
FileWriteByte $0 0 
FileWrite $0 "$9" 
!else 
!insertmacro FileWriteHexBytes $0 05003e2e657865 ;fake default .exe icon 
!endif 

clean: 
FileClose $0 
pop $1 
pop $0 
pop $9 
FunctionEnd 

Gọi nó như thế này:

push "$temp\testlink.lnk" 
push "testdir\testapp.exe" ;full path to this is $temp\testdir\testapp.exe 
call CreateRelativeLnk 

trong khi .lnk tạo ra dường như để làm việc, tôi không chắc chắn nếu tôi sẽ sử dụng mã này trong mã sản xuất

Một giải pháp tốt hơn là tạo ra một ứng dụng NSIS chút như Oleg gợi ý (các ứng dụng NSIS có thể chứa dữ liệu nhúng vào cuối của .exe mà nó có thể đọc từ bản thân trong thời gian chạy vv ..)

+0

.lnk tài liệu định dạng tệp: http://msdn.microsoft.com/en-us/library/dd871305.aspx – n611x007

1

Bạn đang đúng. Bạn không thể sử dụng phím tắt (.lnk) trên một phương tiện lưu động, vì như bạn đã viết cho mình phương tiện lưu động có thể có các ký tự ổ đĩa khác nhau trong các tình huống khác nhau.

Nếu bạn cần có thứ gì đó trong thư mục gốc của ổ đĩa, hãy sử dụng CMD, VBS hoặc JS thay vì phím tắt. Trong một số trường hợp, một người dùng cũng là một EXE tiêu chuẩn sử dụng một tệp cấu hình như tệp INI để bắt đầu một chương trình khác từ thư mục con khác. Nó là một thực tế điển hình cho đĩa CD/DVD để thực hiện bắt đầu của một chương trình cài đặt sau khi chèn đĩa. Có lẽ cách này sẽ được chấp nhận cho các yêu cầu của bạn?

10

Nếu chúng ta giả cmd.exe cánh sẽ rơi vào đường dẫn tuyệt đối tương tự cho tất cả các cửa sổ cài đặt (có thể xảy ra, nhưng không fool-proof), bạn có thể tạo ra các tập tin LNK để bắt đầu cmd như thế này

cmd.exe /c start /d. your command here 

/d bộ thư mục để thư mục của tệp .lnk

Có thể có các tùy chọn hữu ích khác cho lệnh bắt đầu (ví dụ:/b)

3

Cài đặt "Tương đối"

Tôi đang sử dụng một chút hack. Cách tiếp cận được hiển thị trong ảnh chụp màn hình này:

Bắt đầu trình khám phá.exe và sau đó đi một người họ hàng đường như vậy:

%windir%\explorer.exe path\to\your\files\youFileName.example 

Tôi đang sử dụng một small tool called "Relative" cho việc này. Sau khi cài đặt, bạn có thể nhấp chuột phải vào một tệp và sau đó chọn Create relative shortcut.... Sau đó nó sẽ bật lên một hộp Save as.... Đây không phải là khá thoải mái như chỉ đơn giản là kéo và thả nhưng nó giúp. (Nó cũng sử dụng biểu tượng đặc biệt của riêng nó cho các liên kết mà nó tạo ra. Vì vậy, bạn không còn có biểu tượng ban đầu trong liên kết. Xem ở trên. Bạn có thể hoặc không thích điều này.)

0

Tôi tin rằng Bộ tài nguyên NT 4 lệnh SHORTCUT.exe sẽ tạo các phím tắt được liên kết tương đối. Tôi mong rằng Microsoft sẽ tạo ra một tiện ích được hỗ trợ mới hoặc Powershell Cmdlet để tạo thuận lợi cho việc tạo ra các tệp .lnk tương đối hoặc làm cho các liên kết NTFS hoạt động giống như các liên kết tượng trưng Linux. Cho đến lúc đó, tôi sử dụng các tệp .cmd/.bat và .ps1 cho mục đích này.

Program.cmd

@"%~dp0Relative\Path\Program.exe" %* 
  • @ = Chặn sự vang lệnh.
  • % ~ dp0 = mở rộng đến thư mục của tập lệnh.
  • Tương đối \ Đường dẫn = có thể bao gồm .. để sao lưu thư mục.
  • % * = chuyển bất kỳ thông số nào mà tập lệnh nhận được lên đến Program.exe.

Program.ps1

Thật không may, mặc dù các file .cmd/.bat sẽ chạy từ bất kỳ ngữ cảnh (hộp thoại run, một CMD prompt, trong Powershell, nhấp đúp vào File Explorer, vv), họ không thể gọi những thứ được lưu trữ trên đường dẫn UNC. Để lộ những thứ trong một đường dẫn UNC, trong Powershell (tôi làm điều này cho các công cụ như Git và Mercurial), tôi sẽ tạo ra một phiên bản Powershell của kịch bản trên.

&"$PSScriptRoot\Relative\Path\Program.exe" @args 
  • & = đặt Powershell vào chế độ lệnh, do đó chuỗi trong dấu ngoặc được chạy.
  • "" = chứa chuỗi, mở rộng bất kỳ biến nào.
  • $ PSScriptRoot = mở rộng đến thư mục của tập lệnh.
  • Tương đối \ Đường dẫn = có thể bao gồm .. để sao lưu thư mục.
  • @args = chuyển bất kỳ thông số nào mà tập lệnh nhận được lên tới Program.exe.
Các vấn đề liên quan