空フォルダを削除する

自作スクリプトです。

emptyfolder.wsf

実行画面

説明

cscript emptyfolder.wsf /?
空フォルダ削除
使い方 : emptyfolder.wsf [path] [/popup[+|-]]

オプション :

path  : 検索するルートパス
popup : 確認ダイアログ
  • 引数で指定したフォルダ(サブフォルダを含む)内の空フォルダ(ファイル/フォルダを含まないフォルダ)を削除します。
  • 引数指定がない場合、実行ファイルのあるフォルダを基準にして動作します。
  • 空フォルダの親フォルダが空フォルダのみを保有する場合、親フォルダを含めて削除します。
  • ポップアップによる削除確認を行います。(確認なしを指定可能です)
  • CUI実行の場合でも、GUIで確認します。
    • sh.Popup関数近辺を変更すれば、修正可能です。お好みで修正ください。

ソースコード

emptyfolder.wsf<?xml version="1.0" encoding="UTF-16" standalone="yes" ?>
<package>
  <job>
    <runtime>
      <?job error="false" debug="true" ?>
      <description>空フォルダ削除</description>
      <unnamed type="string"  required="false" name="path"  helpstring="検索するルートパス" />
      <named   type="boolean" required="false" name="popup" helpstring="確認ダイアログ" />
    </runtime>
    <script language="JavaScript" src="../common/FileUtility.js"/>
    <script language="JavaScript" src="../common/Process.js"/>
    <script language="JavaScript"><![CDATA[
/*!
 * emptyfolder.wsf v1
 *
 * Copyright (c) 2018 toshi
 * Released under the MIT license.
 * see https://opensource.org/licenses/MIT
 */

/**
 * 空フォルダ削除
 * 引数で指定したフォルダ(サブフォルダを含む)内の
 * 空フォルダ(ファイル/フォルダを含まないフォルダ)を削除します。
 * 空フォルダの親フォルダが空フォルダのみを保有する場合、親フォルダを含めて削除します。
 * ポップアップによる削除確認を行います。(確認なしを指定可能です)
 * @requires    module:ActiveXObject('Scripting.FileSystemObject')
 * @requires    module:WScript
 * @requires    module:FileUtility.js(v10+)
 * @requires    module:Process.js(v8+)
 * @auther      toshi(https://www.bugbugnow.net/)
 * @license     MIT License
 * @version     1
 * @see         1 - 初版
 */
(function () {
  "use strict";

  var iscscript = Process.isCScript();

  function main(path) {
    if (path == null) {
      // 引数なし時、カレントディレクトリを使用する
      path = sh.CurrentDirectory;
    }

    // 空フォルダを検索
    var dlist = [];
    FileUtility.findLeafFolder(function (fullpath, folder) {
      if (FileUtility.isEmptyFolder(fullpath)) {
        // 上位のフォルダを空(自フォルダのみ)の場合、上位のフォルダを指定する
        fullpath = (function emptyTopFolder(fullpath) {
          var parent  = fs.GetParentFolderName(fullpath);
          var files   = FileUtility.getFiles(fullpath);
          var folders = FileUtility.getFolders(fullpath);
          return (files.length == 0  && folders.length == 1)? emptyTopFolder(parent): fullpath;
        })(fullpath);

        iscscript && WScript.Echo('search: '+fullpath);
        dlist.push(fullpath);
      }
    }, path);
    iscscript && WScript.Echo('');

    if (dlist.length != 0) {
      var ret = 1;
      if (Process.getNamedArgument('popup', true)) {
        var msg = dlist.join('\n');
        if (dlist.length > 16) {
          msg = dlist.slice(0, 16).join('\n') + '\n'
                  + 'etc...\n\n'
                  + 'Number of folders: '+dlist.length;
        }
        // ファイル削除をユーザ確認
        // cscriptの場合でも、GUIで確認する
        ret = sh.Popup(msg, 0, '削除', 1);
      }
      if (ret == 1) {
        for (var d=0; d<dlist.length; d++) {
          // ファイル削除を実行
          iscscript && WScript.Echo('delete: '+dlist[d]);
          FileUtility.Delete(dlist[d]);
        }
      }
    } else {
      WScript.Echo('空フォルダなし');
    }
  }

  Process.exec(main, true);
})();
    ]]></script>
  </job>
</package>

変更履歴

更新日説明
2018/06/15[v1][add] 初版

補足

FileUtility.js, Process.jsファイルが別途必要となります。

結合済みjseファイル

emptyfolder.wsfを1ファイルにまとめたファイルは、以下のリンク先に配置しました。

※拡張子が「.txt」の場合、「.jse」に変更してください。
※文字コードは、UTF-16で保存してください。
※結合には、「WSFファイルを1ファイルに結合する」を使用しています。