プロが教えるわが家の防犯対策術!

フォルダーの名前をフォルダーの中にあるテキストファイルの内容により自動変更の方法有りますでしょうか?

現在の構成はこのようになっています。c:\temp\は適当につけてあります。
c:\temp\folder1\textfile.data
c:\temp\folder2\textfile.data
c:\temp\folder3\textfile.data
~
c:\temp\folder999\textfile.data
となっており、
変更は
c:\temp\folder1\textfile.data のファイルの中身はJSON形式になっており、その中に
"title":{"en":"English Name1","ja":"日本名1","int":"Internal Name1"},
の様に記述されている日本名をそのファイル名にしたいわけです。

c:\temp\folder999\textfile.dataの中身は普通のテキストファイルです。

結果的に
c:\temp\folder1\

c:\temp\日本名1\
となります。

そういうファイルやフォルダーが沢山あるわけですが、Windows Script, DOS batch script,phpでもなんでも良いのですが良い案は有りますでしょうか?

分かりにくければ補足します。

A 回答 (2件)

Windows Script でやるならば



c:\> cscript.exe hoge.wsf c:\temp

-- hoge.wsf
<?XML version="1.0" standalone="yes" ?>
<package><job id="qa8986367">
<runtime><usage>フォルダ名を配下のJSONファイルに従って変更します</usage></runtime>
<object id="fso" progid="Scripting.FileSystemObject" />
<script language="JavaScript"><![CDATA[(function(){_=0;
_ ; function forEach(obj, proc) { for (var c = new Enumerator(obj); !c.atEnd(); c.moveNext()) proc(c.item()); }
_ ; var a = WScript.arguments; if (a.count() < 1) { a.showUsage(); WScript.quit(1) }
_ ; var name = a.item(0);
_ ; var targetFolder = fso.getFolder(name);
_ ; var result = [];
_ ; forEach(targetFolder.subFolders, function(folder) {
_ , _ ; var titleJa = null;
_ , _ ; forEach(folder.files, function(file){
_ , _ , _ ; if (!(/\.data$/.test(file.name))) return; // 特定のファイル名
_ , _ , _ ; var st = file.openAsTextStream(1/*ForReading*/);
_ , _ , _ ; var text = st.readAll();
_ , _ , _ ; st.close(); if (!text) return; // テキストファイル
_ , _ , _ ; var data = eval("(" + text + ")");
_ , _ , _ ; if (!(data && typeof data == 'object')) return; // JSON 形式
_ , _ , _ ; if (data.title && data.title.ja) titleJa = data.title.ja;
_ , _ ; });
_ , _ ; if (!titleJa) return; // 変名対象外
_ , _ ; if (folder.name != titleJa) {
_ , _ , _ ; folder.name = titleJa;
_ , _ , _ ; result.push(folder.name + " -> " + titleJa);
_ , _ ; } else {
_ , _ , _ ; result.push(folder.name + " nochange"); // 既に変名済み
_ , _ ; }
_ ; });
_ ; WScript.echo(result.join('\n')); // 結果報告
})()]]></script>
</job></package>

簡単に書いたので JSON 解析を eval で行っていますが、
セキュリティを気にかける用途ならば、別途 JSON 処理ライブラリを盛り込んでください。
    • good
    • 0
この回答へのお礼

返信が遅れ大変失礼しております。
まだ成功はしていませんが、お時間を取っていただきありがとうございます。

お礼日時:2015/06/01 01:36

>"title":{"en":"English Name1","ja":"日本名1","int":"Internal Name1"},


お書きのデータが1行に収まっているのであれば、バッチで出来ます。

cd /d C:\Temp
for /d %%A in (*) do for /f "tokens=4-5 delims=,:" %%B in (%%A\textfile.data) do if %%B == "ja" ren %%A %%C

そうで無ければ、Ruby/Perl/PHP等でJSONライブラリを使うのでしょうかね。
    • good
    • 0
この回答へのお礼

返信が遅れ大変失礼しております。
現在まだ成功はしておりませんが、個人的に一番近い物を提供して頂いていると思っておりますので、ベストアンサーに選ばせて頂きたく思います。お時間を取っていただき有り難うございます。

お礼日時:2015/06/01 01:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!