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

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

  •  
  •   vituralfuture · 316 天前 · 2680 次点击
    这是一个创建于 316 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,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  
       316 天前
    你目的是什么,本来 win 使用习惯就不一样,都是桌面点图标启动
    oldshensheep
        2
    oldshensheep  
       316 天前   ❤️ 2
    scoop
    dbow
        3
    dbow  
       315 天前
    用快捷方式?
    vituralfuture
        4
    vituralfuture  
    OP
       315 天前
    @dbow 快捷方式似乎都是.lnk 的文件?跟软链接还是有点区别,因为软链接对其他程序是透明的,软链接不会影响其他程序调用它,但是 lnk 应该就不行了吧
    dbow
        5
    dbow  
       315 天前   ❤️ 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  
       315 天前 via Android   ❤️ 1
    单文件无依赖无配置的,可以自己建个目录扔进去。
    有依赖的 dll 的也得放进去。

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

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

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

    用管理员权限运行 WinGet ,或者不用管理员权限而是打开系统设置里面的开发人员模式,WinGet 就能把可执行文件链接到统一的目录了。
    不过 WinGet 现在创建的链接是符号链接,用在一些依赖同目录 DLL 的可执行文件会出点问题。Scoop 和 Chocolatey 都是通过 shim 来创建链接的,没有这个问题。个人建议还是用 Scoop 和 Chocolatey 来管理这类软件。
    iorilu
        24
    iorilu  
       315 天前
    @hxy100 那个脚本内容能贴下吗
    lelandsu
        25
    lelandsu  
       313 天前
    打开 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  
       313 天前
    假设楼主已经知道 mklink 。
    我也这么做过,有些命令行工具软链到一个固定的目录。
    不过,win 下一般不这么做有一些“历史”原因吧,很多软件设计的是要在“当前目录”下创建或读取其他文件信息,而很多软件获取“当前目录”,是启动程序的目录,而不是 exe 所在的目录(或 /etc/nginx 这种 linux 下固定的目录),也就是说,你在 d:/path 下软链 c:/soft/abc/app.exe ,在 e:/somedir 下通过 app.exe 命令打开它,它获取的“当前目录”是“e:/somedir”,这个当然可以通过改代码解决,不过说了是历史原因,很多软件已经不更新了。
    这也是为什么 win 下的“快捷方式”,会多一个“起始位置”的设置,有些软件你换了这个设置,会出问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2981 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 08:26 · PVG 16:26 · LAX 01:26 · JFK 04:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.