重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

お世話様です。

WindowsXPの『C:\batch』フォルダにあるバッチファイルの作成に困っております。

『D:\test』フォルダに下記の3ファイルがあります。

・CS_○○○.txt

・CS_×××.txt

・CS_△△△.txt

※記号の部分は数字部分です。

理想の手順としては下記の通りです。

(1)『D:\test』フォルダ内にて一番更新日付が新しいファイル以外をすべて『D:\test\bkp』フォルダに複写。

(2)その後に、『D:\test』フォルダ内にて一番更新日付が新しいファイル以外を削除。

という処理を実施したいのですが、どうもうまく作成出来ません。

ちなみにMOVEコマンドは処理的に危険度が高いので、削除対象ファイルは一度複写しつつ、
その後に削除という手順が理想です。

お手数ですが、何かご教授願いますでしょうか?

※サンプルコードがあると、非常に助かります。

何卒宜しくお願い致します。

A 回答 (2件)

vbscriptで記述したWSHでできると思われます。


サンプルコードを記載します。
テキストファイルに貼り付けて、拡張子を、.vbs にして実行すればよいです。
(いちおう実機検証はしてみましたが、このコードの実行上発生する
いかなる損害も負いかねますので、十分ご検証の上、自己責任で
お願いいたします。)
ファイルコピーと、削除を別に実行したい場合は、
(1)、(2)、(3)を、コピー実行プログラムとして、1ファイル
(1)、(2)、(4)を、削除実行プログラムとして、1ファイルにそれぞれして
実行すればよいかと思います。

以下サンプルコードです。

'(1)
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
objStartFolder = "D:\\test"
Set objFolder = objFSO.GetFolder(objStartFolder)
Set colFiles = objFolder.Files
fileName = ""
maxDate = 0

'(2)
'更新日が最も新しいファイルのファイル名を取得
For Each objFile in colFiles
If objFile.DateLastModified > maxDate Then
maxDate = objFile.DateLastModified
fileName = objFile.Name
End If
Next

'(3)
'ファイルコピー(ただし、更新日が最も新しいファイルは除外)
For Each objFile in colFiles
If objFile.Name <> fileName Then
objFile.Copy("D:\\test\\bak\\" + objFile.Name)
End If
Next

'(4)
'ファイル削除(ただし、更新日が最も新しいファイルは除外)
For Each objFile in colFiles
If objFile.Name <> fileName Then
objFile.Delete
End If
Next
    • good
    • 0

MOVEを使わず、お書きのように2ステップに分けると、(1)と(2)のちょうど間のタイミングでファイルが出来ると、コピーされずに削除されるファイルが出来てしまいますが、そういう可能性はないですか?


MOVEが危険というのをどこで読んだか知りませんが、デマでしょう。

cd /d D:\test
for /f "skip=1" %%F in ('dir /b /o-d CS_???.txt') do copy %%F D:\test\bkp
for /f "skip=1" %%F in ('dir /b /o-d CS_???.txt') do del %%F
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!