2017-04-07 47 views
-4

我已经发现在堆栈中像这样sovelhing: Cmd tree to Json 我需要类似的东西,但也显示子文件夹中的文件作为孩子。 有谁知道如何改变它?与JSON的CMD树与

+3

这是不是编码问题,我们可以回答,而且是危险地接近*“请给我的代码为我” * – abelenky

+0

这是一个不错的代码,有一个从我+1。你应该研究它并扩展自己。 – LotPings

回答

1

仅仅因为我喜欢这个挑战,我想我可以使用从JavaScript导入到JScript中的JSON方法作为Batch + JScript混合使用解决方案。正如其他人所说,对于未来的问题,我希望你会在代码中展示你的努力。

请注意,此脚本将在输出任何内容之前在内存中构建一个包含完整递归层次结构的对象。因此,它可能会很慢。上面链接的平面文本解决方案可能会更快。制作这个剧本的目的是为了满足我自己的好奇心。 :)

语法:

batfile.bat directory 

哪里directory是可选的。如果省略,该脚本将当前目录视为层次结构的根。

脚本:

@if (@CodeSection == @Batch) @then 
@echo off & setlocal 

cscript /nologo /e:JScript "%~f0" "%~1" 

goto :EOF 
@end 

var fso = WSH.CreateObject('Scripting.FileSystemObject'), 
    htmlfile = WSH.CreateObject('htmlfile'), 
    JSON = tree = Array = {}, 
    path = WSH.Arguments(0) || '.'; 

htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />'); 
JSON = htmlfile.parentWindow.JSON; 
Array = htmlfile.parentWindow.Array; 
htmlfile.close(); 

function recurse(path) { 
    var dir = fso.GetFolder(path), 
     contents = new Array(); 

    for (var fc = new Enumerator(dir.SubFolders); !fc.atEnd(); fc.moveNext()) { 
     var obj = {}; 
     obj[fc.item()] = recurse(fc.item()); 
     contents.push(obj[fc.item()]); 
    } 

    for (var fc = new Enumerator(dir.Files); !fc.atEnd(); fc.moveNext()) 
     contents.push(fso.GetFileName(fc.item())); 

    var obj = {}; 
    obj[dir] = contents; 
    return obj; 
} 

tree = recurse(path); 

WSH.Echo(JSON.stringify(tree, null, '\t'));