标题: [注册表类] 批处理for命令无法直接使用系统变量%USERPROFILE%和%ALLUSERSPROFILE%? [打印本页]
作者: bluesnan 时间: 2012-3-4 13:21 标题: 批处理for命令无法直接使用系统变量%USERPROFILE%和%ALLUSERSPROFILE%?
本帖最后由 bluesnan 于 2012-3-4 16:10 编辑
最近发现在for命令下无法直接使用系统变量的问题,比如我想从注册表获取系统桌面的路径,然后删除某个特定的文件:- @echo off
- FOR /F "skip=4 delims= tokens=2*" %%a in ('REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Common Desktop"') do
-
- (
- echo %%b
- DEL /F /Q "%%b\文件名.txt"
- )
- pause
复制代码
如果以上Common Desktop的值是“%ALLUSERSPROFILE%\桌面”,那么Del命令就会无法执行;
如果Common Desktop的值是绝对的“C:\Documents and Settings\All Users\桌面”,那么Del命令就能成功执行。
我目前采用的变通方法是调用一个中间的bat文件来实现:- FOR /F "skip=4 delims= tokens=2*" %%a in ('REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Desktop"') do (
- ECHO DEL /F /Q "%%b\文件名.txt">"C:\MoveLink.bat"
- CALL "C:\MoveLink.bat"
- )
复制代码
========================
上面仅仅是举一个例子,我实际的命令要比这复杂的多。采用中间调用bat的方法虽然能解决问题,但是修改代码比较费眼神。所以,有没有更好的解决办法?
我需要使用的系统路径有"桌面、开始菜单、我的文档、收藏夹"等等,从注册表中获取路径,如果包含%USERPROFILE%和%ALLUSERSPROFILE%就很麻烦的。
作者: canyuexiaolang 时间: 2012-3-4 15:06
应该不是那个的问题。win7不好测试。。
作者: find 时间: 2012-3-4 15:58
以顶楼第一个代码为例,请在最后加一行:
pause
然后把脚本执行的过程贴出来看看
作者: bluesnan 时间: 2012-3-4 16:09
回复 3# find
如果注册表里的路径是%ALLUSERSPROFILE%\桌面,则运行结果如下
作者: find 时间: 2012-3-4 16:25
回复 4# bluesnan
在del前面加个call
作者: bluesnan 时间: 2012-3-4 16:58
CALL 转义暂时解决问题,除了不能用在IF语句
作者: applba 时间: 2012-3-4 20:08
此问题的原因是:
循环体执行时由%b扩展出来的"%ALLUSERSPROFILE%\桌面",%ALLUSERSPROFILE%不会被替成具体的路径,也就是说%不会被识别成特殊字符。
要在执行时主动触发 对%的特殊功能解释,请使用call命令。
@echo off
FOR /F "skip=4 tokens=2* delims= " %%a in ('REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Common Desktop"') do (
call echo "%%~b\文件名.txt"
call del "%%~b\文件名.txt"
)
pause
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |