返回列表 发帖
回复 14# apang


    确实如此,忽略了 \ 会影响排序,谢谢提醒
    代码已更新,小改成完全逆序,就不存在这个问题了

TOP

正准备反映一个问题的,就是最后一个文件会被忽略。。。

TOP

由于是逆序排列,实际遗失是的第一个目录下的第一个被记录的目录名

(for /f "delims=" %%a in ('dir /ad /s /b^|sort /+65535') do (

新改的代码,将所有的目录列举了,相当于是tree的效果。

TOP

回复 18# zhao3


    卧槽,好吧又掉坑里了,已修改

TOP

回复 3# CrLf


    想请教下,这种形式的写法该如何调试,单纯批处理我可以用pause和echo来查看变量的值,然后根据值的变化来对代码修正,这种情况该如何查看一个变量的值,如里面的数组ar,另外,我试了下加pause来暂停,发现没用。还望指点下,谢谢

TOP

回复 20# zhanglei1371


    可以这样玩下:
var cmd = new Command()
var str = cmd.set.p('请输入任意算式,回车确定\n')
try{
cmd.set.a('Num='+str)
cmd.echo('结果是:'+Num)
}
catch(e){
cmd.echo(Num)
cmd.exit(1)
}
cmd.set.p('任意键退出')
function Command(){
this.echo = function (str){WScript.Echo(str)}
this.exit = function (num){WScript.Quit(num)}
this.set = {
a:function (str){eval(str)},
p:function (str){
WScript.StdOut.Write(str)
return WScript.StdIn.ReadLine()
}
}
}COPY

TOP

回复 21# CrLf


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

TOP

回复 22# zhanglei1371


js 默认用 wscript 运行,此时不支持 StdIn、StdOut、StdErr
解决方法有两个,一个是用 cscript 运行,另一个是用 fso.GetStandardStream(N)
参考
建议用 cscript 运行,比如这样保存为 bat:
@set @n=0/*&echo off
cscript -nologo -e:jscript %0
pause & exit /b
*/
var cmd = new Command()
var str = cmd.set.p('请输入任意算式,回车确定\n')
try{
        cmd.set.a('Num='+str)
        cmd.echo('结果是:'+Num)
}
catch(e){
        cmd.echo(Num)
        cmd.exit(1)
}
cmd.set.p('任意键退出')
function Command(){
        this.echo = function (str){WScript.Echo(str)}
        this.exit = function (num){WScript.Quit(num)}
        this.set = {
                a:function (str){eval(str)},
                p:function (str){
                                WScript.StdOut.Write(str)
                                return WScript.StdIn.ReadLine()
                        }
        }
}COPY
1

评分人数

TOP

回复 22# zhanglei1371


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

评分人数

TOP

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

回复 24# CrLf


    Many Thx!!!最后一点,我把前面三楼你的代码列出,去掉后面的>a.txt,然后,在中间加上一句:WScript.Echo(ar),不过,怎么才能像上面的command()例子代码中一样,显示一个,按任意键后,再出现下一个?
@if (0)==(0) echo off
dir /ad /s /b | cscript /nologo /e:jscript %0
pause&exit/b
@end
var text = WScript.StdIn.ReadAll().replace(/\r?\n/g,'\\\n').toLowerCase()
var ar = text.split(/\n/).sort()
for(var i=ar.length-1;i--;){
WScript.Echo(ar[i])  //这里怎么能查看一次,暂停一下,按任意键后再显示下一个?
   if(ar[i+1].indexOf(ar[i])==0){ar.splice(i,1)}
}COPY

TOP

回复 25# zhanglei1371


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

TOP

回复 26# CrLf


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

TOP

回复 27# zhanglei1371


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

评分人数

TOP

用纯P搞它
@echo off
for /d /r %%a in (*) do (
   (for /f %%b in ('dir /ad/b %%a') do break)||(
        echo %%a
        pause
   )
)
pauseCOPY
1

评分人数

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

TOP

回复 29# terse


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

TOP

返回列表