2017-04-07 7 views
-4

このようなスタックでは、次のような気分がしています。 Cmd tree to Json サブフォルダ内のファイルを子として表示する必要があります。 誰でも変更方法を知っていますか?CMDツリーからJSONへ

+3

はお答えすることができ、コーディングの問題ではなく、*「私のために私のコードを書いてください」ことが危険なほど近くにあります* – abelenky

+0

コードの素敵な作品だ、です私の+1。あなたはそれを学び、自分自身を拡張するべきです。 – LotPings

答えて

1

私は挑戦しただけで、JavaScriptからBatch + JScriptハイブリッドとしてJavaScriptからJScriptにインポートされたJSONメソッドを使用してソリューションを作成する可能性があると考えました。他の人が述べているように、将来の質問のために、コードであなたの努力を示すことを望みます。

このスクリプトは、何かを出力する前に、メモリ内に完全な再帰的階層を含むオブジェクトを作成することをお勧めします。それゆえ、遅くなる可能性があります。上にリンクされているフラット・テキスト・ソリューションはおそらくより高速になります。このスクリプトを作成する私の目的は、私自身の好奇心を満たすことでした。 :)

構文:directoryはオプションです

batfile.bat 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'));