XFiler.RegisterCommand("swap_case_first_char", "ファイル名先頭の大文字小文字反転", function () {
    // 1. 選択されているアイテムを取得
    var items = XFiler.GetSelectedItems();
    if (items.length === 0) return false;

    var count = 0;

    /**
     * 再帰的にファイルを処理する
     * @param {string} relPath 
     */
    function processRecursive(relPath) {
        if (XFiler.IsDirectory(relPath)) {
            // ディレクトリの場合は中身を走査（ディレクトリ自体はリネームしない）
            // GetItems を使って全アイテム（ファイル・ディレクトリ）をまとめて取得
            var subItems = XFiler.GetItems(relPath);
            for (var i = 0; i < subItems.length; i++) {
                processRecursive(path.join(relPath, subItems[i]));
            }
        } else {
            // ファイルの場合
            var base = path.basename(relPath);

            // 先頭がアルファベットかチェック
            if (/^[a-zA-Z]/.test(base)) {
                var firstChar = base.charAt(0);
                var swapped = (firstChar === firstChar.toUpperCase())
                    ? firstChar.toLowerCase()
                    : firstChar.toUpperCase();

                var newBase = swapped + base.substring(1);

                if (base !== newBase) {
                    if (XFiler.Rename(relPath, newBase)) {
                        count++;
                    }
                }
            }
        }
    }

    // 処理開始
    for (var i = 0; i < items.length; i++) {
        processRecursive(items[i]);
    }

    if (count > 0) {
        XFiler.Log(count + " 件のファイルをリネームしました。");
        XFiler.Refresh();
        return true;
    }

    return false;
});
