Board logo

标题: [文件操作] 【已解决】批处理for多数值递归不到后面的值? [打印本页]

作者: hztccy    时间: 2024-11-22 17:11     标题: 【已解决】批处理for多数值递归不到后面的值?

本帖最后由 hztccy 于 2024-11-28 12:36 编辑
  1. @echo off
  2. CD /D C:\Users
  3. for %%i in (123.* *456.* 789.*) do (
  4.     echo 可删除的: %%i
  5. )
复制代码
搜索不到*456.*和789.*只能查找到123.*的文件

对for总是一知半解,搞不懂,我哪里错了

但是我使用CD命令
  1. cd /d C:\users\public\desktop
复制代码
然后在使用
  1. for %%i in (123.* *456.* 789.*) do (
  2.     echo 可删除的: %%i
  3. )
复制代码
却可以循环123.* *.456.* 789.*全部文件
求大佬指教

答案:在20楼,问题出在for不会扫描带有隐藏属性的路径内文件,就算路径下的其他文件不为隐藏属性,但是文件夹处于隐藏属性时,依然会被for给忽略不在扫描该路径下的其他文件
作者: 77七    时间: 2024-11-22 19:22

是不是文件有隐藏属性?试一下  dir /b /a-d "C:\Users"
作者: aloha20200628    时间: 2024-11-22 21:00

本帖最后由 aloha20200628 于 2024-11-22 21:10 编辑

回复 1# hztccy

for %%i in (...*...?...) 这个句式仅匹配当前目录下的目标文件,而 123.* 文件在 C:\users 目录下,但 *456.* 789.* 文件却在 C:\users\public\desktop 这个目录下,因此才会导致一楼两段代码的不同结果...
以下代码会匹配出全部目标文件(全路径)
  1. @echo off
  2. CD /D C:\Users
  3. for /r %%i in (123.* *456.* 789.*) do (
  4.     echo 可删除的: %%i
  5. )
  6. pause
复制代码

作者: hztccy    时间: 2024-11-23 21:20

回复  hztccy

for %%i in (...*...?...) 这个句式仅匹配当前目录下的目标文件,而 123.* 文件在 C:\use ...
aloha20200628 发表于 2024-11-22 21:00



    奇怪,我也是试过使用/R参数,但是我在三台Windows10电脑分别测试,发现其中有一台电脑,依然是只能123.*后面的都不识别
作者: aloha20200628    时间: 2024-11-23 21:45

回复 4# hztccy

再试试下一行代码的结果...
  1. cd /d c:\users & dir /b/s/a "123.*" "*456.*" "789.*"
复制代码

作者: hztccy    时间: 2024-11-24 17:10

回复 5# aloha20200628


    DIR命令我试过,能找到我需要的文件,就是使用for无法找到
作者: Batcher    时间: 2024-11-24 17:38

回复 1# hztccy
  1. @echo off
  2. cd /d "C:\users\public\desktop"
  3. for /f "delims=" %%i in ('dir /b /s /a-d "123.*" "*456.*" "789.*"') do (
  4.     echo %%i
  5. )
  6. pause
复制代码

作者: aloha20200628    时间: 2024-11-24 17:50

本帖最后由 aloha20200628 于 2024-11-24 17:53 编辑

回复 6# hztccy

可以认为 for /f ... ('...') 是一个可获取返回值的命令行接口,调用系统内置命令或外部执行程序就是了...
  1. @echo off & cd /d c:\users
  2. for /f "delims=" %%v in ('dir /b/s/a "123.*" "*456.*" "789.*" ') do echo,%%v
  3. pause&exit/b
复制代码

作者: hztccy    时间: 2024-11-25 10:12

回复 7# Batcher


    加入DIR的方式,我试过是可以的,目前就是直接使用for 或 for /R的参数只是无法完全递归出来,正在纠结这个。
作者: hztccy    时间: 2024-11-25 10:13

回复 8# aloha20200628


    调用外部DIR我试过,之前已经说过了可以的,现在纠结的是,不调用外用外部命令就真的无法递归出来了嘛?
作者: qixiaobin0715    时间: 2024-11-25 10:28

本帖最后由 qixiaobin0715 于 2024-11-25 10:53 编辑

回复 10# hztccy
dir是内部命令而不是外部命令。现在你不用再纠结了,for /d,for /r,以及不带任何参数的for循环,这三者在设计时就忽略了隐藏文件的显示。如果你非要想着进入死胡洞,那就要看看是否已练就穿墙术了。
处理文件时,如果没有特殊需求的话尽量使用for /f+dir的形式,for /f与其它形式的for循环处理文件的方式不同,后者容易出现你意想不到的问题。
作者: aloha20200628    时间: 2024-11-25 16:42

本帖最后由 aloha20200628 于 2024-11-25 16:51 编辑

回复 10# hztccy

回到一楼的问题报告(假定没有隐藏文件的问题)》先用以下代码
  1. cd /d "c:\users" & for %%i in (123.* *456.* 789.*) do echo %%i
复制代码
不用 /r 可以搜索到 123.* 文件,但搜索不到 *456.* 789.* 文件,改用以下代码
  1. cd /d "c:\users\public\desktop" & for %%i in (123.* *456.* 789.*) do echo %%i
