Board logo

标题: [注册表类] 【已解决】批处理CD /D 无法进入变量路径的吗? [打印本页]

作者: hztccy    时间: 2024-12-30 16:56     标题: 【已解决】批处理CD /D 无法进入变量路径的吗?

本帖最后由 hztccy 于 2024-12-31 16:38 编辑
  1. @echo off
  2. ren 查询注册表并获取桌面路径
  3. for /f "tokens=3" %%i in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v desktop') do (    Set DesktopPath=%%i)
  4. rem 进入目标
  5. CD /D "%DesktopPath%"
  6. ren 确认变量路径已被获取
  7. echo "%DesktopPath%"
复制代码
有意思的来了,我在有的电脑可以直接使用这样的方法CD进入,但是有的电脑却会提示【系统找不到制定的路径】。

通过echo "%DesktopPath%"是确实获取了路径的,说有空格吧,但是我已经用了双引号,说获取不到位置吧我用echo已经确认了变量的路径。

懵逼了
作者: 77七    时间: 2024-12-30 17:10

call set 或者call cd /d
作者: hztccy    时间: 2024-12-30 19:53

call set 或者call cd /d
77七 发表于 2024-12-30 17:10



    在我自己家里的电脑加入了call cd /d确实成功获取路径了。明天到其他地方试试
作者: ygqiang    时间: 2024-12-30 20:33

本帖最后由 ygqiang 于 2024-12-30 21:09 编辑
在我自己家里的电脑加入了call cd /d确实成功获取路径了。明天到其他地方试试
hztccy 发表于 2024-12-30 19:53


直接这样不行吗?


echo "%USERPROFILE%\Desktop"
pause >nul
作者: aloha20200628    时间: 2024-12-30 21:07

本帖最后由 aloha20200628 于 2024-12-30 21:36 编辑

回复 1# hztccy

   采用 for /f ... %%i in () do ... 句式获取的返回值其实质是管道文件数据流,如同采用 for /f ... %%i in (1.txt) do set v=%%i 或 set/p v=<1.txt 读取外部文件一样,变量v中包含的%...%字段未经cmd预处理染指,故会作为原始字面量保全在变量v中。楼主可先将
   abc%x%zyx
   存为1.txt,再用以下代码验证结果 》即变量v中包含的 %x% 并不会被自动展开求值... 同理回到一楼代码,变量 DesktopPath 所包含的 %USERPROFILE% 也不会被自动展开求值... 至于对其再求值的两种解决方法已如二楼所示
  1. @echo off &setlocal &set "x=0"
  2. echo,x=%x%
  3. set/p v=<1.txt
  4. echo,%v%
  5.    echo,再求值
  6.    call set v=%v%
  7.    echo,  %v%
  8. for /f "delims=" %%i in (1.txt) do set "v=%%i"
  9. echo,%v%
  10.    echo,再求值
  11.    for /f "delims=" %%i in (1.txt) do call set "v=%%i"
  12.    echo,  %v%
  13. pause&exit/b
复制代码

作者: hztccy    时间: 2024-12-30 22:10

直接这样不行吗?


echo "%USERPROFILE%\Desktop"
pause >nul
ygqiang 发表于 2024-12-30 20:33



    我一楼的帖子已经写了,在一部分电脑是可以获取成功的,一部分电脑是不可以获取的,目前我正在观测是什么引起的这一个现象,大概率就如二楼的大哥说的,可能需要加入call调用以确保在每一部电脑都可以成功获取。目前我在我自己家里,不管是否加入call都可以成功获取路径,所以这才是我纠结的。
作者: hztccy    时间: 2024-12-30 22:11

回复  hztccy

   采用 for /f ... %%i in () do ... 句式获取的返回值其实质是管道文件数据流,如同采用 ...
aloha20200628 发表于 2024-12-30 21:07



    哥,你的太复杂了,就我着榆木脑袋想不出这么详细的公式方法,因为我习惯了直接for 。。快捷高效。233
作者: hztccy    时间: 2024-12-31 09:23

回复 2# 77七


    哥,能帮我解释一下为啥添加了一个call 引用就可以正常获取了。我测试了大概7-8台电脑都正产了。
作者: 77七    时间: 2024-12-31 12:53

回复 8# hztccy


  
  1. echo "%DesktopPath%"
复制代码
得到
  1. "%USERPROFILE%\Desktop"
复制代码


其中 %USERPROFILE% 未进行扩展,只是一个普通字符串,由于不存在这个路径,所以报错。


使用call 脱去%USERPROFILE% 的百分号,进行扩展,得到 C:\Users\用户a


辅助理解,假如一个文件夹名为  %批处理之家% 需要进入此路径 批处理命令则为 cd %%批处理之家%% ,如果使用cd %批处理之家%,会扩展 %批处理之家% ,未定义则为空值,如果使用 call cd /d %%批处理之家%%,同样为空值。
作者: hztccy    时间: 2024-12-31 16:36

回复 9# 77七


    原来如此,感谢大佬解释




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2