Cygwin для запуска файлов ярлыков Windows (.LNK)

Cygwin для запуска файлов ярлыков Windows (.LNK)

Я использую Cygwin в качестве замены cmd в Windows и сейчас занимаюсь очисткой системной переменной PATH.

Теперь у меня есть папка, содержащая файлы exe и ярлыки (.LNK), которая находится в PATH и содержит все небольшие приложения и программное обеспечение, которое я использую из командной строки.

Все работает через CMD, однако ярлыки, .LNK файлы, не работают через Cygwin. Вместо этого я получаю

bash: /cygdrive/e/Apps/uniserver.lnk: невозможно выполнить двоичный файл

Я только предполагаю, что он думает, что .lnk — это символическая ссылка?

Можно ли как-то заставить Cygwin запустить ярлык?

решение1

Вы можете запустить файлы Windows LNK из Cygwin с помощью cygstartутилиты, входящей в составпакет cygutils, следующее:

cygstart [OPTION]... FILE [ARGUMENTS]

Видетьcygstart --helpдля доступных вариантов.

В вашем случае должно быть достаточно следующего:

cygstart /cygdrive/e/Apps/uniserver.lnk

решение2

Я сделал похожую настройку и подумал, что если бы я мог сэкономить время на вводе .lnkкаждый раз. Попробовал command_not_found_handleкрюкдобавлено в Bash 4.0 и выглядит работающим:

# 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
}

например, набор текста просто uniserverзапускает этот хук и находит /cygdrive/e/Apps/uniserver.lnkдля запуска.

Редактировать:Альтернатива, которая находит ярлыки по всему $PATH.

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
}

решение3

Используйте встроенную команду DOS start. Я предполагаю, что Cygwin НЕ имеет доступа к встроенным командам DOS, поэтому вам придется написать оболочку, например mystart.bat, и запустить ваши LNK с помощью скрипта-оболочки.

Я не думаю, что вы можете «связать» LNK-файлы в Cygwin, чтобы Cygwin автоматически запускал вашу оболочку, но, возможно, кто-то другой сможет предложить способ сделать это.

Связанный контент