V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
lc1450
V2EX  ›  分享创造

一个脚本拯救你的 windows 环境变量

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

    开发需要装很多程序,甚至一个程序有好几个版本 根据以往经验,都是把路径加入 PATH,渐渐的 PATH 变量越来越长,不方便管理

    为了缓解这个问题, 我建了个目录 E:\Tools 存放常用的独立命令(如 curl,wget),并将它加入 PATH 但是很多程序有大量的依赖 dll,总不可能都放一起吧

    有时遇到一些命令需要类似 linux alias 设置默认参数在 cmd 里也得手动输入

    思前想后,写了一个批处理简单实现了这个需求, 大概思路是 bat 被执行后取当前文件名(去后缀)作为命令名称,然后通过配置获取对应的程序并执行

    脚本内容如下(配置解析用了 jq,需要自行下载):

    @echo off
    setlocal
    
    ::echo %*
    
    set str1=%0
    :: 截取当前命令名称
    set "cmd1=%str1:.=" & set "xx=%"
    ::echo %cmd1%
    
    set jq_filter=".%cmd1% | join(\" \")"
    
    ::echo %jq_filter%
    :: 用户 jq 获取启动命令和默认参数
    :: 这里的配置文件路径需要更具实际情况设置为绝对路径
    for /f "delims=" %%i in ('jq -r %jq_filter% n_config.json') do (
    	:: >= 1  -> ERROR
    	if errorlevel 1 (
    	 echo "no config"
    	 goto :EOF
    	) else (
    	 set rt=%%i
    	)
    )
    
    ::echo %rt%
    
    %rt% %*
    

    配置文件 n_config.json:

    {
        "python37": {
            "cmd": "E:\\Python\\Python37\\python.exe",
            "args": ""
        },
        "test_git": {
            "cmd": "E:\\git\\bin\\git.exe",
            "args": "--version"
        }
    }
    

    现在就可以把脚本命名成需要的名字, 并在配置文件写入目标程序路径参数信息

    列如: 把上面的脚本保存为 python37.bat, 执行就会启动 E:\Python\Python37\python.exe

    大家觉得这个方案如何,或者有更好的方案,或者对脚本的改进,欢迎大伙儿一起焦流

    16 条回复    2020-12-30 18:12:22 +08:00
    pkoukk
        1
    pkoukk  
       353 天前   ❤️ 2
    可 win10 的 path 是个列表啊..有啥不方便的
    codehz
        2
    codehz  
       353 天前
    @pkoukk #1 path 有最大长度限制* 4096 个字符
    楼主的方案思路不错,但是太慢了,win 上命令行程序启动延迟还是很明显的
    另外 cmd 是可以 alias 的,就是 doskey(
    superrichman
        3
    superrichman  
       353 天前 via iPhone
    windows 下的 cmder 可以设置 alias,比默认 cmd 好用很多
    ysc3839
        4
    ysc3839  
       352 天前 via Android
    > 我建了个目录 E:\Tools 存放常用的独立命令(如 curl,wget),并将它加入 PATH 但是很多程序有大量的依赖 dll,总不可能都放一起吧

    可以,用 msys2,可以共享的 dll 会复用,都是放在一起的。
    jinliming2
        5
    jinliming2  
       352 天前
    > 我建了个目录 E:\Tools 存放常用的独立命令(如 curl,wget),并将它加入 PATH

    你完全可以程序正常安装,然后在 E:\Tools 里创建快捷方式,快捷方式支持设置参数(直接跟在路径后面就行了),然后把这个路径加入 PATH 之后你就可以通过命令行执行里面的快捷方式了。比如 python.lnk 。
    然后配置环境变量 PATHEXT,把 .LNK 加进去,就可以在命令行里省略快捷方式的拓展名了。
    codehz
        6
    codehz  
       352 天前 via Android
    提示:dll 也会在 PATH 里找
    另外 curl 不是系统自带的吗
    dyxang
        7
    dyxang  
       352 天前 via Android
    我是反的,恰巧需要一个把当前路径添加到 path 里的脚本,先前有个程序硬是无法在命令行运行,自己手动去加不小心把 path 全删了,又得系统还原。
    ps:搞不懂为什么网上很多都是说在“用户环境变量”下新建一个叫“PATH”的,不是“系统环境变量”吗,误导人
    codehz
        8
    codehz  
       350 天前 via Android
    @dyxang 如果没有多用户需求的话,加哪里都一样,windows 会合并用户的 path 和系统的 path
    dyxang
        9
    dyxang  
       350 天前
    @codehz 实际上在网上我看到好几种版本,也会合并用户的 path 和系统的 path 吗?举个例子,这些莫名其妙的教程,在用户环境变量下设置的是:
    NODEJS_PATH D:/nodejs/
    PATH D:/nodejs/
    Path D:/nodejs/
    [随便写的一个名字] D:/nodejs/

    🤔,我就是因为 直接运行 npm 没成功,然后照这些弄了还没成功
    codehz
        10
    codehz  
       350 天前   ❤️ 1
    @dyxang #9 你可以在改用户 PATH 重启后用 cmd echo %PATH% 看看结果,有的话就说明应用上了,出的问题是别的问题(
    lxilu
        11
    lxilu  
       350 天前
    json 对 cmd 太重了,何不 powershell ConvertFrom-Json?
    lc1450
        12
    lc1450  
    OP
       349 天前
    @lxilu powershell 不是很熟悉,用过几次,不知道 ms 咋想的,搞个内部的 curl,和独立的 curl 语法不一致,搞得很难受,所有没怎么用
    jq 是 c 写的,对性能影响没多大吧
    dorothyREN
        13
    dorothyREN  
       349 天前
    @lc1450 #12 你说的那个 curl 是个别名吧。
    lc1450
        14
    lc1450  
    OP
       349 天前
    好像是的
    PS C:\Users\Administrator> curl --help
    curl : 未能解析此远程名称: '--help'
    所在位置 行:1 字符: 1
    + curl --help
    + ~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest],WebExce
    ption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
    Darkatse
        15
    Darkatse  
       348 天前
    直接 scoop install curl wget / scoop install npm nodejs 就行了,系统变量什么的直接给你配置好了
    lxilu
        16
    lxilu  
       344 天前
    删除别名 curl -> Invoke-WebRequest
    del alias:\curl
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2599 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:22 · PVG 22:22 · LAX 06:22 · JFK 09:22
    ♥ Do have faith in what you're doing.