我在 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 自动启动您的包装器,但也许其他人可以建议一种方法来做到这一点。