質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

5回答

912閲覧

日付を命名したログファイルの数値を受け取り古いのを消させたい

ionn

総合スコア13

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2018/04/26 03:48

日付を命名したログファイルの数値を受け取り古いのを消させたいです。
例えば下記コードで命名したログを出現させた後、3日間タスクスケジューラで処理をさせた場合日付が2018年1月1日の場合
20180101.log 
20180102.log 
20180103.log
のファイルが出来上がると思います。
その時に2018年1月4日の処理の時、logファイルの数値が一番小さいlogを(この場合20180101.log)消すとしたらどのような処理を行えばよろしいのでしょうか?

命名された文字を数字に変換させ、一つ一つ大きさを比較させようとしていますが、上手くいかず困っています。

また別のよい方法があるのなら教えてください、お願いします。

VBS

1dt = Date 2dt = Replace(dt,"/","") 3strFileName = "C:\Scripts\" & dt & ".log" 4 5Set objFSO = CreateObject("Scripting.FileSystemObject") 6Set objFile = objFSO.CreateTextFile(strFileName)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

Replace(DateAdd("d",-3,Date),"/","") & ".log"で、3日前のログファイル名になりますので、ファイル名文字列をこれと比較して等しいか小さい物を削除します。
文字列として比較すればよく、数値化の必要は無いです。

投稿2018/04/26 14:00

otn

総合スコア84529

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ionn

2018/04/26 17:03

回答ありがとうございます。 質問での比較はどういったように行うのでしょうか? 初心者ですみませんが、教えていただきたいです。
guest

0

ベストアンサー

サンプルを書いている間にsaziさんから同様の回答が出てしまいました。

FSOでファイル一覧を取得してArrayListに格納。
ArrayListをソートして先頭を取得しています。

VBA

1Dim f 2Dim Path 3Dim FSO 4Dim files 5 6Path = ".\" 7 8Set fso = CreateObject("Scripting.FileSystemObject") 9Set files = CreateObject("System.Collections.ArrayList") 10 11' フォルダ内のファイル一覧取得 12For Each f In fso.GetFolder(Path).Files 13 ' fsoではワイルドカードが使えないので、ここで取捨選択が必要 14 files.Add f.Name 15Next 16 17' ファイル一覧をソート 18files.Sort 19 20' ソートした先頭のデータを取得 21wscript.echo files(0) 22 23Set fso = Nothing 24Set files = Nothing 25

投稿2018/04/26 04:46

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ionn

2018/04/26 17:07

回答ありがとうございます。 これを参考に下記のコードになりましたが、消す処理が機能せずに困っている状態です。 また、fsoではワイルドカードが使えないので、ここで取捨選択が必要 とありますが、ここでlogファイルのみ消すなどの処理を入れることは可能でしょうか?教えてください、お願いします。 Dim f Dim Path Dim FSO Dim files Dim objFSO ' FileSystemObject Dim strDelFile ' 削除するファイル名 Path = "C:\Scripts" Set fso = CreateObject("Scripting.FileSystemObject") Set files = CreateObject("System.Collections.ArrayList") ' フォルダ内のファイル一覧取得 For Each f In fso.GetFolder(Path).Files ' fsoではワイルドカードが使えないので、ここで取捨選択が必要 files.Add f.Name Next ' ファイル一覧をソート files.Sort ' ソートした先頭のデータを取得 wscript.echo files(0) strDelFile = files(0) fso.DeleteFile strDelFile, True WScript.Echo strDelFile & " を削除しました。" Set fso = Nothing Set files = Nothing
ttyp03

2018/04/26 23:40

ログファイルだけを対象にする処理はループ内を次のようにすればよろしいかと。 ' 拡張子が"log"のみを対象とする If fso.GetExtensionName(f.Name) = "log" Then files.Add f.Name End If 削除に関しては、提示いただいたコードで問題なく動作しましたよ。 別のアプリが開いているとかでロックされていることはないでしょうか?
guest

0

FileSystemObjectではソートができないので、ソート機能を持ったオブジェクトを利用するのが、比較的楽です。
※配列に格納してから自前でソートロジックを組むというのもサンプルは転がってはいますけども。
・ADOを利用
【VBA】FileSystemObjectでファイル名(拡張子)の指定+ソートして取得する

・ArrayListを利用
VBSで動的配列(ArrayList)を使う
※こちらはFileSystemObjectを使用したサンプルではありません。

投稿2018/04/26 04:33

sazi

総合スコア25184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

命名された文字を数字に変換させ、一つ一つ大きさを比較させようとしていますが

これで良いと思います。

うまくいかないのは、数字への変換ですか?比較処理ですか?

投稿2018/04/26 03:59

tamina

総合スコア136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

現在日付を取得して、3日前の日付がついてるファイルを消去するくらいしか思いつかず。、、

投稿2018/04/26 03:52

kakeiteiya

総合スコア252

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問