以前写过一章节来制作Win下各语言的便携环境。
主要是三个步骤:
1、获取免安装版本
2、加入Path环境变量,便于命令行调用
3、加入注册表,便于图形化调用(大部分情况不需要)
对于其中1.获取免安装的版本,倒是很简单的事情,无论是直接下载官方提供的zip,又或者是自己从安装文件夹中进行提取。
对于其中3.加入注册表,我也写好了一个通用的reg模板,只要修改文件位置就行。
唯有其中的2.加入path环境变量的快捷脚本,随着日常的使用变得有些问题。
由于电脑中存在多种语言的环境变量,导致Path环境变量过长,
直接运行设置环境变量的bat时会提示path环境变量过长,在1024字符处截断,从而导致没有备份的情况下,使得注册表变得损坏。
查询资料发现网上的方案有三个:
1,将需要加入Path的环境变量,通过mlink命令创建一个硬链接,加入到一个已存在的path的目录下,如C:\windows目录下。
2,新建一个path1环境变量,将需要加入Path的环境变量,加入path1变量中,再将%path1%加入到path环境变量中。
3,直接通过注册表修改环境变量的值。
python通过操作windows系统注册表方式修改环境变量 - slqt - 博客园
https://www.cnblogs.com/slqt/p/5718154.html
#coding=utf8
#python3 OK
import os
import sys
import subprocess
try:
import win32api, win32con
except ImportError:
os.system('pip3 install pywin32 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com')
print('please run again !!!')
if sys.hexversion > 0x03000000:
import winreg
else:
import _winreg as winreg
#指定修改的时系统环境变量的注册表键值
root = winreg.HKEY_LOCAL_MACHINE
subkey = r'SYSTEMCurrentControlSetControlSession ManagerEnvironment'
def get_env(name):
#系统环境变量获取
key = winreg.OpenKey(root, subkey, 0, winreg.KEY_READ)
try:
value, _ = winreg.QueryValueEx(key, name)
except WindowsError:
value = ''
#print(value)
return value
def set_env(name, value):
#系统环境变量设置
# Note: for 'system' scope, you must run this as Administrator
key = winreg.OpenKey(root, subkey, 0, winreg.KEY_ALL_ACCESS)
winreg.SetValueEx(key, name, 0, winreg.REG_EXPAND_SZ, value)
winreg.CloseKey(key)
# For some strange reason, calling SendMessage from the current process
# doesn't propagate environment changes at all.
# TODO: handle CalledProcessError (for assert)
subprocess.check_call('''"%s" -c "import win32api, win32con;assert win32api.SendMessage(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE,0, 'Environment')"''' % sys.executable)
def add_env(name, value):
#系统环境变量增加
# Note: for 'system' scope, you must run this as Administrator
env_lib = get_env(name)
#判断环境变量是否存在,存在的话使用追加,不存在的话使用新建
if env_lib != '' :
#print('The variable [%s] was exist' % name)
#判断值是否已存在于变量,存在的话进行替换操作然后追加,不存在的话使用新建
if value+';' in env_lib:
#print('The value [%s] variable was exist' % value)
set_env(name,(value +';'+ env_lib.replace(value+';','')))
else:
#print('The value [%s] variable not exist' % value)
set_env(name,value+';'+env_lib)
else:
print('The variable [%s] not exist' % name)
set_env(name, value)
def dup_env(name):
#系统环境变量去重
# Note: for 'system' scope, you must run this as Administrator
env_lib = get_env(name)
#判断环境变量是否存在,存在的话进行拆分和合并,不存在的话忽略
if env_lib != '' :
#print('The variable [%s] was exist' % name)
env_lib = env_lib.replace(';;',';').replace('\;',';').strip('\')
env_lib_list = env_lib.split(';')
#列表去空
env_lib_list = [i for i in env_lib_list if i != '']
#列表去重
env_lib_new = []
for i in env_lib_list:
if i not in env_lib_new:
env_lib_new.append(i)
env_lib = ';'.join('%s' % i for i in env_lib_new)
#print('de-weight env_lib_new',env_lib_new)
set_env(name, env_lib)
else:
print('The variable [%s] not exist' % name)
def rank_env(name):
#系统环境变量去重
# Note: for 'system' scope, you must run this as Administrator
env_lib = get_env(name)
#判断环境变量是否存在,存在的话进行拆分和合并,不存在的话忽略
if env_lib != '' :
#print('The variable [%s] was exist' % name)
env_lib = env_lib.replace(';;',';').replace('\;',';').strip('\')
env_lib_list = env_lib.split(';')
#列表去空
env_lib_list = [i for i in env_lib_list if i != '']
#列表去重
env_lib_new = []
for i in env_lib_list:
if i not in env_lib_new:
env_lib_new.append(i)
env_lib_new.sort()
#print(env_lib_new)
env_lib = ';'.join('%s' % i for i in env_lib_new)
set_env(name, env_lib)
else:
print('The variable [%s] not exist' % name)
if __name__=='__main__':
usage="""
请使用管理员权限运行!!!
查询、追加设置、覆盖设置、去杂 指定环境变量!!!
scrpt_name -g 环境变量名称
scrpt_name -a 环境变量名称 环境变量的值
scrpt_name -s 环境变量名称 环境变量的值
scrpt_name -d 环境变量名称 (原顺)
scrpt_name -r 环境变量名称 (排顺)
""".replace('scrpt_name',sys.argv[0].rsplit('\',1)[-1]).strip()
if len(sys.argv) > 2:
name = sys.argv[2]
if sys.argv[1]== '-g' :
print(get_env(name))
elif sys.argv[1]== '-a' :
value = sys.argv[3]
add_env(name,value)
print(get_env(name))
elif sys.argv[1]== '-d' :
dup_env(name)
print(get_env(name))
elif sys.argv[1]== '-s' :
value = sys.argv[3]
set_env(name,value)
print(get_env(name))
elif sys.argv[1]== '-r' :
rank_env(name)
print(get_env(name))
else:
print(usage)
λ setenv.exe -h
['setenv.exe', '-h']
请使用管理员权限运行!!!
查询、追加设置、覆盖设置、去杂 指定环境变量!!!
setenv.exe -g 环境变量名称
setenv.exe -a 环境变量名称 环境变量的值
setenv.exe -s 环境变量名称 环境变量的值
setenv.exe -d 环境变量名称(原顺)
setenv.exe -r 环境变量名称(排顺)
-g get_env通过注册表查询系统环境变量的值。
-s set_env设置一个系统环境变量的值。
例:-a test 111 会使test环境变量变成111
-a add_env追加设置一个环境变量的值,会追加值到前面。
例:-a path 111 会使path环境变量变成111;path原来的的值
-d dup_env 将优化去重指定的环境变量,去重后不改变默认的顺序
-r rank_env 将优化去重指定的环境变量,按去重后会进行排序
例:-d path 会去重path环境变量
例:-r path 会去重path环境变量,并将环境变量进行排序
END
本文始发于微信公众号(NOVASEC):Windows下如何体面的修改环境变量
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论