找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 21532|回复: 13

[文本处理] [已解决]批处理如何转换 for /f 提取文本中带环境变量的路径为实际对应路径

[复制链接]
发表于 2023-1-26 16:53:26 | 显示全部楼层 |阅读模式
如图所示:Test.txt 文本中的第一列是带环境变量的路径(如:%UserProfile%\Desktop) 第二列是文件名(如:Test.exe)
那么:
  1. for /f "skip=1 tokens=1,2" %%a in (Test.txt) do if exist %%a\%%b del /q %%a\%%b
复制代码
此时的%%a是字符串形式的 %UserProfile%\Desktop 而不是对应的 C:\Users\[用户名]\Desktop,请问这种情况要如何转换为实际路径,使后面的删除文件命令可以执行成功?



评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-1-26 17:24:27 | 显示全部楼层
批处理本身就支持环境变量,不用特别转换

如果你不能成功删除

for /f "eol=# skip=1 tokens=2-6" %%b in (Test.txt) do @echo %%b\%%c

看看运行结果
 楼主| 发表于 2023-1-26 20:05:24 | 显示全部楼层
本帖最后由 lonron 于 2023-5-8 10:09 编辑

回复 2# czjt1234


  
我知道cmd可以识别环境变量,但是for /f 的方式提取 Test.txt 文本中 路径 这段的时候,直接显示的结果就是 %UserProfile%\Desktop 而不会自动转成当前账户对应的 C:\Users\[用户名]\Desktop,所以导致我后面的判断失败不能删除 C:\Users\[用户名]\Desktop\测试.exe 文件。
 楼主| 发表于 2023-1-26 20:12:06 | 显示全部楼层
回复 2# czjt1234


   

所以才想知道这种情况要怎么才能正确识别
发表于 2023-1-26 20:38:54 | 显示全部楼层
本帖最后由 77七 于 2023-1-26 20:50 编辑

大概涉及到变量嵌套了,可以参考一下这个帖子,我也正在学习中...批处理中的变量嵌套变量用法
  1. @echo off
  2. for /f "skip=1 tokens=1,2" %%a in (Test.txt) do (
  3.         call echo %%a\%%b
  4. )
  5. pause
复制代码


我能写出来,但是我也不是很清楚为什么要这样写
要是判断 可以call set m=%%a 在for语句里面判断需要开启延迟变量
更新
  1. @echo off
  2. for /f "skip=1 tokens=1,2" %%a in (Test.txt) do (
  3.         call if exist %%a\%%b (
  4.                 echo 存在
  5.         )
  6. )
  7. pause
复制代码


这样居然也可以

评分

参与人数 1技术 +1 收起 理由
lonron + 1 解燃眉之急

查看全部评分

 楼主| 发表于 2023-1-26 21:23:36 | 显示全部楼层
回复 5# 77七


    用call这个妙啊,不过我没明白你不是说判断的话要开启延迟变量吗,但是第二段示例好像没开也可以得到正确结果。
 楼主| 发表于 2023-1-26 21:33:54 | 显示全部楼层
回复 5# 77七
  1. @echo off
  2. for /f "skip=1 tokens=1,2" %%a in (Test.txt) do (
  3.         call if exist %%a\%%b (
  4.                 echo 存在
  5.         )
  6. )
  7. pause
复制代码
  1. @echo off
  2. for /f "skip=1 tokens=1,2" %%a in (Test.txt) do call if exist %%a\%%b (echo 存在)
  3. pause
复制代码
为什么换成下面这段就不正常了,显示if不是内部命令
发表于 2023-1-26 21:36:47 | 显示全部楼层
本帖最后由 77七 于 2023-1-26 21:39 编辑

回复 6# lonron

把%%a赋值给m,在for语句里面判断 要开
直接判断就不用了

回复 7# lonron
写成多行吧,我也不明白
 楼主| 发表于 2023-1-26 21:40:51 | 显示全部楼层
回复 8# 77七


    好的,我吸收下,感谢帮助
 楼主| 发表于 2023-1-27 12:09:46 | 显示全部楼层
回复 8# 77七


    刚有测试了下,判断的那段代码虽然可以转换环境变量,但好像结果并不是正确的,如果我把目标文件改成别的名称它依然会显示“存在”。
发表于 2023-1-27 15:57:25 | 显示全部楼层
本帖最后由 terse 于 2023-1-27 15:58 编辑

变通一下 for里这样
  1.      call cd /d  %%a\
  2.      if exist %%b del /q %%b
复制代码
  1.      call cd /d  %%a\
  2.      if exist %%b del /q %%b
复制代码

评分

参与人数 1技术 +1 收起 理由
lonron + 1 这个拆分用的有点妙,学习了

查看全部评分

发表于 2023-1-27 16:00:51 | 显示全部楼层
  1. @echo off
  2. for /f "skip=1 tokens=1-2" %%a in (Test.txt) do (
  3.     call :Next %%a\%%b
  4. )
  5. pause & exit

  6. :Next
  7. if exist "%~1" echo;del "%~1"
复制代码
  1. @echo off
  2. for /f "skip=1 tokens=1-2" %%a in (Test.txt) do (
  3.     for /f "delims=" %%i in ('echo;%%a\%%b') do (
  4.         if exist "%%i" echo del "%%i"
  5.     )
  6. )
  7. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
lonron + 1 多套一个循环好像对我代码里实际应用更贴切 ...

查看全部评分

发表于 2023-1-27 16:11:58 | 显示全部楼层
或者,不用if判断,直接删除
  1. @echo off
  2. for /f "skip=1 tokens=1-2" %%a in (Test.txt) do (
  3.     call del "%%a\%%b" 2>nul
  4. )
  5. pause
复制代码
发表于 2023-1-27 17:04:10 | 显示全部楼层
回复 10# lonron

看来不能乱用,估计call把 if和echo当成两条命令了
楼上两位大神已提供教科书般答案,我在续写一下我昨晚提到的call set,如果开延迟变量,可以省略赋值n,把if写到for语句里面
  1. @echo off
  2. for /f "skip=1 tokens=1,2" %%a in (Test.txt) do (
  3.         call set "m=%%a"
  4.         set "n=%%b"
  5. )
  6. if exist "%m%\%n%" (
  7.         echo 存在"%m%\%n%"
  8. )
  9. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 06:40 , Processed in 0.021710 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表