• 締切済み

VBSを使ったファイル検索

お世話になっております。 VBSを使い、特定のフォルダに対して、タイムスタンプ(最終更新日)が今日と昨日のファイルを抽出したいと思っています。 Dim T,Y T = Date () Y = DateAdd("d",-1,Today) とすれば、今日と昨日の日付を得られますが、 この変数 TとY を使って、タイムスタンプでファイルを抽出、ソートすることはできるのでしょうか? サンプルコードや参考になるサイトがあれば教えていただきたいと思っています。 初心者な質問で恐縮ですが、知恵を貸して頂けないでしょうか。 よろしくお願いします。

みんなの回答

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

ソートの必要が無ければ単純なのですが、更新日順でソートする場合は面倒です。 下記を適当なVBSファイルで保存してお試しを。 デスクトップに、a.csv ファイルが出来ます。 ※特定のフォルダは、そちらで指定するのをお忘れなく。 option explicit Dim f, fd, fs, ws,OutTxt Dim rs Const ForWriting = 2 ,ForAppending = 8 Set fs = CreateObject("scripting.filesystemobject") Set fd = fs.GetFolder("e:\tmp\") '←☆☆ここでフォルダを指定してください☆☆ set ws = CreateObject("wscript.shell") Set rs = CreateObject("adodb.recordset") 'レコードセットの入れ物作成 With rs .LockType = 3 'adLockOptimistic With .Fields .append "F1", 200, 255 'adVarChar .append "F2", 200, 255 'adVarChar .append "F3", 7 'adDate End With End With 'レコードセットにデータを格納 rs.Open For Each f In fd.Files If f.datelastmodified > DateAdd("d", -1, Date) Then rs.addnew rs.Fields("F1") = f.Name rs.Fields("F2") = f.Path rs.Fields("F3") = f.DateLastModified rs.Update End If Next '出力ファイルに昇順で(F3 ASC)書き出し rs.Sort = "F3 ASC" Set OutTxt = fs.OpenTextFile(ws.specialfolders("desktop") & "\a.csv", ForWriting , True) Do Until rs.Eof OutTxt.WriteLine _ chr(34) & rs.Fields("F1") & chr(34) _ & "," & chr(34) & rs.Fields("F2") & chr(34) _ & "," & rs.Fields("F3") rs.MoveNext Loop rs.Close Set rs = Nothing OutTxt.Close msgbox "おしまい"

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

>特定のフォルダのファィル名とタイムスタンプは以下で取得できますが Option Explicit Dim FSO, objFolder, f Dim myPath myPath = "C:\・・・・" Set FSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFolder = FSO.GetFolder(myPath) For Each f In objFolder.Files   WScript.Echo f.Name & vbCrLf & FSO.GetFile(myPath & f.Name).DateLastModified Next

関連するQ&A

  • VBS Dateadd関数の実行

    VBSについて、おそらく初歩的な質問です。 以下のプログラムが実行できないのはなぜでしょうか。。 また、メッセージボックスにy(5)の値(2017/08/10 11:00:00 ) を表示するにはどのように訂正すればよいでしょうか。 よろしくお願いします。 ------------------------------------------------------------------------- Option Explicit Dim ans, y(5), n y(0)=2017/08/10 4:00:00            y(1)=DateAdd("n",100, y(0))             y(2)=DateAdd("n",40, y(1)) y(3)=DateAdd("n",115, y(2)) y(4)=DateAdd("n",45, y(3)) y(5)=DateAdd("n",120, y(4)) ans = y(5) MsgBox ans, , "答え"

  • VBS サブルーチン化

    いつもお世話になっております。 WindowsXP環境にある下記のようなVBSがあります。 コード------------------------------------------------------------------ '********変数強制宣言******** Option Explicit '********フォルダ変数宣言************ Dim LOG_DIR '********ファイル変数宣言************ Dim LOG_FILE , LOG_FILENAME LOG_DIR = "D:\LOG" LOG_FILE = "CHECK_LOG.txt" LOG_FILENAME = LOG_DIR & "\" & LOG_FILE '********オブジェクト変数定義******** Dim FSO , LOG Set FSO = WScript.CreateObject("Scripting.FileSystemObject") Set LOG = FSO.OpenTextFile(LOG_FILENAME, 2, True) '********時間変数宣言******** Dim YYYY , MM1 , DD , HHMMSS , HH , MM2 , SS '********処理開始時間******** YYYY = Year(Date) MM1 = MONTH(Date) DD = DAY(Date) HH = Right("0" & Hour(Time), 2) MM2 = Right("0" & Minute(Time), 2) SS = Right("0" & Second(Time), 2) LOG.WriteLine("★★★************** 処理日 = " & YYYY & "/" & MM1 & "/" & DD & " 処理開始時間= " & HH & ":" & MM2 & ":" & SS & " ***************★★★") LOG.WriteBlankLines(1) 処理1(省略) '********処理終了時間******** YYYY = Year(Date) MM1 = MONTH(Date) DD = DAY(Date) HH = Right("0" & Hour(Time), 2) MM2 = Right("0" & Minute(Time), 2) SS = Right("0" & Second(Time), 2) LOG.WriteLine("★★★************** 処理日 = " & YYYY & "/" & MM1 & "/" & DD & " 処理終了時間= " & HH & ":" & MM2 & ":" & SS & " ***************★★★") LOG.WriteBlankLines(1) コード------------------------------------------------------------------ 上記VBSは処理1(省略)の前後に開始時間と終了時間をログに出力しています。 ただ、開始と終了時間を取得するのにログ出力直前に現在の【YYYY , MM1 , DD , HHMMSS , HH , MM2 , SS】を取得して ログを出力するのでコードが増えてしまい、スッキリしません。 もっとシンプルに、現在の時間・時刻等をVBSサブルーチンとかで(出来れば同じVBS内に)随時取得したいのですが なかなかコードが書けません。バッチファイルでは無く、VBSだけで実現したいです。 ご存知の方がいれば、ご教授願いませんでしょうか? 何卒、宜しくお願い致します。

  • VBSファイルをスタートアップフォルダに入れておいて、

    エクセル2007の特定ファイルをそのVBSファイルにより自動起動させる方法を教えてください。ちなみに、次のようなVBSファイルを作成しましたがエラーとなってしまいます。 Option Explicit 'オブジェクト変数の宣言とWshShellオブジェクトの作成。 Dim objWshShell Set objWshShell = WScript.CreateObject("WScript.Shell") WScript.Sleep 1000 '1秒待機 objWshShell.Run "C:¥Program Files¥Microsoft Office¥Office12¥EXCEL.exe" です。

  • VBS パスに変数を入れたい

    VBSでファイルのコピー処理を行いたいのですが、その日の日付によって、保存先フォルダを変更する必要があります。 例えば、下の保存フォルダ先を指定する文で、○○○を変数にしたりできたら良いのですが、この様にパスに変数を入れる方法ってありますか? strCopyFolder = "Y:\abc\○○○"

  • 最近開いたファイルをリストアップする

    直前まで(つまり、タイムスタンプが最近のもの)開いたファイルあるいは編集したファイルをプロンプトで返したいのですが、どのようなコマンドがありますでしょうか?findやlocate and sortなどがあると思いますがタイムスタンプのところでちょっと思いつきません。 ご存知の方、宜しくお願いします。

  • BAT+VBSでのファイルZIP化処理が終わらない

    Win7・Win2008環境にて、Windowsバッチ(.bat)から、 引数に対象フォルダ・ZIPファイル作成場所を受け取って フォルダのZIP化を行うVBSスクリプトを作成しています。 下記のスクリプトをsample.vbsで作成しsample.batから実行すると ファイルがZIPファイル内に格納されておりません。(空のZIPファイル) そのため、「★★★」箇所の排他処理の関数を呼び出すようにすると ファイルがZIPファイル内に格納されるようになりましたが、 処理がいつまでも完了しません。 (コマンドプロンプトから直接コマンドライン実行すると正常終了します。) 何か間違ってますでしょうか?(そもそもフォルダのZIP化手順も含め) ご教授ほどよろしくお願い致します。 ■sample.vbs ※okwave用インデントのために全角スペース使用 ' ******************************************************* ' オブジェクト定義 ' ******************************************************* Dim fso Dim subf Dim FileName    ' ファイル名 Dim ArgDam     ' 遡り日数 Dim DifDam     ' 遡り日数との差 Dim FDate      ' ファイル作成日 Dim strTargetFolder ' ZIPファイル作成フォルダ Dim m_objShell Set m_objShell = CreateObject("Shell.Application") Set fso = CreateObject("Scripting.FileSystemObject") intOutRet = 0 ' 引数の取得********************************************* ' 引数/ZIP化対象フォルダ情報を取得 Set subf = fso.GetFolder(WScript.Arguments(0)) ' 引数/ZIPファイルの情報を取得 strTargetFolder = WScript.Arguments(1) ' ZIP化処理********************************************** If CreateZipfile(subf, strTargetFolder) = false Then   intOutRet = 1 End If ' オブジェクト開放 Set fso = Nothing WScript.Quit intOutRet ' ZIPファイルの作成************************************** Private Function CreateZipfile(subf, strTargetFolder)   Dim intFileCnt   Dim idx   On Error Resume Next   intFileCnt = 0   For Each FileName In subf.Files     intFileCnt = intFileCnt + 1   Next   'intFileCnt = intFileCnt - 1   idx = 0   Dim intNumbers() '動的配列を宣言   ReDim intNumbers(intFileCnt)   For Each FileName In subf.Files     intNumbers(idx) = FileName     idx = idx + 1   Next   '書庫ファイル作成   fso.CreateTextFile(strTargetFolder, False).Write "PK" & Chr(5) & Chr(6) & String(18, 0)   '書庫オブジェクト取得   Set l_objZIP = m_objShell.NameSpace(CStr(strTargetFolder))   '圧縮対象ファイルを取得   For Each l_strItem In intNumbers     '書庫に追加     l_objZIP.CopyHere l_strItem     '書庫が排他状態で開けるまで、処理継続・・・・・・・・★★★     Do Until IsNoOpen(l_strItem)     Loop   Next   ' 正常終了   CreateZipfile = True   exit function   On Error Goto 0   ' 異常終了   CreateZipfile = false End Function '排他チェック******************************************** Private Function IsNoOpen(p_strFileName)   'エラー無視   On Error Resume Next   WScript.Sleep 100   'ファイルを追加モードで開く/閉じる   Call fso.OpenTextFile(p_strFileName, 8, false).Close   IsNoOpen = CBool((Err.Number = 0)) End Function ■sample.bat F:\BAT\sample.vbs "F:\LOG" "F:\LOG\sample.zip" exit

  • VBS【特定のレコード長で件数取得】

    お世話になります。 下記VBSコードですが、あるファイルを特定のレコード長(340で1行)で割って件数を取得したいのですが、 どこを改良すればよいでしょうか? ------------------------------------------------------------- Option Explicit '********オブジェクト変数定義******** Dim FSO , f '********カウント変数宣言************ Dim CNT '********フォルダ変数宣言************ Dim TARGET_FOLDER '********ファイル変数宣言************ Dim TARGET_FILE , TARGET_FILENAME '********レコード長変数宣言************ Dim FILE_LENGTH '********時間変数定義******** Dim YYYYMMDD , HHMMSS , HH , MM , SS YYYYMMDD = Year(Date) * 10000 + MONTH(Date) * 100 + DAY(Date) HH = Hour(Time) MM = Minute(Time) SS = Second(Time) If MM < 10 then MM = "0" & MM End If If SS < 10 then SS = "0" & SS End If HHMMSS = HH & ":" & MM & ":" & SS '********その他変数定義******** Dim FILE_SIZE , FILE_DAY '初期設定 TARGET_FOLDER = "D:\test" TARGET_FILE = "test" TARGET_FILENAME = TARGET_FOLDER & "\" & TARGET_FILE FILE_LENGTH = 340 CNT = 0 'ファイルサイズ・ファイル更新日時取得処理 Set FSO = CreateObject("Scripting.FileSystemObject") Set f = FSO.GetFile(TARGET_FILENAME) FILE_SIZE = f.size FILE_DAY = f.DateLastModified 'レコード件数取得処理 With FSO.GetFile(TARGET_FILENAME).OpenAsTextStream(8) CNT = .Line .Close Msgbox CNT Msgbox FILE_SIZE Msgbox FILE_DAY End With ------------------------------------------------------------- 上記だとCNTはあくまで1改行につき1件でカウントしています。 ご存知の方がいらっしゃいましたら、お知恵を拝借させていただけませんでしょうか? 何卒宜しくお願い致します。

  • バッチファイルの変数をパラメーター化

    お世話様です。 WindowsXP環境に下記バッチファイルがあります。 バッチコード内は以下の通りです。 ------------------------------------------------ set TARGET_FILE=test.txt ------------------------------------------------ この【TARGET_FILE】という変数内に格納されている【test.txt】という値を パラメーターとしてあるVBS内の変数Aがそれを受け取って処理をする・・・。 という事は可能でしょうか? 上記バッチは数種類あり、【TARGET_FILE】変数内の値がそれぞれ違います。 VBSコード内は以下の通りです。 ------------------------------------------------ Option Explicit Dim FILE FILE = ○○○←ここに上記バッチ内の【TARGET_FILE】変数の値を受け取る。 MsgBox FILE ------------------------------------------------ 各バッチは上記VBSで実行したいのです。 Msgbox程度の処理は当然バッチでも可能ですが、何個もVBSを作成するのは厳しいので、 パラメーターが可能であれば、このVBS1個で済みます。 ご存知の方がおりましたら、お知恵を拝借しても宜しいでしょうか? 何卒宜しくお願い致します。

  • VBS

    VBSであるファイルを1行ずつ読み込み、その読み込んだ値を ある別のファイルにリダイレクトしたいのですが、 どのように書けばよいか教えてください。 下記のように、echoでは出すことができるのですが、 ファイルにリダイレクトというのができません。 よろしくお願いします。 ==== sample shell ========================= Option Explicit On Error Resume Next Dim objFSO ' FileSystemObject Dim objFile ' ファイル読み込み用 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") If Err.Number = 0 Then Set objFile = objFSO.OpenTextFile("d:\dr1.txt") If Err.Number = 0 Then Do While objFile.AtEndOfStream <> True WScript.Echo objFile.ReadLine Loop objFile.Close Else WScript.Echo "ファイルオープンエラー: " & Err.Description End If Else WScript.Echo "エラー: " & Err.Description End If Set objFile = Nothing Set objFSO = Nothing ============================================================

  • vbsでホームページ表示について

    vbsファイル ・Dim objIE ・Set objIE = CreateObject("InternetExplorer.Application") ・objIE.Visible = True ・objIE.Navigate2 "http://***.***1/" ・objIE.Navigate2 "http://***.***2/", &H1000 ・objIE.Navigate2 "http://***.***3/", &H1000 ・Set objIE = Nothing この中で「, &H1000」を a=", &H1000" objIE.Navigate2 "http://***.***3/" & a とすると正常に表示できません。 変数??に代入するにはどうすればいいのでしょうか。 アドバイス、よろしくお願いします。

専門家に質問してみよう