用python脚本修改windows环境变量

要安装maven然后修改环境变量,强迫症犯了想用python实现

方法1 os.environ

import os
MAVEN_VERSION = "apache-maven-3.6.3"
MAVEN_INST_DIR = r"d:\software\maven"
os.environ["MAVEN_HOME"] = f"{MAVEN_INST_DIR}/{MAVEN_VERSION}"

注意 只在当前环境有效,关闭命令窗口就失效了,如果想永久保存用setx /M

方法2 setx /M 命令

setx 命令是 Windows 操作系统中用于设置或修改用户或系统环境变量的命令。它支持以下几个参数:
* /M:将变量设置为系统级别,而不是当前用户级别。
* /S system:指定要在其中设置变量的远程系统。默认情况下,该命令在本地系统上设置变量。
* /U domain\user:使用其他用户身份运行 setx 命令,而不是当前登录用户身份。需要输入该用户的密码才能继续。
* /P password:与 /U 参数一起使用,指定使用的用户密码。

例如:
要以管理员身份将系统级别的变量 MY_VAR 设置为 Hello World,可以使用以下命令:Copy Codesetx MY_VAR “Hello World” /M如果要在远程计算机 remote_computer 上设置用户级别的变量 MY_VAR,可以使用以下命令:Copy Codesetx MY_VAR “Hello World” /S remote_computer需要注意的是,在使用 /U 和 /P 参数时,请确保输入的用户名和密码是正确的,并且具有足够的权限进行操作。

import subprocess
MAVEN_VERSION = "apache-maven-3.6.3"
MAVEN_INST_DIR = r"d:\software\maven"
#  将MAVEN_INST_DIR 加入MAVEN_HOME
subprocess.call(f"setx /M MAVEN_HOME {MAVEN_INST_DIR}\\{MAVEN_VERSION}", shell=True)
#  将MAVEN_HOME 加入PATH
subprocess.call(f"setx /M PATH \"%PATH%;{MAVEN_INST_DIR}\\{MAVEN_VERSION}\bin\"", shell=True)

**注意:**不能超过1024个字符,会被截取
详细参数如下

SetX 有三种使用方式:

语法 1:
    SETX [/S system [/U [domain\]user [/P [password]]]] var value [/M]
语法 2:
    SETX [/S system [/U [domain\]user [/P [password]]]] var /K regpath [/M]
语法 3:
    SETX [/S system [/U [domain\]user [/P [password]]]]
         /F file {var {/A x,y | /R x,y string}[/M] | /X} [/D delimiters]
描述:
    在用户或系统环境创建或修改环境变量。能基于参数、注册表项或文件输
    入设置变量。
参数列表:
    /S     system          指定要连接到的远程系统。
    /U     [domain\]user   指定应该在哪个用户上下文执行命令。
    /P     [password]      指定给定用户上下文的密码。如果省略则
                           提示输入。
    var                    指定要设置的环境变量。
    value                  指定分配给环境变量的值。
    /K     regpath         指定变量是基于注册表项的信息而设置的。
                           路径的格式应该是 hive\key\...\value。例如
                           HKEY_LOCAL_MACHINE\System\CurrentControlSet\
                           Control\TimeZoneInformation\StandardName。
    /F     file            指定要使用的文本文件的文件名。
    /A     x,y             指定绝对文件坐标(线 X,项目 Y)作为在此文件
                           里搜索的参数。
    /R     x,y string      指定有关“字符串”作为搜索参数的相对文件坐标。
    /M                     指定应该在系统 (HKEY_LOCAL_MACHINE) 环境中设
                           置此变量。在 HKEY_CURRENT_USER 环境下,默认
                           将设置此变量。
    /X                     用 x,y 坐标显示文件内容。
    /D     delimiters      指定其他限定符,如 "," 或 "\"。
                           内置分隔符是空格、制表符、回车和换行符。所有
                           ASCII 字符都可作为限定符。限定符的最大数量,
                           包括内置分隔符,是 15。
    /?                     显示此帮助消息。

注意:
1) SETX 在注册表中将变量写入主机环境。

  2) 在本地系统,用此工具创建或修改的变量将在以后的命令窗口可用,但
     在当前的 CMD.exe 命令窗口。

  3) 在远程系统,用此工具创建或修改的变量在下次登录会话可用。

  4) 有效的注册表项数据类型是 REG_DWORD,REG_EXPAND_SZ,REG_SZ
     和 REG_MULTI_SZ。

  5) 受支持的配置单元:  HKEY_LOCAL_MACHINE (HKLM),
     HKEY_CURRENT_USER (HKCU)。

  6) 限定符区分大小写。

  7) REG_DWORD 的值是从注册表里以十进制格式提取出来的。

示例:

SETX MACHINE COMPAQ
SETX MACHINE "COMPAQ COMPUTER" /M
SETX MYPATH "%PATH%"
SETX MYPATH ~PATH~
SETX /S system /U user /P password  MACHINE COMPAQ
SETX /S system /U user /P password MYPATH ^%PATH^%
SETX TZONE /K HKEY_LOCAL_MACHINE\System\CurrentControlSet\
     Control\TimeZoneInformation\StandardName
