![Cygwin zum Ausführen von Windows-Verknüpfungsdateien (.LNK)](https://rvso.com/image/1417416/Cygwin%20zum%20Ausf%C3%BChren%20von%20Windows-Verkn%C3%BCpfungsdateien%20(.LNK).png)
Ich verwende Cygwin als meinen cmd-Ersatz unter Windows und bin dabei, meine System-PATH-Variable zu bereinigen.
Ich habe jetzt einen Ordner mit EXE- und Verknüpfungsdateien (.LNK). Er befindet sich im Pfad, der alle kleinen Apps und Software enthält, die ich über die Befehlszeile verwende.
Alles funktioniert über CMD, aber die Verknüpfungen, .LNK-Dateien, funktionieren nicht über Cygwin. Stattdessen bekomme ich
bash: /cygdrive/e/Apps/uniserver.lnk: Binärdatei kann nicht ausgeführt werden
Meine einzige Vermutung ist, dass es denkt, .lnk solle ein symbolischer Link sein?
Gibt es eine Möglichkeit, Cygwin dazu zu bringen, die Verknüpfung zu starten?
Antwort1
Sie können Windows LNK-Dateien von Cygwin aus mit dem Dienstprogramm ausführen cygstart
, das Teil voncygutils-Paket, wie folgt:
cygstart [OPTION]... FILE [ARGUMENTS]
Sehencygstart --help
für die verfügbaren Optionen.
Folgendes sollte in Deinem Fall genügen:
cygstart /cygdrive/e/Apps/uniserver.lnk
Antwort2
Ich habe ein ähnliches Setup gemacht und überlegt, ob ich mir jedes Mal das Tippen sparen könnte .lnk
. command_not_found_handle
Hakenhinzugefügt ab Bash 4.0 und es scheint zu funktionieren:
# add this to your .bashrc
command_not_found_handle ()
{
if [[ $1 == *.* || $1 == */* ]]; then
echo "$1: command not found"
return 127
fi
local binbase=/cygdrive/e/Apps/
local name=$1
shift
# You might want to tweak precedence
if [[ -f ./$name.bat ]]; then
exec "./$name.bat" "$@"
elif [[ -f ./$name.lnk ]]; then
cygstart "./$name.lnk" "$@"
elif [[ -f $binbase/$name.bat ]]; then
exec "$binbase/$name.bat" "$@"
elif [[ -f $binbase/$name.lnk ]]; then
cygstart "$binbase/$name.lnk" "$@"
else
echo "$name: command not found"
return 127
fi
}
Beispielsweise wird durch die Eingabe einfach uniserver
dieser Hook ausgelöst und /cygdrive/e/Apps/uniserver.lnk
nach dem Start gesucht.
Bearbeiten:Eine Alternative, die Verknüpfungen zum gesamten $PATH findet.
command_not_found_handle ()
{
if [[ $1 == *.* || $1 == */* ]]
then
echo "$1: command not found"
return 127
fi
local name=$1
shift
if [[ -f ./$name.bat ]]
then
exec "./$name.bat" "$@"
elif [[ -f ./$name.lnk ]]
then
start "./$name.lnk" "$@"
elif [[ -f $(type -P $name.bat) ]]
then
exec "$(type -P $name.bat)" "$@"
elif [[ -f $(type -P $name.lnk) ]]
then
cygstart "$(type -P $name.lnk)" "$@"
else
echo "$name: command not found"
return 127
fi
}
Antwort3
Verwenden Sie den integrierten DOS-Befehl start
. Ich vermute jedoch, dass Cygwin KEINEN Zugriff auf integrierte DOS-Befehle hat, sodass Sie einen Wrapper wie mystart.bat schreiben und Ihre LNKs mithilfe des Wrapper-Skripts starten müssen.
Ich glaube nicht, dass Sie die LNK-Dateien in Cygwin „verknüpfen“ können, damit Cygwin Ihren Wrapper automatisch startet, aber vielleicht kann jemand anderes eine Möglichkeit vorschlagen, dies zu tun.