Cygwin zum Ausführen von Windows-Verknüpfungsdateien (.LNK)

Cygwin zum Ausführen von Windows-Verknüpfungsdateien (.LNK)

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 --helpfü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_handleHakenhinzugefü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 uniserverdieser Hook ausgelöst und /cygdrive/e/Apps/uniserver.lnknach 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.

verwandte Informationen