SETX BUILD /K "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows
     NT\CurrentVersion\CurrentBuildNumber" /M
SETX /S system /U user /P password TZONE /K HKEY_LOCAL_MACHINE\
     System\CurrentControlSet\Control\TimeZoneInformation\
     StandardName
SETX /S system /U user /P password  BUILD /K
     "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\
     CurrentVersion\CurrentBuildNumber" /M
SETX /F ipconfig.out /X
SETX IPADDR /F ipconfig.out /A 5,11
SETX OCTET1 /F ipconfig.out /A 5,3 /D "#$*."
SETX IPGATEWAY /F ipconfig.out /R 0,7 Gateway
SETX /S system /U user /P password  /F c:\ipconfig.out /X

方法3 "winreg"操作注册表

“winreg” 是 Python 中用于访问 Windows 注册表的模块

import winreg
MAVEN_VERSION = "apache-maven-3.6.3"
MAVEN_INST_DIR = r"d:\software\maven"
# 获取 PATH 环境变量的值
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, 'SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment')
path, _ = winreg.QueryValueEx(key, 'Path')
# 修改 MAVEN_HOME 环境变量的值
winreg.SetValueEx(key, 'MAVEN_HOME', 0, winreg.REG_EXPAND_SZ, f"{MAVEN_INST_DIR}\\{MAVEN_VERSION}")
# 修改 PATH 环境变量的值
new_path = f"{path};{MAVEN_INST_DIR}\\{MAVEN_VERSION}\\bin"
winreg.SetValueEx(key, 'Path', 0, winreg.REG_EXPAND_SZ, new_path)
# 关闭注册表项
winreg.CloseKey(key)

我运行这段报错如下:

    winreg.SetValueEx(key, 'Path', 0, winreg.REG_EXPAND_SZ, new_path)
PermissionError: [WinError 5] 拒绝访问。

考虑是前用户没有足够的权限来访问需要修改的注册表键,可以使用如下方法提升总之看看就好了,没有强迫症的不要试了。

  1. 以管理员身份运行您的 Python 脚本或 IDE。

  2. 修改需要访问的注册表键的权限,使得当前用户能够对其进行修改。
    具体的步骤如下:
    a. 打开注册表编辑器(按 Win + R,输入 “regedit”,回车)。
    b. 找到需要修改的注册表键。
    c. 右键单击该键,并选择 “权限”。
    d. 点击 “高级”。
    e. 点击 “添加”。
    f. 输入当前用户名,并点击 “检查名称”。
    g. 在 “类型” 下拉菜单中选择 “用户”。
    h. 在 “基本权限” 中勾选 “完全控制”。
    i. 点击 “确定”。
    j. 关闭注册表编辑器。

  3. 操作系统是 Windows 10尝试关闭 UAC(用户账户控制)。
    具体的步骤如下:
    a. 按 Win + R,输入 “msconfig”,回车。
    b. 在弹出的窗口中点击 “启动” 标签页。
    c. 找到 “用户账户控制:以管理员身份运行所有应用程序”,取消勾选。
    d. 点击 “确定”。
    e. 重新启动计算机

  4. 使用runas /user:administrator “python filename.py”
    runas 用法如下

RUNAS 用法:

RUNAS [ [/noprofile | /profile] [/env] [/savecred | /netonly] ]
        /user:<UserName> program

RUNAS [ [/noprofile | /profile] [/env] [/savecred] ]
        /smartcard [/user:<UserName>] program

RUNAS [ [/machine:<MachineType>] ] /trustlevel:<TrustLevel> program

   /noprofile        指定不应该加载用户的配置文件。
                     这会加速应用程序加载,但
                     可能会造成一些应用程序运行不正常。
   /profile          指定应该加载用户的配置文件。
                     这是默认值。
   /env              要使用当前环境,而不是用户的环境。
   /netonly          只在指定的凭据限于远程访问的情况下才使用。
   /savecred         用用户以前保存的凭据。
   /smartcard        如果凭据是智能卡提供的,则使用这个选项。
   /user             <UserName> 应使用 USER@DOMAIN 或 DOMAIN\USER 形式
   /showtrustlevels  显示可以用作 /trustlevel 的参数的
                     信任级别。
   /trustlevel       <Level> 应该是在 /showtrustlevels 中枚举
                     的一个级别。
   /machine          指定进程的计算机架构。
                     <MachineType> 应为 x86|amd64|arm|arm64 之一。
   program           EXE 的命令行。请参阅下面的例子

示例:
> runas /noprofile /user:mymachine\administrator cmd
> runas /profile /env /user:mydomain\admin "mmc %windir%\system32\dsa.msc"
> runas /env /user:user@domain.microsoft.com "notepad \"my file.txt\""

注意:  只在得到提示时才输入用户的密码。
注意:  /profile 跟 /netonly 不兼容。
注意:  /savecred 跟 /smartcard 不兼容。
(venv) PS D:\project\python\scriptPot> runas /user@Administrator python .\AutomatedMavenSetup.py
RUNAS 用法:

