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

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

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

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

Q&A

解決済

2回答

7422閲覧

VBScriptでサブフォルダも含めて全Fileの最終更新時間を取得したいです。

atsunofu

総合スコア59

VBScript

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

0グッド

0クリップ

投稿2019/01/21 08:03

複数の対象Folderの中にサブディレクトリが増えて行く環境に置いて、
各対象Folder内で一番最後に更新されたFileの更新時間を取得したいです。
(自動更新システムが動いているのでそれが停止していないか確認する目的です)

参考として
http://d.hatena.ne.jp/end0tknr/20120118/1326889962
https://oshiete.goo.ne.jp/qa/1397967.html

上記Link先等の情報を組み合わせてScriptを作成しましたが
FSOの再帰処理ではサブディレクトリ毎の結果しか出力出来ませんでした。

(FSOの再帰処理で全File 若しくは 各サブディレクトリの最新更新File
のList を Ary に入れて 各時間をチェックする等を試みましたのですが、
上手く行きませんでした)

御教授いただければ幸いです。
よろしくお願いいたします。

VBScript

1 2Dim FSO 3Dim d 'ディレクトリ名 4Dim fn 'ファイル名 5Dim ary 'ArrayList 6Dim item 'ArrayList項目 7Dim num 'ArrayList項目数 8Dim objReadStream 9Dim setF_Path '設定FilePath 10Dim strLine 11 12Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 13Set ary = CreateObject("System.Collections.ArrayList") 14setF_Path = "「対象FilderのList(Full Path)」.txt" 15 16'ファイルを読み取り専用で開き、TextStream オブジェクトを取得 17Set objReadStream = FSO.OpenTextFile(setF_Path, 1) 18 19Do Until objReadStream.AtEndOfLine = True 20 '1 行読み込み 21 strLine = objReadStream.ReadLine 22 23 WScript.Echo strLine 24 25ary = FindFolder(FSO.GetFolder(strLine)) 26 27Loop 28 29num = ary.Count 30WScript.Echo "項目数: " & num 31 32 33objReadStream.Close 34 35'// 後処理 36Set FSO = Nothing 37 38 39'//=================================================================== 40'// サブフォルダも再帰して一覧を表示 41Function FindFolder(ByVal objMainFolder) 42 Dim objSubFolder 43 Dim objFile 44 Dim strNewFilePath 45 Dim dtmMostNewTimeStamp 46 47 48 '// フォルダがあれば再帰 49 For Each objSubFolder In objMainFolder.SubFolders 50 FindFolder objSubFolder 51 Next 52 53 For Each objFile In objMainFolder.files 54 strNewFilePath = objFile.ParentFolder & "\" & objFile.Name 55 ary.add strNewFilePath 56 57 Next 58 59 FindFolder = ary ’これだとErrが出ます… 60 61End Function

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

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

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

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

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

otn

2019/01/21 08:43

フォルダー名一覧ファイルに、 A B C とあれば、 A 2018/12/31 23:00:00 B 2011/03/31 10:22:33 C 2019/01/10 12:34:56 こんな物を得たいと言う事ですかね?
atsunofu

2019/01/21 08:52

otn さん ありがとうございます。 フォルダA / B / C の中にもサブフォルダが有り、そのサブフォルダに複数のファイルが入っています。 フォルダA内の最新更新Fileの時間が 2018/12/31 23:00:00 Bが 2011/03/31 10:22:33、Cが2019/01/10 12:34:56 で有れば 上記の通りです。
guest

回答2

0

上記の通りです。

ということであれば、

VBScript

1Option Explicit 2Const setF_Path = "「対象FilderのList(Full Path)」.txt" 3 4Dim FSO 5Dim ReadStream 6Dim Line 7 8Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 9 10Set ReadStream = FSO.OpenTextFile(setF_Path, 1) 11Do Until ReadStream.AtEndOfStream 12 Line = ReadStream.ReadLine 13 WScript.Echo Line, vbTab, FindFolder(FSO.GetFolder(Line)) 14Loop 15ReadStream.Close 16 17Function FindFolder(Folder) 18 Dim SubFolder 19 Dim File 20 Dim MaxModTime, ModTime 21 22 MaxModTime = 0 23 For Each SubFolder In Folder.SubFolders 24 ModTime = FindFolder(SubFolder) 25 If ModTime > MaxModTime Then 26 MaxModTime = ModTime 27 End If 28 Next 29 30 For Each File In Folder.files 31 ModTime = FSO.GetFile(File.Path).DateLastModified 32 If ModTime > MaxModTime Then 33 MaxModTime = ModTime 34 End If 35 Next 36 FindFolder = MaxModTime 37End Function

投稿2019/01/21 09:06

otn

総合スコア84423

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

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

atsunofu

2019/01/21 09:44

otnさん ありがとうございます。ttyp03さんに指摘いただいた点を修正していましたら、 otnさんの提示内容とほぼ同じScriptに行きつきました。 大変申し訳ないのですが、先にヒントになったのはttyp03さんですので、 ベストアンサーはttyp03さんにさせていただきます。
guest

0

ベストアンサー

FindFolder = ary ’これだとErrが出ます…

ひとまず上記に関して。
aryはグローバル変数だから、戻り値で返す必要はないのでは。
当然呼び出し側も受け取る必要はないです。
そもそも再帰で呼び出しているところは受け取ってないですしね。

VBA

1Do Until objReadStream.AtEndOfLine = True 2 '1 行読み込み 3 strLine = objReadStream.ReadLine 4 WScript.Echo strLine 5 FindFolder FSO.GetFolder(strLine) 6Loop 78 9Sub FindFolder(ByVal objMainFolder) 10 Dim objSubFolder 1112End Sub

投稿2019/01/21 09:00

ttyp03

総合スコア16996

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

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

atsunofu

2019/01/21 09:41

ttyp03さん 勘違いのpointを指摘いただきありがとうございます。 グローバル変数と戻り値がごっちゃになっていました。 そこを修正した所、処理が進む様になりました。 細かい所を修正すれば、意図した通りの処理が出来そうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問