命令行使windows环境变量立即生效

本文介绍了在Windows系统中设置环境变量的各种方法,包括使用注册表、命令行工具(如reg和wmic)、以及如何使更改立即生效。还讨论了设置过程中可能遇到的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章来源:http://blog.youkuaiyun.com/huanglong8/article/details/53574040

用户变量和环境变量对于Windows系统级应用开发有着至关重要的意义。

最重要的一项功能便是我们可以通过DOS命令行或运行时指令进行本地过程调用,从而避免诸多路径相关的问题,例如冗长的路径字符串造成的溢出,短路径未设置,长路径带空格,路径前后双引号命令无效等。

对于大型集成系统而言,集成框架,集成脚本等一系列第三方应用,也需要设置很多环境变量,这一点体现在它们的doc文档或readme中,这对于集成方案是不利好的,也对用户体验是不良好的。

在最近的一次系统级产品研发中,需要解决此项问题,即是一次安装,自动设置。解决环境变量的设置,可以通过命令行,注册表来完成,但若要使其生效,需要注销或重新登录操作系统,这无疑是要解决的重要问题。

针对环境变量及相关资料可继续参考如下链接:
http://m.blog.youkuaiyun.com/article/details?id=44462313

设置环境变量可以用以下几种命令参考:

1.Reg注册表文件

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
"MyTestValue"="C:\Path\Dir"

这种办法简单可行,就是不能对已存在的值进行追加,例如追加Path环境变量

2.reg命令行

reg add "HKCU\Environment" /v MyTestValue /t reg_sz /d "C:\Path\Dir" /f

具体的可参照reg /?来进行查看。
如果需要设置Path的追加值,则需要先查询Path,在进行修改。
注意这里不能用echo %path%来进行查询,因为这里的path是全部的搜索路径,即包括系统环境变量的,也包括用户环境变量的。所以正确的做法应该还是查询注册表。

:: 查询注册表项值存入到mypath临时变量中
for /f "delims=" %%i in (
'reg.exe query 
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" 
/v "Path"'
) do set mypath="%%i" 
:: 对mypath进行截取字符串,去除前30个字符,去除后一个字符
set mypath=%mypath:~30,-1%
:: 对mypath追加路径
set mypath=%mypath%;C:\Path\Dir
:: 重新设置并覆盖到注册表中
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d "%mypath%" /f

3.wmi命令行

使用wmic命令查询较为方便,但针对如下情况:

for /f "delims=" %%i in ('wmic.exe ENVIRONMENT where "name='Path' and username='<system>'" get VariableValue') do set mypath="%%i"

进行查询赋值时,发现经过了三次赋值,最终赋值为””空而结束,在查阅了相关for循环指令后,都没能解决,感情兴趣的朋友可以试试,并分享下解决方法。执行后:
这里写图片描述
出现这个问题后,就没在忘后面写了,其实剩下的内容很简单

wmic ENVIRONMENT where "name='Path' and username='<system>'" set VariableValue="%mypath%;C:\Path\Dir"

4.立即生效设置的说明

有网友说如果是Win7以下系统,通过wmic设置后,是直接自动生效的,对于已加载的cmd或explorer当然是无法做到的。
win7以上系统wmic设置后,仍然无法立即生效,这里查阅相关资料和其他网友的研究,可以通过setx进行设置

setx Path /K "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\Path\" /M

这个命令执行后,在新打开的cmd或explorer中,已更新的环境变量就已设置成功了。通常如果,需要在当前的cmd下也设置成功,可以补充SET Path = %mypath%即可。可针对已运行explorer或其他已打开的进程,则无能为力。

5.发送windows消息进行更新广播

关于SendMessageTimeout可参考
http://baike.baidu.com/link?url=3BJdatQNLK0rqfR5XBSFO6afozQTKl06d0O0r7ZYhoc_YxnkLxhZ_OMMDLx20SUBTjcFiSloeywG9WqS_LKvAohhdaDPDA6LAjcuCYekHma

SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,0,(LPARAM)TEXT(“Environment”),SMTO_ABORTIFHUNG,5000,&ret);

如果是Unicode编码要注意转码TEXT或L,否则无效,多字节的话强转就可以了。但是经过测试发现,只有在新启动的窗口中,新的环境变量被更新了,已运行的窗口仍然没有被更新,虽然此函数设置了通知方式为广播,但仍未生效,感兴趣的朋友可以尝试利用pid获取窗口句柄进行再测试,这里就不搞了。
经过以上各种方法尝试,设置环境变量在集成系统项目中也是举步维艰,存在bug的一步,整理了网上搜罗的资料和项目中尝试的方法,也算是功德圆满了。要搞它,这么多方法,应该总有一个可以吧,再不行,咱们就弹框让用户不爽的重启吧。

注意:
1.批处理和DOS命令,%%和%的区别。
2.C的字符编码还是要小心以下,遵照规范,否则即便使用了也不会生效。

