Board logo

标题: [注册表类] 批处理for命令无法直接使用系统变量%USERPROFILE%和%ALLUSERSPROFILE%? [打印本页]

作者: bluesnan    时间: 2012-3-4 13:21     标题: 批处理for命令无法直接使用系统变量%USERPROFILE%和%ALLUSERSPROFILE%?

本帖最后由 bluesnan 于 2012-3-4 16:10 编辑

最近发现在for命令下无法直接使用系统变量的问题,比如我想从注册表获取系统桌面的路径,然后删除某个特定的文件:
  1. @echo off
  2. FOR /F "skip=4 delims= tokens=2*" %%a in ('REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Common Desktop"') do
  3. (
  4. echo %%b
  5. DEL /F /Q "%%b\文件名.txt"
  6. )
  7. pause
复制代码
如果以上Common Desktop的值是“%ALLUSERSPROFILE%\桌面”,那么Del命令就会无法执行;
如果Common Desktop的值是绝对的“C:\Documents and Settings\All Users\桌面”,那么Del命令就能成功执行。

我目前采用的变通方法是调用一个中间的bat文件来实现:
  1. FOR /F "skip=4 delims= tokens=2*" %%a in ('REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Common Desktop"') do (
  2. ECHO DEL /F /Q "%%b\文件名.txt">"C:\MoveLink.bat"
  3. CALL "C:\MoveLink.bat"
  4. )
复制代码
========================
上面仅仅是举一个例子,我实际的命令要比这复杂的多。采用中间调用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://bathome.net./) Powered by Discuz! 7.2