[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[注册表类] 批处理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%就很麻烦的。

应该不是那个的问题。win7不好测试。。

TOP

以顶楼第一个代码为例,请在最后加一行:
pause
然后把脚本执行的过程贴出来看看

TOP

回复 3# find

如果注册表里的路径是%ALLUSERSPROFILE%\桌面,则运行结果如下

TOP

回复 4# bluesnan


在del前面加个call

TOP

CALL 转义暂时解决问题,除了不能用在IF语句

TOP

此问题的原因是:
循环体执行时由%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

TOP

返回列表