家园论坛
楼主 暖风 说:

Windows的环境变量(1)
(以下内容包括本人回帖,均属个人经验分享,如有谬误,敬请指出。请勿转载。)
在桌面上找到此电脑>上下文菜单>属性>高级系统设置>环境变量。
在这里我们可以看到很多的环境变量。其中包括用户变量和系统变量。
图形界面就介绍到这里,相信大家基本上都知道。而我一般更喜欢命令行操作。
在CMD窗口下执行下面的命令:
set >C:\环境变量.txt
这样就在c盘生成一个"环境变量.txt"文件。里面记载了系统大部分的环境变量。
(在CMD引用环境变量的时候,要在两边加上"%"。)
下面给出一些主要环境变量的解释:

%ALLUSERSPROFILE%
所有用户 Profile 文件位置
%APPDATA%
Roaming文件夹。大家可以自己查看。
%CD%
当前目录
%CMDEXTVERSION%
当前命令处理程序扩展版本号
%COMPUTERNAME%
计算机名
%COMSPEC%
可执行命令外壳(命令处理程序)的路径
%DATE%
当前日期
%ERRORLEVEL%
最近使用的命令的错误代码
%HOMEDRIVE%
用户主目录所在的驱动器盘符
%HOMEPATH%
用户主目录的完整路径
%LOCALAPPDATA%
Local文件夹。
%OS%
操作系统的名字( Windows XP 和 Windows 2000 列为 Windows_NT )
%Path%
可执行文件的搜索路径
%PATHEXT%
操作系统认为可被执行的文件扩展名
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
可执行文件的扩展名。
%PROCESSOR_ARCHITECTURE%
处理器的芯片架构
%PROCESSOR_IDENTFIER%
处理器的描述
%PROCESSOR_LEVEL%
计算机的处理器的型号
%PROCESSOR_REVISION%
处理器的修订号
%ProgramFiles%
%ProgramFiles(x86)%
Program Files 文件夹的路径
%RANDOM%
界于 0 和 32767 之间的随机十进制数
%SYSTEMDRIVE%
Windows 启动目录所在驱动器
%SYSTEMROOT%
Windows 启动目录的位置
%TEMP% and %TMP%
当前登录的用户可用应用程序的默认临时目录
%TIME%
当前时间
%USERNAME%
当前登录的用户的名字
%USERPROFILE%
当前用户 Profile 文件位置
%WINDIR%
操作系统目录的位置
 