RUNAS [ [/noprofile | /profile] [/env] [/savecred | /netonly] ]
        /user:<UserName> program

RUNAS [ [/noprofile | /profile] [/env] [/savecred] ]
        /smartcard [/user:<UserName>] program

RUNAS [ [/machine:<MachineType>] ] /trustlevel:<TrustLevel> program

   /noprofile        指定不应该加载用户的配置文件。
                     这会加速应用程序加载,但
                     可能会造成一些应用程序运行不正常。
   /profile          指定应该加载用户的配置文件。
                     这是默认值。
   /env              要使用当前环境,而不是用户的环境。
   /netonly          只在指定的凭据限于远程访问的情况下才使用。
   /savecred         用用户以前保存的凭据。
   /smartcard        如果凭据是智能卡提供的,则使用这个选项。
   /user             <UserName> 应使用 USER@DOMAIN 或 DOMAIN\USER 形式
   /showtrustlevels  显示可以用作 /trustlevel 的参数的
                     信任级别。
   /trustlevel       <Level> 应该是在 /showtrustlevels 中枚举
                     的一个级别。
   /machine          指定进程的计算机架构。
                     <MachineType> 应为 x86|amd64|arm|arm64 之一。
   program           EXE 的命令行。请参阅下面的例子

示例:
> runas /noprofile /user:mymachine\administrator cmd
> runas /profile /env /user:mydomain\admin "mmc %windir%\system32\dsa.msc"
> runas /env /user:user@domain.microsoft.com "notepad \"my file.txt\""

注意:  只在得到提示时才输入用户的密码。
注意:  /profile 跟 /netonly 不兼容。
注意:  /savecred 跟 /smartcard 不兼容。

用这个命令需要开启administrator,把开启方法记录了下来
在Windows 10中,管理员账户(Administrator)默认情况下是禁用的,但您可以通过以下步骤启用它:
(1). 以管理员身份打开命令提示符。右键单击“开始”菜单,然后选择“命令提示符(管理员)”。
(2). 输入以下命令并按回车键:

net user administrator *
net user administrator /active:yes
(3). 确认操作后,重新启动计算机。
(4). 系统重启后,将看到登录屏幕有两个不同的用户。
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows 操作系统中,修改环境变量后需要重新打开命令行窗口或者重新启动计算机才能使修改生效。如果想要在 Python 脚本中实现修改环境变量后立即生效的功能,可以使用以下方法: 1. 使用 `os.environ` 对象修改环境变量,并且使用 `ctypes` 模块调用 `SendMessage` API 发送消息给 Windows Explorer 进程,通知它更新环境变量。示例代码如下: ``` import os import ctypes # 修改环境变量 PATH new_path = os.environ['PATH'] + ';C:\\NewFolder' os.environ['PATH'] = new_path # 发送消息给 Windows Explorer 进程,通知它更新环境变量 HWND_BROADCAST = 0xFFFF WM_SETTINGCHANGE = 0x1A SMTO_ABORTIFHUNG = 0x0002 result = ctypes.windll.user32.SendMessageTimeoutW( HWND_BROADCAST, WM_SETTINGCHANGE, 0, 'Environment', SMTO_ABORTIFHUNG, 5000, None ) if result == 0: print('Failed to update environment variables') else: print('Environment variables updated successfully') ``` 在代码中,首先使用 `os.environ` 对象修改环境变量 PATH,然后使用 `ctypes` 模块调用 `SendMessage` API 发送消息给 Windows Explorer 进程,通知它更新环境变量。如果更新成功,`SendMessage` API 将返回一个非零值,否则返回零。 2. 使用 `winreg` 模块修改系统注册表中的环境变量,并且使用 `win32api` 模块调用 `SendMessage` API 发送消息给 Windows Explorer 进程,通知它更新环境变量。示例代码如下: ``` import winreg import win32api # 修改环境变量 PATH with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as hkey: with winreg.OpenKeyEx(hkey, r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 0, winreg.KEY_WRITE) as key: new_path = winreg.QueryValueEx(key, 'PATH')[0] + ';C:\\NewFolder' winreg.SetValueEx(key, 'PATH', 0, winreg.REG_EXPAND_SZ, new_path) # 发送消息给 Windows Explorer 进程,通知它更新环境变量 HWND_BROADCAST = 0xFFFF WM_SETTINGCHANGE = 0x1A SMTO_ABORTIFHUNG = 0x0002 result = win32api.SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 'Environment', SMTO_ABORTIFHUNG, 5000) if result == 0: print('Failed to update environment variables') else: print('Environment variables updated successfully') ``` 在代码中,首先使用 `winreg` 模块修改系统注册表中的环境变量 PATH,然后使用 `win32api` 模块调用 `SendMessage` API 发送消息给 Windows Explorer 进程,通知它更新环境变量。如果更新成功,`SendMessage` API 将返回一个非零值,否则返回零。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值