<think>我们正在讨论如何在MySQL命令行中调用存储过程。根据用户提供的引用,特别是引用[2]和引用[4]中提到了调用存储过程的方法,我们可以总结如下: 在MySQL命令行中调用存储过程的步骤: 1. 登录MySQL命令行。 2. 选择数据库(如果存储过程在特定数据库中)。 3. 使用`CALL`语句调用存储过程。 如果存储过程有参数,则需要在`CALL`语句中传递参数。 具体步骤: 1. **登录MySQL命令行**: 在操作系统的命令行中使用以下命令登录(替换`[username]`和`[password]`): ```bash mysql -u [username] -p ``` 然后输入密码。 2. **选择数据库**: 在MySQL命令行中,使用`USE`语句选择存储过程所在的数据库: ```sql USE your_database; ``` 3. **调用存储过程**: - 如果存储过程没有参数: ```sql CALL procedure_name(); ``` 注意:即使没有参数,括号`()`也不能省略。 - 如果存储过程有参数: 根据存储过程定义的参数顺序传递参数,例如: ```sql CALL procedure_name(arg1, arg2, ...); ``` 参数可以是字面值(如字符串、数字)或变量。 **重要提示**:在传递日期时间等特殊类型时,注意格式。引用[4]中显示了一个错误,可能是因为传递的日期时间格式不正确。正确的日期时间字面值应该用引号括起来,并且符合MySQL的日期时间格式,例如: ```sql CALL procedure_with_date('2012-01-01 12:12:12'); ``` 4. **处理输出**: 存储过程可能产生结果集(如SELECT语句的结果),在命令行中会直接显示。如果存储过程有OUT参数,则需要使用变量来捕获。 例如,对于有OUT参数的存储过程: ```sql -- 定义用户变量接收输出 CALL procedure_with_output(123, @output_value); -- 然后查询该变量 SELECT @output_value; ``` 5. **关于分隔符(DELIMITER)**: 在创建存储过程时,我们通常需要改变分隔符(如引用[2]和[3]中所示),以避免存储过程定义中的分号被解释为语句结束。但在调用存储过程时,不需要改变分隔符,因为`CALL`语句本身是一个单独的语句,以分号结束。 **示例**: 假设我们有一个名为`case_inter_sum`的存储过程(如引用[3]所示),它没有参数。调用方式为: ```sql CALL case_inter_sum(); ``` 如果存储过程有参数,例如有一个存储过程`quqiufeng`,它接受一个日期参数,则调用为: ```sql CALL quqiufeng('2020-01-01 10:00:00'); ``` **常见错误及解决**: - **存储过程不存在**:确保存储过程在当前的数据库中,并且名称正确。 - **参数数量或类型不匹配**:检查存储过程的定义,确保传递的参数数量和类型匹配。 - **权限问题**:确保当前用户对存储过程有`EXECUTE`权限。 **引用说明**: - 引用[2]提供了调用存储过程的基本方法,包括在命令行中先选择数据库,然后使用`CALL`语句[^2]。 - 引用[4]则提醒我们在传递参数时要注意语法,特别是日期时间格式,需要用引号括起来,否则会报语法错误[^4]。 因此,在命令行中调用存储过程的关键就是使用`CALL`语句,并正确传递参数。 §§相关问题§§ 1. 如何在MySQL中创建带参数的存储过程? 2. 如何查看MySQL中已存在的存储过程? 3. 如何删除MySQL中的存储过程? 4. 如何处理存储过程中的错误?</think>### 如何在MySQL命令行中调用存储过程 在MySQL命令行中调用存储过程需要遵循特定的语法和步骤。以下是详细的操作指南,结合引用中的关键信息: #### 步骤1:登录MySQL命令行 ```bash mysql -u 用户名 -p # 输入密码后进入MySQL交互环境 ``` #### 步骤2:选择数据库 ```sql USE 数据库名; -- 引用[2]强调必须先选择数据库 ``` #### 步骤3:调用存储过程 根据存储过程是否有参数,分为两种情况: 1. **无参数存储过程**(引用[2][3]示例): ```sql CALL 存储过程名(); -- 示例:CALL case_inter_sum(); ``` **注意**:即使没有参数,括号`()`也必须保留 2. **带参数存储过程**(引用[4]注意事项): ```sql CALL 存储过程名(参数1, 参数2, ...); -- 示例:CALL update_order('2023-06-15', 1001); ``` **关键要点**: - 字符串参数必须用单引号包裹(引用[4]错误示例) - 日期参数格式:`'YYYY-MM-DD HH:MM:SS'` - 参数顺序必须与存储过程定义一致 #### 完整操作示例 ```sql /* 登录MySQL */ mysql -u root -p /* 选择数据库 */ USE sales_db; /* 调用无参数存储过程 */ CALL generate_daily_report(); /* 调用带参数存储过程 */ CALL update_inventory('2023-06-15 14:00:00', 105, 50); ``` #### 常见错误及解决(引用[4]) 1. **语法错误**: ```sql ERROR 1064 (42000): You have an error in your SQL syntax ``` **解决方法**: - 检查参数格式(日期/字符串是否缺引号) - 确认括号配对:`CALL proc_name();` - 验证存储过程是否存在:`SHOW PROCEDURE STATUS;` 2. **权限问题**: ```sql ERROR 1370 (42000): execute command denied ``` **解决方法**: ```sql GRANT EXECUTE ON database_name.* TO 'user'@'localhost'; ``` 3. **参数类型不匹配**: - 检查存储过程定义:`SHOW CREATE PROCEDURE 过程名;` - 确保传递参数类型与定义一致 #### 辅助命令 | 命令 | 作用 | 示例 | |------|------|------| | `SHOW PROCEDURE STATUS` | 查看所有存储过程 | - | | `SHOW CREATE PROCEDURE 过程名` | 查看存储过程定义 | `SHOW CREATE PROCEDURE case_inter_sum` | | `SELECT @@event_scheduler` | 检查事件调度器状态 | - | > **重要提示**:如果通过事件调度器调用存储过程失败,请检查: > 1. 事件调度器状态:`SET GLOBAL event_scheduler=ON;` > 2. 事件是否启用:`ALTER EVENT 事件名 ENABLE;` > 3. MySQL错误日志:通常位于`/var/log/mysql/error.log`
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值