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

[文件操作] [已解决]BAT批处理如何列只列出只底层的目录?

本帖最后由 zhao3 于 2014-5-13 23:55 编辑

示例:我的D盘有以下目录
D:\A1\A11\A111\A1111
D:\A1\A12\A121\
D:\A2\A23\
D:\A3\
D:\A4\
D:\A5\

现在我想得到如下输出:
D:\A1\A11\A111\A1111
D:\A1\A12\A121\
D:\A2\A23\
D:\A3\
D:\A4\
D:\A5\
使用TREE命令,会出现各级目录,而我不需要出现含有子目录的目录名
D:\A1\
D:\A2\
D:\A1\A11\
D:\A1\A12\
D:\A1\A11\A111\

先谢谢各位大侠了。。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  1. @echo off
  2. for /d /r "D:\" %%a in (*) do (
  3.     for /d %%b in ("%%a\*") do set a=1
  4.     if defined a (set a=) else echo,%%a
  5. )
复制代码

TOP

本帖最后由 CrLf 于 2014-5-10 04:28 编辑

算了还是用 bat + js 吧,各取其长:
  1. @if (0)==(0) echo off
  2. dir /ad /s /b | cscript /nologo /e:jscript %0 >a.txt
  3. pause&exit/b
  4. @end
  5. var text = WScript.StdIn.ReadAll().replace(/\r?\n/g,'\\\n').toLowerCase()
  6. var ar = text.split(/\n/).sort()
  7. for(var i=ar.length-1;i--;){
  8.    if(ar[i+1].indexOf(ar[i])==0){ar.splice(i,1)}
  9. }
  10. text = ar.join('\r\n').replace(/\\$/gm,'')
  11. WScript.Echo(text)
复制代码
2

评分人数

    • zhao3: 解决了我的我实际的问题,谢谢。技术 + 1
    • apang: for(var i=ar.length-1;i--;)学习了技术 + 1

TOP

本帖最后由 CrLf 于 2014-5-9 23:01 编辑

powershell 方案:
  1. $dr = get-childitem -Recurse
  2. $text = ForEach($_ in $dr){
  3.    if($_.PSIsContainer){
  4.       if(!$_.GetDirectories()){$_.FullName}
  5.    }
  6. )
  7. Set-Content -Encoding String -Value $text a.txt
复制代码
  1. Function list($Obj)
  2. {
  3.    if($DS = $Obj.GetDirectories()){
  4.       foreach($D in $DS){
  5.          list $D
  6.       }
  7.    } else {
  8.       $Obj.FullName
  9.    }
  10. }
  11. list (get-item .) | Set-Content -Encoding String a.txt
复制代码

TOP

谢谢二楼,三楼,真的很谢谢你们。
我用的CrLf的方案,执行效果很好,60K的文件30S+就完成了,太棒了。
另请问一下,保存得到的文件是相当于是逆序保存的,能正序保存吗,如果不难的话,正序最好了,当然我可以在excel中倒一下也行。
=======================================
如果你是老师,我可以为你提供一些系统的教学资源;
如果你的孩子还是幼儿,我可以为你提供一些幼教资源;
如果以上资源你都用不上,请PM我一下您的话,我充一点话费,略表心意。

TOP

如果以上资源你都用不上,请PM我一下您的电话,我充一点话费,略表心意。

TOP

顺序保存只需要 sort 一下就行:
  1. sort a.txt /o a.txt
复制代码

TOP

回复 5# zhao3


    楼主太客气了

TOP

太强大了。。。。
成功,谢谢。
还是pm一下吧。
哈哈。。。。

TOP

回复 3# CrLf
   
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Windows\System32>cd /d d:\test\

d:\test>dir /b /ad /s | sort /r
d:\test\新建文件夹\新建文件夹 - 副本
d:\test\新建文件夹 (2)\abc
d:\test\新建文件夹 (2)
d:\test\新建文件夹

d:\test>

这种情况下,貌似上下行比较会误判?

TOP

回复 10# apang


    用的是 !last:%%a\=!,好像不会误判吧

TOP

那跟贴再问一问:
提取目录内的第一个文件名作为目录名
因为目录名是无序的数字,里在文件名有意义。

TOP

回复 12# zhao3


    不同问题请单独开贴

TOP

回复 11# CrLf


   
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Windows\System32>cd /d d:\test\

d:\test>dir /b /ad /s | sort/r
d:\test\新建文件夹\新建文件夹 - 副本
d:\test\新建文件夹 2\abc
d:\test\新建文件夹 2
d:\test\新建文件夹
d:\test\abc

d:\test>test.bat

d:\test\新建文件夹\新建文件夹 - 副本
d:\test\新建文件夹 2\abc
d:\test\新建文件夹
请按任意键继续. . .

d:\test>

d:\test\新建文件夹 这一行按理说不应该显示出来?
1

评分人数

    • CrLf: 感谢指正!技术 + 1

TOP

我的本意,是没有子目录的目录都列出来。有子目录的,列最底层目录。

TOP

返回列表