2010-08-05 17 views
14

Mam plik wykonywalny na dysku na klucz w katalogu \ program \ prog.exe Chciałbym mieć skrót do pliku wykonywalnego w katalogu głównym DoK, to znaczy, że prog.lnk będzie odnosił się do katalogu \ program \ prog.exe.Jak utworzyć skrót (.lnk) z względnym celem?

Wygląda jednak na to, że prog.lnk nie może mieć względnego celu. Jest to problem, gdy DoK będzie miał przypisane różne litery dysków, w zależności od tego, do którego komputera jest podłączony.

Jakieś sugestie poza oczywistym wprowadzeniem prog.exe do katalogu głównego?

(ostatecznie, chciałbym zrobić to w czasie instalacji przy użyciu NSIS)

Dzięki,

Rony

Odpowiedz

8

Chociaż skróty mogą zawierać względną ścieżkę do celu (pliki .lnk mają flagę o nazwie SLDF_HAS_RELPATH) NSIS nie obsługuje tworzenia innych niż "normalne" skróty, więc musisz bezpośrednio zapisać dane binarne (Format .lnk jest dość stabilna i została udokumentowana przez 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 

nazwać to tak:

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

Choć generowane .lnk wydaje się działać, nie jestem pewien, czy chciałbym użyj tego w kodzie produkcyjnym

Znacznie lepszym rozwiązaniem jest stworzenie niewiele app NSIS jak Oleg sugeruje (aplikacje NSIS może zawierać osadzone dane na koniec .exe, który można odczytać z siebie przy starcie itp ..)

+0

Dokumentacja formatu pliku .lnk: http://msdn.microsoft.com/en-us/library/dd871305.aspx – n611x007

1

Masz rację. Nie można używać skrótów (.lnk) na nośnikach wymiennych, ponieważ tak jak sam napisałeś, nośniki wymienne mogą mieć różne litery dysków w różnych sytuacjach.

Jeśli potrzebujesz czegoś w katalogu głównym dysku, użyj skrótu CMD, VBS lub JS zamiast skrótu. W niektórych sytuacjach można również użyć standardowego EXE, który używa pliku konfiguracyjnego, takiego jak plik INI, aby uruchomić inny program z innego podkatalogu. Typową praktyką w przypadku płyt CD/DVD jest uruchomienie programu instalacyjnego po włożeniu dysku. Prawdopodobnie ten sposób będzie również odpowiedni dla twoich wymagań?

10

gdybyśmy zakładamy cmd.exe byłoby na tej samej ścieżki bezwzględnej dla wszystkich okien instalacji (prawdopodobny, ale nie idiotoodporny) można rozpoznać plik .lnk, aby rozpocząć cmd jak ten

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

/d ustawia katalog do katalog pliku .lnk

Mogą być inne przydatne opcje dla polecenia start (np./b)

3

Zainstaluj "Względny"

Używam trochę hackowania. Podejście to pokazano na tym zrzucie ekranu:

Rozpoczyna eksplorator.exe, a następnie przejeżdżania względna ścieżka tak:

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

Używam small tool called "Relative" do tego. Po zainstalowaniu możesz kliknąć plik prawym przyciskiem myszy, a następnie wybrać Create relative shortcut.... Pojawi się wtedy pudełko Save as.... To nie jest tak wygodne, jak po prostu przeciąganie i upuszczanie, ale pomaga. (Używa również swojej własnej specjalnej ikony dla tworzonych przez siebie linków, więc nie masz już oryginalnej ikony w linku Zobacz wyżej Możesz to lub nie lubisz)

0

Wierzę, że NT 4 Resource Kit Polecenie SHORTCUT.exe utworzy względnie połączone skróty. Chciałbym, aby Microsoft stworzył nowe obsługiwane narzędzie lub Cmdlet Powershell, aby ułatwić tworzenie względnych plików .lnk lub sprawić, by łącza NTFS działały bardziej jak dowiązania symboliczne Linuksa. Do tego czasu używam do tego celu plików .cmd/.bat i .ps1.

Program.cmd

@"%~dp0Relative\Path\Program.exe" %* 
  • @ = pomija echa polecenia.
  • % ~ dp0 = rozwija się do katalogu skryptu.
  • Względny \ Ścieżka = może zawierać .. w celu utworzenia kopii zapasowej katalogu.
  • % * = przekazuje parametry otrzymane przez skrypt do programu Program.exe.

Program.ps1

Niestety, chociaż pliki cmd/bat będzie działał z każdym kontekście (okno metę CMD monit, w PowerShell, podwójne kliknięcie w Eksploratorze plików itp), nie mogą wywoływać rzeczy zapisanych na ścieżce UNC. Aby ujawnić rzeczy na ścieżce UNC, w Powershell (robię to dla narzędzi takich jak Git i Mercurial), stworzę wersję Powershell powyższego skryptu.

&"$PSScriptRoot\Relative\Path\Program.exe" @args 
  • & = stawia PowerShell do trybu poleceń, tak że ciąg w cudzysłowach dostaje ran.
  • "" = zawiera ciąg znaków, rozwijając dowolne zmienne.
  • $ PSScriptRoot = rozwija się do katalogu skryptu.
  • Względny \ Ścieżka = może zawierać .. w celu utworzenia kopii zapasowej katalogu.
  • @args = przekazuje wszelkie parametry otrzymane przez skrypt do programu Program.exe.
Powiązane problemy