Batch file to VBScript file (9) at 1999.Sep.1 3.8 ささやかな実用例  ここではちょっと趣を変えて、実例です。使い捨てのつもりでがちゃがちゃと 書いて、待てよ。と、保存したとかってのもあるので、結構いいかげんなのも あったりします。 壱. カレントディレクトリのファイルを特定ドライブに転送するバッチを生成  DOS窓で動かします。  先ず、C:\foo> dir /b > dir.lst  としてファイルのリストを作ります。で、次に:  C:\foo> cscript //nologo trnsf.vbs > tr.bat === ' trnsf.vbs Set fso = CreateObject("Scripting.FileSystemObject") Set sf = fso.OpenTextFile("dir.lst") Do Until sf.AtEndOfStream s = sf.ReadLine Wscript.Echo "copy " & Chr(&h22) & s & Chr(&h22) & " e:" Loop ===  で、最後に:  C:\foo> tr  と、なります。  dirコマンドの出力を読んで、ファイルコピーするバッチのコマンドラインを  標準出力に出す。というものです。こういう処理はバッチではできません。  ファイルを1行づつ読んで処理する。というのはバッチでは無理ですから。  だけど、ファイルコピーをするにあたり、安易にバッチにやらせようとする  あたり、できる限り手抜きをしたい。という欲望が見え見えです(^^;;  相互の利点を補完し合うという一番楽勝(スクリプトを作る側にとって)な  パタンです。  念の為ですが、DOS窓でロングファイル名を扱う時は「"」でファイル名を  囲みます。その為のChr(&H22)です。  #賢明な読者ならお気づきでしょうが、これってcopy *.* e:ってやるのと   丸っきり同じですね。あれ〜ぇ。おっかしいなぁ。俺って、そんなに間抜け   だったっけ?   …いやいや。思い出した。tr.batを編集して任意の順でファイルをg:に   転送したい。という用途向けの話でした  #何故そのような必要性があるの。って?それは某MP3プレーヤがCF (Compact   Flash)内の曲を演奏するにあたり、コピーした順に演奏するからでした。   ちなみにあたしはMP3プレーヤ、持ってません。HP200LXのハードウェア   バックアップ(つまり、2台目を買ってしまった)をしたとかでちょっと   余裕が……(^^;; 弐. 本当に転送可能かを調査する === Const CS = 2048 ' 転送先ドライブのクラスタサイズ Set fso = CreateObject("Scripting.FileSystemObject") Set sf = fso.GetFolder(".") ' 転送前のファイルがあるフォルダ Set df = fso.GetDrive("E:") ' 転送先のドライブ For Each f In sf.Files tcs = tcs + (f.Size + CS - 1) \ CS Next tfree = df.AvailableSpace \ CS If tcs <= tfree Then ico = vbInformation Else ico = vbExclamation MsgBox "必要数:" & tcs & " 空き:" & tfree, ico, "クラスタ数" ===  カレントフォルダの全ファイルが転送先に本当にコピーできるかを確認するもの  です。「クラスタサイズ」はchkdskとかで表示される「アロケーション何とか」と  同じ意味(ファイルシステムが本質的に同一なのに、用語をころころ変えるMSの  態度ってば嫌い)。  あ、サブフォルダ(サブディレクトリ)にコピーする場合、この計算方法ではまずい  場合があります。そう。サブフォルダのディレクトリ情報を記載している部分も  つまりは「ファイル」なのですから。  #この説明で分からない人は誰かグル(詳しい人)に聞いてください。また、ルート   ディレクトリにしてもファイル数の制限があるのでご注意。いや。先のMP3   プレーヤはCFのルートにあるファイルしか演奏しないので、これで充分に   役に立つ。ってことです。 参. 別解。ファイルリストから転送可能かを求める === Const CS = 2048 ' 転送先ドライブのクラスタサイズ(ScanDiskで調べる) Set fso = CreateObject("Scripting.FileSystemObject") Set df = fso.GetDrive("E:") ' 転送先のドライブ Set sf = fso.OpenTextFile("HogeHoge_sngs-The_foo_bar.m3u") Do Until sf.AtEndOfStream Set f = fso.GetFile(sf.ReadLine) tcs = tcs + (f.Size + CS - 1) \ CS Loop: sf.Close tfree = df.AvailableSpace \ CS If tcs <= tfree Then ico = vbInformation Else ico = vbExclamation + vbDefaultButton2 End If Ans = MsgBox("必要数:" & tcs & " 空き:" & tfree,_ ico + vbOkCancel , "クラスタ数") If Ans = vbCancel Then Wscript.Quit ' 中止 MsgBox "OK" ' 続行 ===  途中です。が、何がどうなっているかは分かるでしょう。状況によってMsgBoxの  アイコンとデフォルトボタンが変化するのがお茶目ってことかも(^^;; ちなみに、これらの例ではOption Explicitなど、影もありません。 本音と建前。という訳でもなくて、得失を考慮した結果なのです。って書いても 苦しい言い訳にしか聞こえないでしょうけど(;_;) キーワードは「コスト」です。vb3eな話題を扱ったここの別連載(既に終了)には この「コスト」のことが少しだけ詳しく(ん?何か矛盾しているか?)出ています。 ではでは。 (EOF)