[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

:victory::victory::victory::victory::victory:

TOP

回复 33# amwfjhh


    也就批处理最熟,其他都只是半入门状态,脑子已经有点乱了,所以更不敢碰 c++ 什么的

TOP

回复 16# CrLf


    回车 兄头脑里那么多脚本方案,遇到待处理问题的时候它们会不会在头脑里打架哦……

TOP

精彩!!!

TOP

回复 30# CrLf


    这个问题终于有了分析结果

http://www.bathome.net/redirect. ... 02&fromuid=3023
天的白色影子

TOP

回复 29# terse


    新姿势get!
    但没想明白,%%a 无取值的 for /f 为什么会这样调皮:
  1. (for /f %%a in ('dir /ad /b test') do break)&echo !errorlevel!
  2. (for /f %%a in ('dir /ad /b test') do break)||echo !errorlevel!
复制代码
看来可以推翻 qzw 胸“管道符与重定向,如 |,&,||,&&,>,>>,1>,2> 等不改变 errorlevel” 的说法了:http://bbs.bathome.net/viewthread.php?tid=7479

TOP

用纯P搞它
  1. @echo off
  2. for /d /r %%a in (*) do (
  3.    (for /f %%b in ('dir /ad/b %%a') do break)||(
  4.         echo %%a
  5.         pause
  6.    )
  7. )
  8. pause
复制代码
1

评分人数

    • CrLf: ( for /f ... )||( ... )技术 + 1

TOP

回复 27# zhanglei1371


    卧槽,ws.Exec 不给力,那用 ws.Popup 之类的吧,反正起到暂停效果了
1

评分人数

TOP

回复 26# CrLf


    我用如下代码测试,似乎起不到暂停作用:
  1. @if (0)==(0) echo off
  2. cscript /nologo /e:jscript %0
  3. pause&exit/b
  4. @end
  5. WScript.echo('sdfsdfsdfsdfsdfsdfsd0000123')
  6. System('pause')
  7. WScript.echo('sdfsdfsdfsdfsdfsdfsd0000123')
  8. function System(commandline){
  9.         var ws = new ActiveXObject('WScript.Shell')
  10.         return ws.Exec('cmd /c '+commandline)
  11. }
复制代码
怎么回事?是否我的代码哪里有误?

TOP

回复 25# zhanglei1371


    最简单的是虚拟一个 system 函数,想 dir 或者 echo 什么的用它就可以了,不过和 c 的 system 函数一样需要调用外部程序,效率比较低
  1. System('pause')
  2. function System(commadline){
  3. var ws = new ActiveXObject('WScript.Shell')
  4. return ws.Exec('cmd /c '+commandline)
  5. }
复制代码

TOP

本帖最后由 zhanglei1371 于 2014-5-10 21:29 编辑

回复 24# CrLf


    Many Thx!!!最后一点,我把前面三楼你的代码列出,去掉后面的>a.txt,然后,在中间加上一句:WScript.Echo(ar),不过,怎么才能像上面的command()例子代码中一样,显示一个,按任意键后,再出现下一个?
  1. @if (0)==(0) echo off
  2. dir /ad /s /b | cscript /nologo /e:jscript %0
  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. WScript.Echo(ar[i])  //这里怎么能查看一次,暂停一下,按任意键后再显示下一个?
  9.    if(ar[i+1].indexOf(ar[i])==0){ar.splice(i,1)}
  10. }
复制代码

TOP

回复 22# zhanglei1371


    这种写法修改自 powerbat 的混编方案:
  1. @set @n=0/*
  2. batCode
  3. exit /b
  4. */
  5. jsCode
复制代码
terse 修改出了另一种写法,不需要写变量:
  1. @if (0)==(0) echo off
  2. batCode
  3. exit /b
  4. @end
  5. jsCode
复制代码
二者各有千秋,随便哪个都可以
1

评分人数

TOP

回复 22# zhanglei1371


js 默认用 wscript 运行,此时不支持 StdIn、StdOut、StdErr
解决方法有两个,一个是用 cscript 运行,另一个是用 fso.GetStandardStream(N)
参考
建议用 cscript 运行,比如这样保存为 bat:
  1. @set @n=0/*&echo off
  2. cscript -nologo -e:jscript %0
  3. pause & exit /b
  4. */
  5. var cmd = new Command()
  6. var str = cmd.set.p('请输入任意算式,回车确定\n')
  7. try{
  8.         cmd.set.a('Num='+str)
  9.         cmd.echo('结果是:'+Num)
  10. }
  11. catch(e){
  12.         cmd.echo(Num)
  13.         cmd.exit(1)
  14. }
  15. cmd.set.p('任意键退出')
  16. function Command(){
  17.         this.echo = function (str){WScript.Echo(str)}
  18.         this.exit = function (num){WScript.Quit(num)}
  19.         this.set = {
  20.                 a:function (str){eval(str)},
  21.                 p:function (str){
  22.                                 WScript.StdOut.Write(str)
  23.                                 return WScript.StdIn.ReadLine()
  24.                         }
  25.         }
  26. }
复制代码
1

评分人数

TOP

回复 21# CrLf


    我存为js文件,运行后,出现:

TOP

返回列表