以下のエントリでdirコマンドを使っていましたが、実は最初に公開した時のサンプルが全く動いていませんでした。

[cocos2d-x]WindowsでAndroidアプリ開発日誌1:ディレクトリ構成変更と自動読み込み
atuweb.net

ということで、dirコマンドを勉強しなおしました。

dirコマンドについて

ふつうのdirコマンド

  • コマンド
dir D:PathtoprojectClasses
  • 結果
ドライブ D のボリューム ラベルは Windows8_OS です
ボリューム シリアル番号は XXXX-XXXX です

D:PathtoprojectClasses のディレクトリ

2015/08/18  12:51    <DIR>          .
2015/08/18  12:51    <DIR>          ..
2015/08/17  21:21             2,211 AppDelegate.cpp
2015/07/26  22:33               987 AppDelegate.h
2015/08/18  12:39    <DIR>          Component
2015/08/18  12:51    <DIR>          Scene
               2 個のファイル               3,198 バイト
               4 個のディレクトリ  65,809,817,600 バイトの空き領域

指定ディレクトリのファイルとディレクトリを表示する

/Bオプションは「ファイルとディレクトリの名称のみ」を行います。

  • コマンド
dir D:PathtoprojectClasses /b
  • 結果
AppDelegate.cpp
AppDelegate.h
Component
Scene

指定ディレクトリのファイルを表示する

/aオプションは ファイルの属性絞り込み を行います。

-(ハイフン)は「それ以外」という指定を行います。
これを利用してファイルのみは-dで「ディレクトリ以外」という指定を行いました。

  • コマンド
dir D:PathtoprojectClasses /b /a-d
  • 結果
AppDelegate.cpp
AppDelegate.h

指定ディレクトリ+サブディレクトリすべてのファイルを表示する

/sサブディレクトリ も対象に含めるためのオプションです。
このオプションを指定すると、ファイルがパス付で表示されるようになります。ファイル名の重複があるからですね。

  • コマンド
dir D:PathtoprojectClasses /b /a-d /s
  • 結果
D:PathtoprojectClassesAppDelegate.cpp
D:PathtoprojectClassesAppDelegate.h
D:PathtoprojectClassesComponentGameAnimation.cpp
D:PathtoprojectClassesComponentGameAnimation.h
D:PathtoprojectClassesSceneGameScene.cpp
D:PathtoprojectClassesSceneGameScene.h
D:PathtoprojectClassesSceneTitleScene.cpp
D:PathtoprojectClassesSceneTitleScene.h

指定ディレクトリ+サブディレクトリで、特定の拡張子を持つファイルを表示する

オプションではなく、ディレクトリの指定にワイルドカードを含めます

コマンド

dir D:PathtoprojectClasses*.cpp /b /a-d /s

結果

D:PathtoprojectClassesAppDelegate.cpp
D:PathtoprojectClassesComponentGameAnimation.cpp
D:PathtoprojectClassesSceneGameScene.cpp
D:PathtoprojectClassesSceneTitleScene.cpp

指定ディレクトリのサブディレクトリを表示する

/aオプションを「ディレクトリのみ」で指定すればOKです。
指定ディレクトリそのものは結果に含まれない 点にご注意ください。

  • コマンド

```dir D:PathtoprojectClasses /b /ad /s


- 結果

```D:PathtoprojectClassesComponent
D:PathtoprojectClassesScene

cocos2d-xのAndroid.mkの編集で躓いた点

Android.mkの処理では、jniディレクトリの位置を特定し、そこから 相対的にClassesの位置を求めています。

Android.mkに書いた次の一文は、

$(shell dir "$(LOCAL_PATH)/../../Classes/" /b /s /a-d)

実行時に変数展開されて次のようなコマンドになるようです。

dir D:Pathtoprojectproj.androidjni/../../Classes/*.cpp /b /s /a-d

これをこのまま実行すると「 無効なスイッチです - “..” 」などとエラーが出てしまうのです!

修正その1:デリミタで区切る

ディレクトリの指定を"(ダブルクォーテーション)で挟みます。

  • コマンド
dir "D:Pathtoprojectproj.androidjni/../../Classes/*.cpp" /b /s /a-d
  • 結果
D:PathtoprojectClassesAppDelegate.cpp

これを実行するとむと、無効なスイッチというエラーは解消されました。
しかし、サブディレクトリ以下のファイルが出力されません。なんでだー

修正その2:findを併用する

最終的にファイルをすべて出力した後、cppファイルだけに絞り込む方法を取りました。

最終的なコマンド

dir "D:Pathtoprojectproj.androidjni/../../Classes/" /b /s /a-d | find ".cpp"

これで無事期待通りの挙動にすることができました。


dirコマンドを検証するにあたって以下のサイトを参考にいたしました。
ありがとうございます。

Programming Field
http://pf-j.sakura.ne.jp/program/dos/doscmd/dir.htm