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

[文本处理] [已解决]批处理for套dir时使用变量扩展为什么不对?

[复制链接]
发表于 2023-11-2 10:57:56 | 显示全部楼层 |阅读模式
本帖最后由 hfgjgx 于 2023-11-5 10:33 编辑

执行

  1. [code]@echo off
  2. for /f "delims=" %%i in ('dir /b /ad "C:\Users"') do (
  3. echo "%%~i"
  4. )
复制代码
正确显示了C:\Users下的文件夹名

但一旦用了其他形式的变量扩展,无论是什么形式,echo输出的都是批处理所在的文件路径
例如
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /ad "C:\Users"') do (
  3. echo "%%~pi"
  4. )
复制代码
显示的是批处理所在的文件路径
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /ad "C:\Users"') do (
  3. echo "%%~di"
  4. )
复制代码
显示的是批处理所在的盘符
怎么解决,为什么?

评分

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

查看全部评分

发表于 2023-11-2 11:59:03 | 显示全部楼层
回复 1# hfgjgx


    我测试这个代码一切正常。请把你遇到错误的完整代码发出来看看?
发表于 2023-11-2 14:37:16 | 显示全部楼层
  1. @echo off
  2. >1.txt dir /b /ad "C:\Users"

  3. for /f "delims=" %%i in (1.txt) do (
  4. echo "%%~i"
  5. )
  6. pause
复制代码

分解一下
发表于 2023-11-2 15:27:25 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2023-11-6 14:29 编辑

这种情况就不要把路径写在for里面了:
  1. @echo off
  2. cd /d "C:\Users"
  3. for /f "delims=" %%i in ('dir /b /ad') do echo "%%~i"
复制代码
顶楼的代码运行目录未转换,只是在for循环中指定了要显示的目录中的文件夹名,当前目录还是批处理所在的目录。
需要使用cd命令将当前目录转换为 C:\Users 就不会发生你所说的情况了。

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

发表于 2023-11-3 14:03:24 | 显示全部楼层
%%~i 是什么,为什么不是 %%i
 楼主| 发表于 2023-11-3 14:24:40 | 显示全部楼层
回复 2# ShowCode

我因该没讲清楚,我改了一下帖子,请再看一下
 楼主| 发表于 2023-11-3 14:24:53 | 显示全部楼层
回复 4# qixiaobin0715
我因该没讲清楚,我改了一下帖子,请再看一下
 楼主| 发表于 2023-11-3 14:25:18 | 显示全部楼层
回复 3# 77七
我因该没讲清楚,我改了一下帖子,请再看一下
 楼主| 发表于 2023-11-3 14:25:39 | 显示全部楼层
回复 5# czjt1234
参见for /?
发表于 2023-11-3 14:40:50 | 显示全部楼层
回复 7# hfgjgx
我想一开始就知道你什么意思,你运行4楼代码有何问题吗?还有哪点没说清楚?
发表于 2023-11-3 15:16:38 | 显示全部楼层
如3楼所示,for /f 只是处理dir 的结果,要分开看

比如 你问我姚明身高,我会默认是中国打篮球的姚明,其实你问的是你在国外认识的踢足球的姚明

同样要 扩展 文件的信息, 需要知道它的绝对路径,否则默认是相对路径。(当然如果问姚明姓什么(文件名)除外)
发表于 2023-11-3 15:43:26 | 显示全部楼层
回复 1# hfgjgx


试试我这个思路能否理解:

dir /b /ad "C:\Users" 命令得到的结果集就是普通的字符串,假设结果如下:
Admin
ZhangSan
LiSi

虽然dir命令知道它们是一个一个的文件夹,但是这个结果集交给for命令处理的时候,for命令只知道它们是字符串,不知道它们是文件或文件夹或其它东西,当然更不知道它们在哪个路径下面。

对于for命令来说,其效果在一定程度上类似于:
  1. @echo off
  2. for /f "delims=" %%i in ('echo Admin^&echo ZhangSan^&echo LiSi') do (
  3.     echo "%%~i"
  4. )
复制代码
显而易见,for命令不会知道这些字符串在哪个路径下。这就是顶楼现象的原因。
发表于 2023-11-3 21:42:20 | 显示全部楼层
我用
dir /b /s /ad "C:\Users"
加了个 /s 测试可以
因为加了个 /s 后输出结果天生就是完整路径
对完整路径可以各种扩展
发表于 2023-11-4 00:15:11 | 显示全部楼层
for语句的变量拓展其实是字符串匹配
例如
%~i 是匹配变量 i 开头跟结尾0个或1个双引号之间的内容
%~di 是匹配开头1个字符跟1个英文冒号,匹配不了就使用当前路径拼接 i 后再次匹配(???)
%~xi 是去掉变量 i 结尾的空格和点号,匹配最后一个英文点号到结尾之间的内容
%~ti 是用变量 i 的内容匹配文件名,并获取对应的时间
发表于 2023-11-4 23:13:37 | 显示全部楼层
本帖最后由 /zhqsystem/zhq 于 2023-11-4 23:22 编辑

因为你dir没加/s参数,只会获取文件夹名称,扩展路径也只会扩展到批处理默认的%cd%路径,需要二次加入dir的文件夹完整路径.示例:"C:\Users\%%~nxi[也可以用%%i和%%~i但不能使用%%~ni该值只适用无英文点的环境]"完整写法是
1,
cd/d C:\Users
for /f "delims=" %%i in ('dir/ad/b "%cd%\*.*"') do echo,%cd%\%%~nxi
2,

for /f "delims=" %%i in ('dir/ad/b "C:\Users\*.*"') do for /f "delims=" %%j in ("C:\Users\%%~nxi")do echo,%%~fj&&rem特别说明如果%%i不需要引用这里的%%j全部可选为%%i的参数,只有需要时候不能改变
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 10:23 , Processed in 0.023369 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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