2023-09-14 10:38:02
1楼暖风说: Windows的环境变量(2) 上一篇介绍了系统的主要的环境变量。那么这些环境变量怎么用呢?举个例子,先看下面的代码: @echo off if not exist %windir%\%~nx0 (move %0 %windir%\ & exit) echo 我是%~0 pause 把上面这段代码保存成"findme.bat"文件。然后在资源管理器里面找到他,回车运行。 什么都没发生。 不对,不是什么都没发生,findme.bat这个文件消失了。是真的消失了吗?我们在地址栏里面再运行一下试试。 按Alt+d键切换到地址栏,输入findme回车。 这时候按小键盘的28键就能看到这个脚本输出的信息了: 我是C:\WINDOWS\FindMe.bat 没错,findme.bat并不是消失了,而是被移动到了C:\WINDOWS。 我们再来看前面的代码。其中第2行的意思就是:如果操作系统的目录里面没有当前这个脚本,就把这个脚本移动到操作系统的目录下面并且结束。 所以我们第1次运行这个脚本的时候并不是什么都没有发生。而是把这个脚本移动到了系统目录下面。 由于系统目录包含在PATH中,所以第2次我们在地址栏里运行它的时候,系统会找到他并且运行。 这里我们不必知道系统目录是什么,只需要用环境变量%WINDIR%代替就可以了。有的小伙伴可能要问了,那系统目录不都是C:\WINDOWS这个目录吗?那可不一定,用过双系统的小伙伴可能知道系统目录有可能在d盘。 这只是一个简单的例子。如果你编写了一个批处理文件给你的好伙伴。而每次运行的时候都粘贴到当前文件夹下是很麻烦的。就可以用这个办法把它放在系统文件夹下面,这样每次在地址栏里面运行就可以了。 其实环境变量的应用还有很多。比如我要建立一个文件夹,文件夹名要包含当前的日期。比如我要判断当前的系统环境,然后执行对应的操作等等。 2023-09-14 10:43:35
2楼暖风说: Windows的环境变量(3) 在CMD窗口下执行下面的命令: set /? >c:\set.txt 这样就在西盘根目录生成了set命令的帮助文档。 (说明一下:我在文章里每次都把帮助文本文档生成在西盘的根目录,是因为这个目录在每个人的电脑里都有,相对也比较好找。而实际环境中C盘的根目录不适合放过多的文件,那样会比较乱。所以大家根据自己的情况去更改目录。) set命令很强大。也是批处理脚本中最常用的一个命令。 set.txt第1行是这样的:显示、设置或删除 cmd.exe 环境变量。 文档比较长,我在这里就不粘贴了。只是简单的举几个例 子。 ::设置mycmd变量。这是一个路径。 set "mycmd=e:\mycmd\" ::将%mycmd%添加到%path%中。 set "path=%mycmd%;%path%" ::设置一个字符串。 set" str=Thank you" 注意: 1、"="两边不要添加空格。 2、如果环境变量的值不含空格,两边的双引号可以省略。但是如果环境变量值包含空格,两边的双引号是不可以省略的。比如第3个例子。而在实际应用中如果不确定是否含空格,最好两边都加上双引号,这也是一个好习惯。 3、如果没有必要,尽量不要更改系统内置的环境变量。 在批处理中字符串处理是依靠创建和修改环境变量完成的。最常见的应用就是批量修改文件名。依然是举例说明: 假设我的g盘有两个邓丽君歌曲的文件夹:“邓丽君-1”和“邓丽君”。现在我想把这两个文件夹合并,并且希望同名文件不覆盖而自动改名,就是在后面加上一个序号。这里使用批处理解决。 代码如下: ::关闭回显。 @echo off ::设置原文件夹。 set "sou_dir=g:\邓丽君-1" ::设置目标文件夹。 set "des_dir=g:\邓丽君" for %%i in ("%sou_dir%\*.*") do call :move_file "%%i" exit ::下面是移动文件的子代码块。 :move_file ::初始化目标文件文件名。 set "new_file_name=%~n1" ::初始化序列号。 set num=1 :add_num ::如果文件存在就将文件名加上序列号并且把序列号加1在检查。一直到没有重名文件。 if exist "%des_dir%\%new_file_name%%~x1" (set "new_file_name=%~n1(%num%)" & set /a num+=1 & goto :add_num) ::移动文件。 move %1 "%des_dir%\%new_file_name%%~x1" ::call的调用返回。 goto :eof 注:代码中一个冒号开头的是标记,可供goto和call吊用。两个冒号开头的是注释。 有人说批处理脚本像个编程语言。在我看来。控制流程的语句只有4个:goto、call、if、for。掌握这4个语句再加上一个。set就入门了。上面这个例子这5种已经都包括了。读懂它就成功了一半。 当然我们这样写批处理是不够优雅的。我们可以对这个批处理稍作改动,用参数来传递两个文件夹。并且加上简单的错误处理和帮助信息,使它变得更具有通用性。修改后的代码如下: @echo off if "%~1" == "" goto :help if "%~1" == "/?" goto :help set "sou_dir=%~dpnx1" if not exist "%sou_dir%\.\" (set "err_info=源文件夹读取错误。" & goto :err) set "des_dir=%~dpnx2" if not exist "%des_dir%\.\" (set "err_info=目标文件夹读取错误。" & goto :err) if "%sou_dir%" == "%des_dir%" (set "err_info=源文件夹与目标文件夹相同。" & goto :err) for %%i in ("%sou_dir%\*.*") do call :move_file "%%i" goto :eof exit :move_file set "new_file_name=%~n1" set num=1 :add_num if exist "%des_dir%\%new_file_name%%~x1" (set "new_file_name=%~n1(%num%)" & set /a num+=1 & goto :add_num) move %1 "%des_dir%\%new_file_name%%~x1" goto :eof :err echo 出错了!%err_info% pause >nul :help echo 这个脚本可以将源文件夹里的文件合并到目标文件夹。 echo; echo 用法:%~n0 ^<源文件夹^> ^<目标文件夹^> echo 源文件夹和目标文件夹可以是相对路径或者绝对路径。 pause >nul goto :eof exit 把上面这段代码保存成Merge.bat,并且把它放在%path%包含的目录当中。这样我们在地址栏里运行下面这个命令就可以了: Merge 邓丽君-1 邓丽君 好了,似乎有点跑题了。再回到set命令。 set命令可以创建修改和删除环境变量,也可以做简单的运算。不过set命令设置的环境变量是临时的,只在当前CMD窗口下有效。也就是说我们新开一个窗口或者把这个窗口关了这些环境变量就不起作用了。 那么我们可不可以设置环境变量,让他在这个窗口关掉之后依然生效呢?我们下一篇再说。下一篇也是最后一篇,我们简单介绍一下setx命令和path环境变量。 说到邓丽君,最后我来分享一下以前整理的邓丽君的单曲合集(阿里云盘)。 https://www.aliyundrive.com/s/YFWTL2ucKCT 2023-09-14 10:51:06
3楼暖风说: Windows的环境变量(4) 上一次我们说到set命令设置的环境变量都是临时的。也就是不能写入注册表。 如果我们想一劳永逸的设置一个环境变量,方便以后随时调用,就要使用setx命令了。 依然是首先获取帮助文档,在命令行里执行: setx /? >c:\setx.txt 一看这个文章就是使用机器自动翻译的,很多地方语言都不通顺。不过勉强也可以看懂。一共三个格式。至少前两种格式可以看懂。第3种格式因为用不到,我也没研究过。 第1种格式很简单,这里只举一个例子吧。 setx javahome e:\java\home 这样就把一个环境变量写入到系统了。这也是学习java的小伙伴经常用到的。 默认是把环境变量添加到当前用户的环境变量中,使用参数/m可以把环境变量添加到系统环境变量中。 注意: 1、和set不同,setx语句中没有"=" 2、setx设置的环境变量在当前窗口无效。在新打开窗口的时候才生效。 3、还是那句话,系统中默认的环境变量不要修改,反正我没修改过,如果修改后会出现什么问题我也不知道。 当然也不是全部不能修改。有一个环境变量我们一定要修改,你不改,你安装的软件也会修改它,这个环境变量就是PATH。 PATH里面就是一条一条的路径,也叫目录或者文件夹。这些路径以分号分隔开。当你在命令行或者地址栏里输入一条外部命令的时候,系统首先会在当前文件夹寻找这个可执行文件,如果找不到就会到PATH里面按照每条路径一个一个去搜索。搜索到就会运行他,如果所有的路径都搜索不到,就会报错。 为了使用方便,我们经常会把一些命令行工具添加到PATH中。比如。abcmidi、ffmpeg。有时候我们也想把一些工具和自己写的脚本单独放在一个文件夹,也需要把这个文件夹添加到PATH中。 手动添加的方法就是打开环境变量的界面,然后编辑PATH。具体步骤我就不讲了,需要注意的是,编辑之后要点三个确定。 可不可以用命令行添加呢?比如说我要添加一个E:\my_cmd。 有的小伙伴可能想到了下面这条命令: setx path E:\my_cmd;%path% 从功能上讲,我们的目的确实达到了。但是你会发现用户的PATH环境变量中多出了很多东西。 这是因为PATH这个环境变量是用户环境变量和系统环境变量都有的。我们在命令行里列出的PATH环境变量是用户环境变量和系统环境变量合并的结果。我们使用上述的命令扩充PATH环境变量,就把系统的PATH也写入到用户的PATH当中了。这就出现了很多冗余的东西。同样道理,如果把它写入到系统环境变量当中也会出现类似的问题。 我们一班只希望把它写入用户的PATH。通过查找我们发现用户的环境变量在注册表当中的[HKEY_CURRENT_USER\Environment\],于是我们想到了直接修改注册表。 比如我们要添加E:\my_cmd。 第1步:我们用资源管理器打开E:\my_cmd,然后在地址栏里面输入CMD回车打开命令行窗口,运行以下命令: setx mypath /k HKCU\Environment\path 然后关闭命令行窗口。这样我们就把用户的PATH环境变量写入到mypath当中了。因为setx命令的特点。只有关闭窗口后才生效。 第2步:我们在资源管理器的命令行里输入CMD打开命令行窗口,运行下面命令: REG ADD HKCU\Environment /f /v Path /t REG_EXPAND_SZ /d %cd%;%mypath% 这样就把当前文件夹的路径添加到用户的PATH当中了。 有没有更简单的方法呢?一步搞定。 首先我们用下面的命令读取一下用户PATH: REG QUERY HKCU\Environment /v Path >mypath.txt 打开mypath.txt文件内容是下面这样的: (第1行是空行,论坛可能不显示,特此说明。我把第3行连续的空格改成了一个空格。) HKEY_CURRENT_USER\Environment Path REG_EXPAND_SZ C:\Users\x\AppData\Local\Programs\Python\Python310\Scripts\;...... 由此我们看出我们需要的是第3行第3部分的数据。于是写下了下面这样批处理。 @echo off if "%~1" == "/?" goto :help if not "%2" == "" (set "err_info=有多余的参数。" & goto :err) if "%~1" == "" (set "addd=%cd%") else (set "addd=%~dpnx1") if not exist "%addd%\.\" (set "err_info=源文件夹读取错误。" & goto :err) FOR /F "usebackq skip=2 tokens=3*" %%i in (`REG QUERY HKCU\Environment /v Path`) do set "path_tmp=%%i" echo "%path_tmp%" | findstr "%addd%;" && (echo 在用户PATH中该文件夹已经存在。 >>##%~n0.err & goto :end) REG ADD HKCU\Environment /f /v Path /t REG_EXPAND_SZ /d %addd%;%path_tmp% goto :end :err echo 出错了!%err_info% pause >nul :help echo 这个脚本可以将源文件夹添加到用户PATH中。 echo; echo 用法:%~n0 [源文件夹] echo 源文件夹可以是相对路径或者绝对路径,缺省则使用当前文件夹。 :end goto :eof exit 把上面这段代码保存成addp.bat,放在E:\my_cmd文件夹里运行。以后如果还想添加某一个文件夹,只需要用资源管理器打开那个文件夹,然后在地址栏里面输入addp回车就可以了。 2023-09-14 10:55:22
如发帖或回帖,请先点击登录
上一篇 写作的推理思维 下一篇 《2021试听小屋系列》280CD(全部单曲6150首+歌词+封面)
copy@2007-2019 ymax.cn Inc.All Rights Reserved
沂蒙爱心家园 版权所有 鲁ICP备 07012196 号
鲁公网安备37132302000324号
总访问量:11617728     当前在线人数:152