- ◆72. ファイルの自動仕分け方法 (こう) 2003/01/10(金) 22:16
- 73. Re:ファイルの自動仕分け方法 (ふぇむ) 2003/01/11(土) 14:02
- 75. Re2:ファイルの自動仕分け方法 (ふぇむ) 2003/01/11(土) 18:09
- 77. Re3:ファイルの自動仕分け方法 (こう) 2003/01/11(土) 20:39
- 79. Re4:ファイルの自動仕分け方法 (ふぇむ) 2003/01/12(日) 11:35
- 116. Re5:ファイルの自動仕分け方法 (こう) 2003/01/20(月) 00:27
- 117. Re6:ファイルの自動仕分け方法 (ふぇむ) 2003/01/20(月) 08:12
- 118. Re7:ファイルの自動仕分け方法 (こう) 2003/01/20(月) 23:45
- 117. Re6:ファイルの自動仕分け方法 (ふぇむ) 2003/01/20(月) 08:12
- 116. Re5:ファイルの自動仕分け方法 (こう) 2003/01/20(月) 00:27
- 79. Re4:ファイルの自動仕分け方法 (ふぇむ) 2003/01/12(日) 11:35
- 77. Re3:ファイルの自動仕分け方法 (こう) 2003/01/11(土) 20:39
- 75. Re2:ファイルの自動仕分け方法 (ふぇむ) 2003/01/11(土) 18:09
- 74. Re:ファイルの自動仕分け方法 (SYSOP) 2003/01/11(土) 15:01
- 73. Re:ファイルの自動仕分け方法 (ふぇむ) 2003/01/11(土) 14:02
|
72) ファイルの自動仕分け方法 こう 2003/01/10(金) 22:16 |
|
あるディレクトリに格納されている複数のファイルを以下のように仕分ける方法を教えていただきたく質問をいたしました 使用OSはWindows2000proです。 1.ディレクトリには以下の10個のファイルがあると想定します。 f01.txt ----> 2 byteのファイル f02.txt ----> 8 byteのファイル f03.txt ----> 1 byteのファイル f04.txt ---->10 byteのファイル f05.txt ----> 1 byteのファイル f06.txt ----> 2 byteのファイル f07.txt ----> 3 byteのファイル f08.txt ----> 3 byteのファイル f09.txt ----> 2 byteのファイル f10.txt ----> 3 byteのファイル 2.ファイルの仕分けは、ファイルの合計サイズが10byte以内に収まるようにディレクトリを自動生成しながらファイルコピーする。 ディレクトリ名は、AAnnとして作成する(AA:固定部 , nn:01~の通番)。 ファイル名で昇順ソートし処理をする。 1ファイルのファイルサイズは10byte以内とする。 (1).AA01ディレクトリを作成し以下の2ファイルをコピーする。 (合計ファイルサイズ=10byte) f01.txt ----> 2 byte f02.txt ----> 8 byte (2).AA02ディレクトリを作成し以下の1ファイルをコピーする。 (合計ファイルサイズ=1byteだが次のファイル(f04.txt)が10byteなので1ファイルのみとする) f03.txt ----> 1 byte (3).AA03ディレクトリを作成し以下の1ファイルをコピーする。 (合計ファイルサイズ=10byte) f04.txt ----> 10 byte (4).AA04ディレクトリを作成し以下の4ファイルをコピーする。 (合計ファイルサイズ=9byteだが次のファイル(f09.txt)が2byteなので4ファイルのみとする) f05.txt ----> 1 byte f06.txt ----> 2 byte f07.txt ----> 3 byte f08.txt ----> 3 byte (5).AA05ディレクトリを作成し以下の2ファイルをコピーする。 (合計ファイルサイズ=5byte) f09.txt ----> 2 byte f10.txt ----> 3 byte (6).処理終了 ※実際は1ファイル数Mbyteのファイルが数千ファイルあるものを100Mbyte以内に収まるように処理しようとしております。 上記のような処理をバッチファイルにて実現できないか検討しています。 どうか宜しくお願いいたします。 過去ログ等で同様の質問があるか確認したつもりですが見落としがあった場合は申し訳ありません |
|
73) Re:ファイルの自動仕分け方法 ふぇむ 2003/01/11(土) 14:02 |
|
ふぇむと申します。 ●for文の中で、%~zX (Xがfor の変数。 for %X みたいな。バッチスクリプト中では %% を使う)にてサイズに展開される変数が参照できる。 ●set文で、set /A にて加減乗除等ができる。 これらのことを利用して、for で対象ディレクトリ中の対象ファイルをピックアップするループの中から、コアの処理を行なうサブルーチン(というのかな)をファイル名とサイズを引数に与えて call する、みたいな形で組めば、できるように思えます。 しかし、環境チェック、エラーのハンドリング、ジョブのリカバリーや再ランの事など、いろいろ考えると結構周辺が面倒そうで、ruby とか他のスクリプトで書く方がよりちゃんとしたものがつくれそうに思います。 |
|
75) Re2:ファイルの自動仕分け方法 ふぇむ 2003/01/11(土) 18:09 |
|
ふぇむと申します。先ほど手が空いていたので、ちょっと自作してみました。おっしゃっているような仕様のものは一応できそうですね。 まあ、環境のことやエラーハンドリングのこと、ロギング等のこと、メンテナンス性、その他いろんなことをどこまで考慮するかという点はあるかもしれませんが.... |
|
77) Re3:ファイルの自動仕分け方法 こう 2003/01/11(土) 20:39 |
|
SYSOPさん > 実際に100MBの容量のリムーバブルメディア複数枚にコピーすることが目的であればxcopy を1度実行するだけで済みそうな処理ですが、厳密に「やりたいこと」そのままだと、相当ややこしそうですね。 するどいですね。 実は、640Mbyte以内に仕分けて複数枚のCD-Rに焼こうと思っております。 操作するPCでは、Excel-VBAやWindowsScriptのようなものは使用禁止になっているのです。(交渉次第で可能にさせることは可能かも) お客さんに640MByte以内になるようにファイルを選択させるのはとても大変なのでせめて、CD-Rに焼く単位でバッチファイル(バッチファイルはなぜか使用可)で自動仕分けをしてあげたいのです。 CD-Rのライティングソフトでそのような機能があれば良いのですが、無かったため今回のような仕様で自動仕分けを検討中です。(今、自宅からなのでライティングソフトの名前は出てきません。すいません) ふぇむさん > ふぇむと申します。先ほど手が空いていたので、ちょっと自作してみました。おっしゃっているような仕様のものは一応できそうですね。 もし、宜しければ教えていただけますか。 |
|
79) Re4:ファイルの自動仕分け方法 ふぇむ 2003/01/12(日) 11:35 |
|
ふぇむと申します。 >もし、宜しければ教えていただけますか。 では、ふぇむ流ですが、環境判定やロギング等も加えたスクリプトをこうさん宛にメールにて送付いたします。 |
|
116) Re5:ファイルの自動仕分け方法 こう 2003/01/20(月) 00:27 |
|
ふぇむさん バッチスクリプト送っていただきましてありがとうございました。 送っていただいたバッチスクリプトに関しての感想等はもうしばらく 時間下さいますか。(解析する時間と、実際にどこまでバッチ処理でやらせるか、今話し合い中です。みんな「バッチファイルでは実現できない仕様」と思っていたので目を丸くしております。) 1つ疑問なのですが。 バッチファイルの拡張子について *.cmd と *.batどちらでもバッチスクリプトを実行可能だと思うのですが、動作上どのように違うのでしょうか (実は、バッチファイルといふファイルは *.batだけだと思っていました) |
|
117) Re6:ファイルの自動仕分け方法 ふぇむ 2003/01/20(月) 08:12 |
|
ふぇむと申します。 >1つ疑問なのですが。 >バッチファイルの拡張子について >*.cmd と *.batどちらでもバッチスクリプトを実行可能だと思うのですが、動作上どのように違うのでしょうか >(実は、バッチファイルといふファイルは *.batだけだと思っていました) DOSプロンプトでの標準的なコマンドシェルは、WindowsNT系(2000/XP)では cmd.exe、Windows95/98/Meでは command.com で、 *.bat は 両方で同じように動くけれど、*.cmd は NT系でしか動きません。......ということくらいでしょうか。動作上はあまり違わないような気がします。 ふぇむは自分の習慣で、command.com 系のバッチは *.bat、 cmd.exe 系のバッチは *.cmd とつけ分けてまして、お送りしたものは 2000/XP つまり cmd.exe系なので、*.cmd としていました。 当然、*.bat に書き換えても動きます。 ただ、*.bat だと、ついWin95/98系に持っていって動かしてしまう可能性があります。エラーになってしまいますが.... 一応、お送りしたスクリプトは、もし自分を *.bat という名前に変えられてWin95/98系で起動されても、簡単なチェックですがOSが違う旨メッセージ表示して正常終了するように書いたつもりです。ま た、スクリプト自身の自らの環境を判定する処理の部分に、自分の拡張子をチェックするときに bat と cmd の両方をチェックするようにしています。 ということで、お送りしたスクリプトに関して言えば、拡張子を bat と変更してもぜんぜん問題ありませんです。 >解析する時間と、実際にどこまでバッチ処理でやらせるか、今話し合い中です。 すみません、調子に乗っていつのまにやら1800行近くのスクリプトになってしまいました。(^^; >みんな「バッチファイルでは実現できない仕様」と思っていたので目を丸くしております。 Windows2000以降になって、for や set や call での引数展開などいろいろ拡張されて、WindowsNT4.0頃ではかけなかったような事が書けるようになりました。我流のスクリプトですが、ご参考としていただければ幸いです。 また、バッチコマンドのアイコンやショートカットへファイルをドラッグ&ドロップしたりすると、引数に与えたファイルやディレクトリを列挙して起動してく れます。これを利用して、コマンドラインからだけでなく、Explorerマウス右クリックの「送る」に入れたり、マウスで複数ファイルをドラッグ&ド ロップでコマンド起動したり、ということもできます。昔の印象に比べると、一見ですが結構想像以上のことができます。(思いもよらないワナも多いですけれ どね^^;) |
|
118) Re7:ファイルの自動仕分け方法 こう 2003/01/20(月) 23:45 |
|
ふぇむさん *.cmdと*.batの違いについて ありがとうございました。 コマンドプロンプトはcommand.comだけでないのですね cmd.exeの存在がはじめてわかりました ありがとうございました。 |
|
74) Re:ファイルの自動仕分け方法 SYSOP 2003/01/11(土) 15:01 |
|
こう さん、こんにちは。 実際に100MBの容量のリムーバブルメディア複数枚にコピーすることが目的であればxcopy を1度実行するだけで済みそうな処理ですが、厳密に「やりたいこと」そのままだと、相当ややこしそうですね。 Windows2000ならバッチ処理でも環境変数の足し算や比較ができますし(set /? 参照)、forコマンド内からファイルサイズも参照できますから(for /?参照)、やってやれないことはないかもしれないですが、デバッグとか細かい確認の手間とかを考えたら、Excelのような数字に強いツールとか、ある いは一般のプログラミング言語で補助したほうが簡単じゃないかと思います。 その場合、まずは次の例のようにして、対象ファイル+ファイルサイズのリストをCSVファイル化しておくとよいでしょう。 @ECHO OFF IF EXIST DATALIST.CSV DEL DATALIST.CSV FOR /R %%I IN (*.TXT) DO ECHO "%%~fI",%%~zI>>DATALIST.CSV 上記の例では拡張子.txtのファイルとそのファイルサイズをカンマで区切ってcsv形式にしています。 で、これをExcel等に読み込んで演算・編集するなり、あるいはこれをもとに具体的な仕分けの処理用の使い捨てバッチファイルを出力するプログラムを自作するわけです。 YanaKen [個人homepage ]http://homepage3.nifty.com/yanaken/ [@pay窓口 ]http://pay.nifty.com/pay/servlet/pr?i=BDKQ048560 [@pay導入について]http://bbs.com.nifty.com/mes/cf_wrent/FPCU_B017/ |