复制代码
不用 /r 可以搜索到 123.* *456.* 789.* 文件

      证明一: c:\user 目录和 c:\users\public\desktop 目录中均有 123.* 文件,虽不在同一位置
      证明二: c:\user 目录中没有 *456.* 789.* 文件

楼主同意或可确认以上两个证明结论吗?

作者: hztccy    时间: 2024-11-25 18:41

回复 12# aloha20200628


    我的123.* 456.* 789.*均在C:\Users\Public\Desktop有文件,那么我CD /D 到C:\users时,就应该可以直接for循环出来,但是现在for循环只在C:\users这一层级上,在往下Public\Desktop这个层级却是不曾搜索。
这里才是我纠结的位置。
作者: hztccy    时间: 2024-11-25 18:42

回复 11# qixiaobin0715


    其实如果for可以不加dir的情况,这样其实是有利于我缩短代码量,优化简短一些代码,这个是我比较想实现的,虽然for+dir虽然可以,但是却会额外增加代码难度。
作者: aloha20200628    时间: 2024-11-25 20:14

本帖最后由 aloha20200628 于 2024-11-25 20:22 编辑

回复 13# hztccy

这次先回到4楼,楼主确认用以下代码
  1. cd /d c:\users & for /r %%i in (123.* *456.* 789.*) do echo %%i
复制代码
在3台电脑中的2台已测试通过,只有1台未能搜索到 *456.* 789.* 文件,如此已经证明调用 for /r ... 句式用法没有问题,是可以递归搜索到当前目录及其各子目录中的目标文件,至于 ‘搜索未果’ 的那台电脑实况是因隐藏文件所致,还是其他... 就另当别论了

作者: hztccy    时间: 2024-11-25 23:18

回复 15# aloha20200628


    然而并非如此,三台电脑,都是我作用测试的实体机,并非虚拟机和客服机,文件均是我为了测试而创建,也就不存在隐藏文件一说
作者: qixiaobin0715    时间: 2024-11-26 08:37

本帖最后由 qixiaobin0715 于 2024-11-26 08:47 编辑

回复 14# hztccy
缩短代码有什么作用呢?况且代码长度也没有增加多少啊,难度增加了吗?11楼最后一句说的还不够清楚吗?有点撞到南墙还不回头的意味。
你出现的问题确实有点奇怪,还是找身边懂代码人给你会诊会诊。
还可以使用attrib命令看一下异常文件的属性到底如何。
作者: hztccy    时间: 2024-11-27 10:16

回复 15# aloha20200628


    隐藏属性不存在的,因为我作为测试,电脑是123.* 456.* 789.*均为我新创建的文件,所以隐藏属性不存在。这里现在就是我最纠结的,到底是递归的问题,还是其他问题引起还在摸索中。。。
作者: qixiaobin0715    时间: 2024-11-27 10:31

本帖最后由 qixiaobin0715 于 2024-11-27 10:34 编辑

是不是新创建的文件名有问题,要么就是路径有问题,试试下面的代码:
  1. @echo off
  2. cd /d "C:\Users"
  3. for /r %%i in (*123.* *456.* *789.*) do echo,%%i
  4. pause
复制代码
或者
  1. @echo off
  2. cd /d "C:\Users"
  3. for /r %%i in (*123* *456* *789*) do echo,%%i
  4. pause
复制代码

作者: aloha20200628    时间: 2024-11-27 11:41

本帖最后由 aloha20200628 于 2024-11-27 12:11 编辑

回复 18# hztccy

好吧,再跟楼主最后来一道逻辑排查》就拿有问题的那台电脑作个测试,先克隆 与无问题电脑完全相同 的目录结构 c:\users\public\desktop 和其中的文件 123.* *456.* 789.* 文件,再用以下代码(存为 test.bat 或直接在命令行运行)重新测试看其运行结果,如果与前两台电脑一样可以顺利通过,万事大吉了,否则就只能拷问这台问题电脑本身的系统或硬件了...
  1. @cd /d "c:\users" && (for /r %%i in (123.* *456.* 789.*) do @echo,%%i) & pause
复制代码

作者: Five66    时间: 2024-11-27 20:56

public下的desktop文件夹是隐藏的
作者: hztccy    时间: 2024-11-28 12:34

回复 21# Five66


    你说对了。我把public下的desktop是隐藏的的问题给忽略了。不能扫描出来的就是desktop文件夹处于隐藏状态,另外另外可以正常扫描的desktop文件夹是正常显示的,所以for在到desktop这一层级时,发现desktop这个文件时隐藏的直接放弃扫描了。包括desktop文件夹内的其他文件都不扫描了
作者: 77七    时间: 2024-11-28 15:36

楼主得到的结论是错的,不妨自己验证下吧。
作者: aloha20200628    时间: 2024-11-29 12:25

本帖最后由 aloha20200628 于 2024-11-29 12:34 编辑

回复 1# hztccy

在win8.1简中系统cmd命令行测试结果如下》
c:\users\public\desktop 被系统默认设置为只读+隐藏目录
其中的被隐藏文件和非隐藏文件均可用 cd /d "c:\users" & dir /b/s/a-d ... 搜索到
其中的非隐藏文件依然可被 cd /d "c:\users" & for /r %f in ... 搜索到





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