- ベストアンサー
フォルダ内の、最新のタイムスタンプのファイルを1つだけ取り出す(VBscript)
フォルダ内に複数のファイルが存在しており、その中でタイムスタンプが一番最新のファイルをコピーしたいと考えているのですが、ファイル同士のタイムスタンプを比較する方法が見つけられませんでした。どなたかご存知の方がいらっしゃいましたら、教えて頂けませんか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
私が書いたスクリプトの後ろにkhaii21さんが書き足されたんですよね? 不思議ですねぇ。本当に書かれたものそのままなら、 >strNewFileName2 = objFile.Name この行通るはず無いんですけど。 strNewFileName2、空のままのはずです。 通らない理由は、 >If dtmMostNewTimeStamp < objFile.DateLastModified Then です。dtmMostNewTimeStampより新しいファイル、strNewFileName以外であるわけ無いですよね。 と、khaii21さんが書かれたスクリプトについて解説してみましたが、2番目に新しいファイルを見つけるのに列挙しなおす必要なんて無いですよ(^^;;; 私が書いたスクリプト、ちょっと直すだけで1番目と2番目両方取れます。 Dim strNewFileName Dim dtmMostNewTimeStamp Dim strNewFileName2 Dim dtmMostNewTimeStamp2 'ファイルを列挙 For Each objFile In objFolder.Files If dtmMostNewTimeStamp < objFile.DateLastModified Then dtmMostNewTimeStamp2 = dtmMostNewTimeStamp strNewFileName2 = strNewFileName dtmMostNewTimeStamp = objFile.DateLastModified strNewFileName = objFile.Name ElseIf dtmMostNewTimeStamp2 < objFile.DateLastModified Then dtmMostNewTimeStamp2 = objFile.DateLastModified strNewFileName2 = objFile.Name End If Next 考え方は、列挙したファイルが今までで一番新しかったら ・前の1番目→2番目 ・列挙されたファイル→1番目 に、 1番目より古いけど、それまでの2番目よりは新しければ、 ・前の1番目→そのまま1番目 ・列挙されたファイル→2番目 になりますよね。
その他の回答 (2)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>ファイル同士のタイムスタンプを比較する場合、どのようにして新しいか、古いかを区別するのかが分かりませんでした。 ただIfで大小を比較するだけですが(^^;;; 日時なんですから。 >よろしければ、比較するスクリプトを教えて頂けませんでしょうか? ですから、「比較するスクリプト」って言っちゃうと、Ifの一行なんですって(^^;; C:\の中で一番タイムスタンプが新しいファイルの名前とタイムスタンプを表示するVBScriptです。 Dim objFS Set objFS = CreateObject("Scripting.FileSystemObject") Dim objFolder Set objFolder = objFS.GetFolder("C:\") Dim strNewFileName Dim dtmMostNewTimeStamp 'ファイルを列挙 For Each objFile In objFolder.Files If dtmMostNewTimeStamp < objFile.DateLastModified Then dtmMostNewTimeStamp = objFile.DateLastModified strNewFileName = objFile.Name End If Next WScript.Echo strNewFileName WScript.Echo dtmMostNewTimeStamp
補足
ご丁寧にスクリプトを記述して頂き、ありがとうございました。 タイムスタンプの新旧の比較を、単純に大小で判別出来るのには気が付きませんでした。^^ 教えて頂いたスクリプトを参考にして、タイムスタンプが一番新しいファイルと、その次にタイムスタンプの新しいファイルを取り出したいと考えているのですが、 For Each objFile In objFolder.Files If objFile <> strNewFileName Then '(1) If dtmMostNewTimeStamp < objFile.DateLastModified Then dtmMostNewTimeStamp = objFile.DateLastModified strNewFileName2 = objFile.Name End If End if Next (1)のような条件分岐を追加したスクリプトを加えて、先に取り出した1番タイムスタンプが新しいファイルを除外して、次に新しいファイルを代入させようと考えているのですが、strNewFileName2にもstrNewFileNameと同じファイルが代入されてしまい取り出せずに困っています。 本来の質問からは少しずれてしまうのですが、もし宜しければ教えて頂けませんでしょうか?
- taka_tetsu
- ベストアンサー率65% (1020/1553)
フォルダの内の最新のファイルを調べるんだったら、 1.ファイルを順番に順番に列挙していく(Filesコレクション) 2.最初のファイルのファイル名とタイムスタンプを退避 3.次のファイルのタイムスタンプと、退避したファイルのタイムスタンプを比較。新しいファイルだったらファイル名とタイムスタンプを退避しなおす。 以降3の繰り返し。 比較する方法ってのはIfでですけど、Ifがわからないわけじゃないですよね?
補足
>taka_tetsuさん レスありがとうございます。 >比較する方法ってのはIfでですけど、Ifがわからないわけじゃないですよね? スクリプトの条件分岐は分かります。^^ >3.次のファイルのタイムスタンプと、退避したファイルのタイムスタンプを比較。 タイムスタンプを確認するのは「DateLastModified」プロパティを利用すればいいんでしょうか? ファイル同士のタイムスタンプを比較する場合、どのようにして新しいか、古いかを区別するのかが分かりませんでした。よろしければ、比較するスクリプトを教えて頂けませんでしょうか?
お礼
>taka_tetsuさん 本当に丁寧に教えて頂き、ありがとう御座いました。 まだまだ人に頼る所が多く、どうしても「教えて君」になってしまい申し訳無いと思いますが、1つを教えてもらって何倍にでも応用出来るようにスキルアップを図りたいと考えています。本当に助かりました。