• ベストアンサー

コマンド DIRの動作について

バッチファイルのDIRコマンドでよく分からない事が あるので、ご存知の方、ご教授願います。 あるフォルダ(仮にC:\test\とします。)の中に1行だけ記述された CSVファイルが大量にあります。 これをCOPYコマンドで1ファイルにまとめたいと思います。 しかし、そのフォルダの中にはサブディレクトリがあり、その中にも COPYコマンドの対象としたいCSVファイルがあります。 COPYコマンドはサブディレクトリまで処理対象としてくれない ようですし、サブディレクトリの数は不特定なので、どうしょうかと 困っていたら、あるWebページを見つけました。 ttp://www.fpcu.jp/dosvcmd/bbs/log/copyxcopy/4-1567.html やりたい事はまさにドンピシャで、そのページのコマンドを 自分流に書き換えつつ、完成したのが、以下のコードです。 MKDIR "C:\test2\" XCOPY "C:\test\*.csv" "C:\test2\" /E /Y for /f %%a in ('dir "C:\test\" /b') do XCOPY "C:\test\\%%a\*.csv" "C:\test2\" /E /Y COPY "C:\test2\*.csv" "C:\test2\log.csv" ※変な所で改行が入って見難くなっていたらゴメンナサイ。 上記、コードで試してみた所、WindowsXPでは問題なく動作しました。 しかし、Windows2000で試してみた所、うまく動きませんでした。 PAUSEコマンドを入れて、どんなコマンドが吐かれているのか見たら サブディレクトリを動的に変えようとしてい%%aの中に「ドライブ」 とか「ボリューム」とか入ってくるのです。最初は意味不明でしたが DIRのbオプションを付けない時に、そういう文字がコマンドプロンプト の画面に表示され、それを取得しているんじゃないかという事に 気づきました。ちなみにWindows2000でもDIR C:\test /bとやると フォルダ名、ファイル名しかコマンドプロンプトの画面には表示されません。 気づいたはいいんですが、解決方法が分かりません。 どなたか、コマンドに詳しい方、ご教授ください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.2

こんばんは。 ご相談では仮に、C:\test\とされていますが、実際はディレクトリ名に漢字ひらがななど2バイト文字を使われてませんか? 同じwww.fpcu.jpの中にWindows2000 のfor文に関するバグについて記載されたエントリーがあります。もし該当するようでしたら回避方法も出ていますのご確認下さい。 [WIN2000] for in ( ) do .. の日本語(全角)文字処理にバグあり http://www.fpcu.jp/dosvcmd/bbs/log/cat3/for_in_do/3-0471.html

qoo288
質問者

お礼

お返事、ありがとうございます。 今日、質問文で書いたコードを2000上で動かしてみました。 動作対象ディレクトリをCドライブ直下Tempにしていたからなのか、XPと 同様に正しく動作しました。 一番最初にDIRコマンドの返す値が変だと気づいた時は確かに動作対象 ディレクトリをデスクトップで行っていたので、フォルダパスにも余裕で 日本語(2バイト文字)が入っています。 とりあえず、明日、提示して頂いたリンク先に書かれている事を2000環境 で試してみたいと思います。 コードとしては、masa_peeさんが簡潔かつやりたい事をやれるコードを 教えてくださったので、それでいいかなと考えていますが、DIRが変な 文字を返してきたのは事実で、やっぱり気持ち悪いので時間がある時に 原因を追究したいと思います。 貴重な情報を教えて頂き、ありがとうございます。

その他の回答 (1)

noname#223623
noname#223623
回答No.1

質問分の前半は理解したつもり。でも質問者さんのパッチプログラムが出てきて目的がよくわからなくなった。バッチプログラムがやろうとしてることと、その前に書いた目的がちょっと合ってない感じ。難しく考えすぎてるのか、それとも自分の読解力が足りないのか。 申し訳ないけど、あるディレクトリ以下のCSVファイルをすべて連結するということで回答します。以下のようにファイルが配置されているとしましょう。  C:\TEMP\SRC  |  sample1.csv  |  sample2.csv  +---sub1  |    sample3.csv  |    sample7.txt  |    sample8.txt  \---sub2    |  sample4.csv    |  sample5.csv    \---sub3        sample6.csv CSVファイルの一覧を取得するのは次のdirコマンドでできます。  C:\>dir c:\temp\src\*.csv /s /b この結果をforコマンドに渡せば、CSVファイルを順番に処理できます。次のバッチプログラムでCSVファイルの内容が出力できます。  @echo off  for /f %%i in ('dir c:\temp\src\*.csv /s /b') do type %%i ファイルにリダイレクトすれば保存もできます。result.csvに保存するならこうします。  c:\>sample.bat > result.csv バッチプログラム内で保存したければ次のようにします。  @echo off  :前回の結果を削除する場合は次の行を追加  if exist result.csv del result.csv  for /f %%i in ('dir c:\temp\src\*.csv /s /b') do type %%i >> result.csv 冒頭に書いたように、質問文がちょっと理解できなかったりするので、思い切りはずしてるかもしれません。

qoo288
質問者

お礼

お返事、ありがとうございます。 文章が分かり難かったようで、申し訳ありません。 やりたかった事を要約すると、1つのファイルの中(サブディレクトリ含む) にあるCSVファイルを1つのCSVファイルにまとめたいという、ただそれだけ です。 で、自分は1つのファイルにまとめるという手法がCOPYコマンドを 使って行うしか知らなかったので、それでやろうとしてました。 でも、質問にも書いた通り、COPYはサブディレクトリまで対象としてくれ ないので、苦肉の策でXCOPYでCSVファイルを全て別フォルダ(質問でいう C:\test2\)の同じ階層に出力し、そこでCOPYコマンドを使用するという 手法をとりました。 質問文で書いた自分のコードでも一応XPなら動作してたので、それで いいかと思ったんですが、2000でのエラーの原因が知りたかったので それで質問しました。もしかしたら、pita-goraさんが書いてくださった 事が原因かもしれません。(自宅に2000環境ないので、まだ未確認) masa_peeさんの提示してくださったコードを見て、正直、目から鱗な 気分ですw 自分はDIRにSオプションがある事すら知らなかったです。 %%iに取得した内容を >> でファイルに出力する事ができるなんて事も 知らなかったです。普段触らないせいか、全然勉強不足ですね。 とても、参考になりました。

qoo288
質問者

補足

補足というか、追記ですが 多分、質問が分かり難くなってしまったのは 自分でやりたいとしてる事はCOPYコマンドを使ったファイルを まとめる事なのに、途中からDIRが変な文字を返すという事に スイッチしているからかなと思いました。

関連するQ&A