V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vituralfuture
V2EX  ›  Windows

windows 的 PATH 能不能做一个类似/usr/bin 的路径,然后其他软件软链接过去

  •  
  •   vituralfuture · 2023-06-16 16:18:52 +08:00 · 3011 次点击
    这是一个创建于 520 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,linux 安装软件时,可以直接把可执行放到/usr/bin下,也可以把一个 shell 脚本放到/usr/bin下,也可以软链接到/usr/bin,不管是什么方式,都可以做到安装软件后马上就能从终端调用

    然而使用 windows 时,大家的习惯都是把某个软件的 bin 目录添加到 PATH 中,这可能有几个问题

    1. bin 目录下的东西太多,可能在 PATH 中搜索某个文件的时候找到一些奇奇怪怪的东西
    2. 添加到 PATH 如果需要手动操作的话还是比较麻烦的,修改了 PATH 还可能需要重启
    3. 有些软件从使用习惯上来说,可能很少从终端调用,所以也不会添加到 PATH ,但如果能够从终端调用的话,写脚本还是非常方便的。例如 linux 安装了 google chrome ,终端就能够调用google-chrome-stable,然后输入google-chrome-stable google.com就能够用 chrome 打开一个网页

    目前 windows 的包管理工具,例如 win-get ,似乎还是会把软件的 bin 目录添加到 PATH

    我尝试过这个做法:手动创建一个~/path目录,然后把其他需要的东西统统软链接到这个目录,比如python,piparia2c,vim,最大的问题是:手动链接太麻烦了!

    所以说,windows 有没有类似的机制,或者说第三方工具能够这样做?

    26 条回复    2023-06-19 09:13:55 +08:00
    brader
        1
    brader  
       2023-06-16 16:21:08 +08:00
    你目的是什么,本来 win 使用习惯就不一样,都是桌面点图标启动
    oldshensheep
        2
    oldshensheep  
       2023-06-16 16:21:13 +08:00   ❤️ 2
    scoop
    dbow
        3
    dbow  
       2023-06-16 16:30:12 +08:00
    用快捷方式?
    vituralfuture
        4
    vituralfuture  
    OP
       2023-06-16 16:36:25 +08:00
    @dbow 快捷方式似乎都是.lnk 的文件?跟软链接还是有点区别,因为软链接对其他程序是透明的,软链接不会影响其他程序调用它,但是 lnk 应该就不行了吧
    dbow
        5
    dbow  
       2023-06-16 16:43:49 +08:00   ❤️ 1
    To create a file hard link: mklink /H linkName target
    To create a directory junction: mklink /J linkName target
    To create a directory symbolic link: mklink /D linkName target
    To create a file symbolic link: mklink linkName target
    jim9606
        6
    jim9606  
       2023-06-16 16:57:02 +08:00 via Android   ❤️ 1
    单文件无依赖无配置的,可以自己建个目录扔进去。
    有依赖的 dll 的也得放进去。

    软件包形式的可以考虑打包成 msix,可以在 AppxManifest.xml 声明应用执行别名。winget 和商店版 python 就是这样做的。
    hsfzxjy
        7
    hsfzxjy  
       2023-06-16 17:14:09 +08:00 via Android
    你可以放个 bat 到那个统一的目录,每个 bat 执行对应的程序
    assiadamo
        8
    assiadamo  
       2023-06-16 17:18:58 +08:00
    可以的,参考 oracle jdk 目前的安装方式,他会在 path 里写一个路径,比如
    C:\Program Files (x86)\Common Files\Oracle\Java\javapath
    这个 javapath 就是个快捷方式,里面是 java.exe 之类
    nightwitch
        9
    nightwitch  
       2023-06-16 17:32:00 +08:00 via Android
    因为 Windows 上没有 LD_LIBRARY_PATH 这个机制,所以建一个集中的 bin 目录没啥用,除非只用静态链接的东西
    0o0O0o0O0o
        10
    0o0O0o0O0o  
       2023-06-16 17:39:15 +08:00   ❤️ 1
    scoop 好像是做了个包装
    byteroam
        11
    byteroam  
       2023-06-16 17:52:16 +08:00
    右键--新建快捷方式?
    oldboy627
        12
    oldboy627  
       2023-06-16 17:55:13 +08:00
    单独的软件直接扔到 windows 目录下就行,终端就可以调用,不需要重启就可以生效。
    lisxour
        13
    lisxour  
       2023-06-16 17:58:20 +08:00
    事实上很多软件都会这么做(比如 dotnet global tool ),但是没有专门的软件去干这个。
    witherzuo
        14
    witherzuo  
       2023-06-16 20:59:53 +08:00
    Windows 有一种叫做“应用别名”( App alias )的功能,不过需要应用包使用 msix 包格式打包并且包配置文件开启并指定对应的应用别名,比如 X410 就可以安装后通过 x410 这一应用别名在任何位置快速启动。系统中已配置好的应用别名可以在系统设置中查看。
    Cu635
        15
    Cu635  
       2023-06-16 21:13:59 +08:00
    windows 版的 gvim 是在 C:\Windows 下放入 gvim.bat 等这一系列的 bat 文件。
    Vegetable
        16
    Vegetable  
       2023-06-16 21:18:33 +08:00
    你好,桌面。
    INCerry
        17
    INCerry  
       2023-06-16 21:28:22 +08:00
    可以加一个右击菜单,创建软连接到 PATH ,然后右击你想要的应用程序,选择创建软连接就会在 PATH 目录创建一个快捷方式。
    `cmd.exe /c mklink "F:\CmdPath\%1" "%1"`
    Honwhy
        18
    Honwhy  
       2023-06-16 21:56:22 +08:00
    看到有人提到了 Scoop 了,可能就是楼主想要的功能,Scoop 安装的 app 的启动 exe 都会放在同一个目录的,比如
    path\to\Scoop\shims
    mmdsun
        19
    mmdsun  
       2023-06-16 22:50:37 +08:00
    你在 D 盘创建一个 目录,比如叫: D:\my-app-path ,设置为 Path 。

    然后每次安装软件后就去创建 mklink 一下?好像也不麻烦呀?

    mklink chrome "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
    kkocdko
        20
    kkocdko  
       2023-06-17 00:58:15 +08:00
    可以,我当年还使用 Windows 的时候就这样使用过。不过现在换用 Linux 了
    hxy100
        21
    hxy100  
       2023-06-17 01:34:52 +08:00
    解决方案你自己文中已经说了:创建软链接到某个固定的目录,嫌 mklink 手动链接麻烦,可以写一个 bat 脚本放到 SendTo 目录( Tips:在资源管理器地址栏中可以使用 shell:sendto 快速跳转),然后对要创建链接的文件右键菜单发送到=》创建统一软链接就行了。很方便~
    ---
    yolee599
        22
    yolee599  
       2023-06-17 12:59:31 +08:00 via Android
    @hxy100 #21 这右键菜单看得我头疼,还两个压缩工具,换我一定会用右键菜单管理工具通通删掉
    SpecterShell
        23
    SpecterShell  
       2023-06-17 15:19:24 +08:00
    > 目前 windows 的包管理工具,例如 win-get ,似乎还是会把软件的 bin 目录添加到 PATH

    用管理员权限运行 WinGet ,或者不用管理员权限而是打开系统设置里面的开发人员模式,WinGet 就能把可执行文件链接到统一的目录了。
    不过 WinGet 现在创建的链接是符号链接,用在一些依赖同目录 DLL 的可执行文件会出点问题。Scoop 和 Chocolatey 都是通过 shim 来创建链接的,没有这个问题。个人建议还是用 Scoop 和 Chocolatey 来管理这类软件。
    iorilu
        24
    iorilu  
       2023-06-17 16:03:01 +08:00
    @hxy100 那个脚本内容能贴下吗
    lelandsu
        25
    lelandsu  
       2023-06-18 21:56:41 +08:00
    打开 powershell 终端,vim $PROFILE, 添加别名:

    Set-Alias sh "C:/Program Files/Git/bin/bash.exe"
    Set-Alias scrcpy "C:/Users/user/Documents/software/scrcpy/scrcpy.exe"
    Set-Alias vcpkg "C:\Users\user\Documents\code\vcpkg\vcpkg.exe"
    Set-Alias kate "C:/Program Files/Kate/bin/kate.exe"
    Set-Alias unison "C:\Users\user\Documents\Programs\unison\bin\unison.exe"

    如果需要默认参数,可以定义个函数:

    function ffmpeg { C:/Users/user/Documents/code/ffmpeg/ffmpeg.exe -hide_banner $args }
    jifengg
        26
    jifengg  
       2023-06-19 09:13:55 +08:00
    假设楼主已经知道 mklink 。
    我也这么做过,有些命令行工具软链到一个固定的目录。
    不过,win 下一般不这么做有一些“历史”原因吧,很多软件设计的是要在“当前目录”下创建或读取其他文件信息,而很多软件获取“当前目录”,是启动程序的目录,而不是 exe 所在的目录(或 /etc/nginx 这种 linux 下固定的目录),也就是说,你在 d:/path 下软链 c:/soft/abc/app.exe ,在 e:/somedir 下通过 app.exe 命令打开它,它获取的“当前目录”是“e:/somedir”,这个当然可以通过改代码解决,不过说了是历史原因,很多软件已经不更新了。
    这也是为什么 win 下的“快捷方式”,会多一个“起始位置”的设置,有些软件你换了这个设置,会出问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3543 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:46 · PVG 12:46 · LAX 20:46 · JFK 23:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.