Cygwin 执行 Windows 快捷方式文件 (.LNK)

Cygwin 执行 Windows 快捷方式文件 (.LNK)

我在 Windows 上使用 Cygwin 作为我的 cmd 替代品,并且正在清理我的系统 PATH 变量。

我现在有一个包含 exe 和快捷方式(.LNK)文件的文件夹,该文件夹位于 PATH 中,包含我从命令行使用的所有小应用程序和软件。

一切都可以通过 CMD 运行,但是快捷方式 .LNK 文件无法通过 Cygwin 运行。相反,我得到了

bash:/cygdrive/e/Apps/uniserver.lnk:无法执行二进制文件

我唯一的猜测是因为它认为 .lnk 应该是一个符号链接?

有没有什么办法可以让 Cygwin 启动快捷方式?

答案1

您可以使用实用程序从 Cygwin 执行 Windows LNK 文件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。

我认为您无法“关联” Cygwin 中的 LNK 文件以使 Cygwin 自动启动您的包装器,但也许其他人可以建议一种方法来做到这一点。

相关内容