• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBscriptでディレクトリ一覧ファイルを抽出したい。)

VBscriptでディレクトリ一覧ファイルを抽出する方法について

このQ&Aのポイント
  • VBscriptを使用して、Windows2000上でフォルダやサブフォルダを含むディレクトリ一覧を取得し、特定の文字列を抽出する方法が知りたいです。
  • 現在の日付を取得し、デイリーとマンスリーのディレクトリ一覧をテキストファイルに出力する方法も教えていただけると助かります。
  • 初心者ですが、ディレクトリ一覧の抽出方法や特定の文字列の抽出方法について詳しい説明をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#3補>※最初の2行はなんとか削除できないのでしょうか? ああっ、申し訳ございません。<(_ _)> find がファイルで指定した時にファイル名を含むようになるとは思いませんでした。 さしあたり、 dir %DIR% /S /A:D /D > dirlist1.tmp type dirlist1.tmp |find "日次" > dirlist2.tmp type dirlist1.tmp |find "月次" >> dirlist2.tmp type dirlist2.tmp |find " のディレクトリ" > %DIRLIST% del dirlist1.tmp del dirlist2.tmp の様に変更すればいいと思います。 申し訳ございませんでした。 #3>「インデックスが有効範囲にありません」とエラーになります。 #3>「\」は左から5つ目の\から文字列8つのyyyy年mm月でよいのかと思っていたのですが。。 そうですね。 #3補足で示されたデータでやってみましたが、エラーにはなりませんでした。 >If DateValue(left(field(5),8)) < baseDate Then の前の行に WScript.Echo "debug:" & aLine としてみて、エラーの起こるデータの確認をしてみて、それを教えて頂けませんか。 データがおかしくないとすると、どこかで綴り間違いしているとか思うのですが、Option Explicit されているようなので、それはちょっと考えにくいですね。

taffy001
質問者

お礼

BLUEPIXYさん。 ご連絡が大変遅れ申し訳ございませんでした。 最終にいただいたアドバイスを元に私なりに 考え、不明な部分につきましては参考書などをみて なんとか「動く」ロジックが書けました。 まだ完成には至っておりませんが、 参考書片手に勉強し対応したいと思います。 この度、長々とご対応いただき本当に有難うございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2>D:\060713_001_DiskLaundry.vbs(23, 1) Microsoft VBScript 実行時エラー: インデックスが有効範囲にありま せん。: '[number: 3]' えーとですね。 #2のプログラムはあくまで抽出とかXXX前の日付を作って比べるという(質問の内容について)サンプルで書いたもので、そのまま動かして動かないと言われても困ってしまいます。 #1でも書いているように、実際の状況に合わせて修正する必要があります。 もっと汎用的に作ればいいのですが、 こういう状況がある、ああいう状況があるという細かい状況が与えられていませんので、そういった不測の事態を想定したプログラムを作ることは困難です。 今回うまくいかなかった"D:\bat\dirlist.txt"の内容を補足していただけますか? それを見れば、どのように修正をしたらいいのかアドバイスもできると思います。 配列範囲外のエラーについては、 扱うフォルダの構成を "C:\temp\aaa\デイリー\12345\2006年03月 のディレクトリ" のように想定していて "\" で分解しfield という名の配列に格納しています。 例えば "C:\temp\aaa\デイリー\12345\2006年03月 のディレクトリ" の場合で言えば field(0)="C:" field(1)="temp" field(2)="aaa" field(3)="デイリー" field(4)="12345" field(5)="2006年03月 のディレクトリ" の様になります。 なので、エラーが起こった原因は、 フォルダの構成が、プログラムの予想していたものと違ったということだと思います。 例えば、 D:\デイリー\2006年01月 のディレクトリ のようになっていた場合 field(0)="D:" field(1)="デイリー" field(2)="2006年01月 のディレクトリ" のようになって field(3) は作られませんのでエラーになります。 #2のプログラムは、 デイリー、マンスリー 日付のフォルダが同一階層にあることを想定しており また、 "D:\temp のディレクトリ" のようなデータがテキストファイルの内容としてあるということを想定していません。 例えば そういうデータを除くには、 dir %DIR% /S /A:D /D > dirlist1.tmp find "デイリー" dirlist1.tmp > dirlist2.tmp find "マンスリー" dirlist1.tmp >> dirlist2.tmp find " のディレクトリ" dirlist2.tmp > %DIRLIST% del dirlist1.tmp del dirlist2.tmp みたいにすればいいかもしれません。

taffy001
質問者

補足

BLUEPIXYさん 毎回、ご回答いただきまして 本当にありがとうございます。 ご指摘いただいたとおり、 私のbatファイルですと以下の文字列も列挙していました。 -------------------------------------------- d:\temp のディレクトリ -------------------------------------------- BLUEPIXYさんに教えていただいたように batファイル修正を行い、以下がdirlist.txtの内容になります。 ※最初の2行はなんとか削除できないのでしょうか? -------------------------------------------- ---------- DIRLIST2.TMP d:\temp\aaaa\日次\12345\2005年01月 のディレクトリ d:\temp\aaaa\日次\12345\2005年02月 のディレクトリ d:\temp\aaaa\日次\12345\2005年03月 のディレクトリ d:\temp\aaaa\日次\12345\2005年04月 のディレクトリ d:\temp\aaaa\日次\12345\2005年05月 のディレクトリ d:\temp\bbbb\日次\6789a\2005年01月 のディレクトリ d:\temp\bbbb\日次\6789a\2005年02月 のディレクトリ d:\temp\bbbb\日次\6789a\2005年03月 のディレクトリ d:\temp\bbbb\日次\6789a\2005年04月 のディレクトリ d:\temp\bbbb\日次\6789a\2005年05月 のディレクトリ d:\temp\aaaa\月次\12345\2004年07月 のディレクトリ d:\temp\aaaa\月次\12345\2004年08月 のディレクトリ d:\temp\aaaa\月次\12345\2004年09月 のディレクトリ d:\temp\bbbb\月次\6789a\2004年05月 のディレクトリ d:\temp\bbbb\月次\6789a\2004年06月 のディレクトリ d:\temp\bbbb\月次\6789a\2004年07月 のディレクトリ -------------------------------------------- 仮に頭の2行を削除し、 Scriptを動かして見ましたが、 「If DateValue(left(field(5),8)) < baseDate Then」ところで、 「インデックスが有効範囲にありません」とエラーになります。 「\」は左から5つ目の\から文字列8つのyyyy年mm月でよいのかと思っていたのですが。。 よろしくご教授お願いします!

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1の補足を読んで、簡単なサンプルを作ってみました 細部は実際のディレクトリの状況とか 日付の比較で <= (指定日を含む)なのか < (含まない)なのかとか調整して下さい。 ---------------------------------------------------------------- '扱うフォルダの構成 'C:\temp\aaa\デイリー\12345\2006年03月 のディレクトリ Set fso = CreateObject("Scripting.FileSystemObject") today = Date '今日の日付 firstDay = DateSerial(Year(today),Month(today),1) '今月の1日 Set DirTxtFile = fso.OpenTextFile("ディレクトリ一覧.txt") Do Until DirTxtFile.AtEndOfStream aLine = DirTxtFile.ReadLine '一行読み出し field=split(aLine, "\",-1,1) '"\" で区切られた文字列の分解 If field(3) = "デイリー" Then 'デイリーの時 baseDate = DateAdd("m",-2,firstDay) '2ヶ月前の1日 ElseIf field(3) ="マンスリー" Then baseDate = DateAdd("yyyy",-2,firstDay) '2年前の1日 End If 'left(field(5),8) で日付部分を取りだし日付にして基準日より小さいか調べる If DateValue(left(field(5),8)) < baseDate Then WScript.Echo aLine ' 該当する行の書き出し End If Loop DirTxtFile.Close ---------------------------------------------------------------- 実行方法: cscript //nologo select.vbs > output.txt

taffy001
質問者

補足

BLUEPIXYさん。 こんにちは。 お忙しいところご回答有難うございます。 以下のように実行してみましたが、 エラーとなってしまいました。 <実行ロジック> ------------------------------------------------- '扱うフォルダの構成 'C:\temp\aaa\デイリー\12345\2006年03月 のディレクトリ Option Explicit Dim aLine Dim baseDate Dim DirTxtFile Dim field Dim firstDay Dim fso Dim strPath Dim today strPath = "D:\bat\dirlist.txt" ' ディレクトリ一覧ファイル today = Date '今日の日付 firstDay = DateSerial(Year(today),Month(today),1) '今月の1日 Set fso = CreateObject("Scripting.FileSystemObject") Set DirTxtFile = fso.OpenTextFile(strPath) Do Until DirTxtFile.AtEndOfStream aLine = DirTxtFile.ReadLine '一行読み出し field = split(aLine, "\",-1,1) '"\" で区切られた文字列の分解 If field(3) = "デイリー" Then 'デイリーの時 baseDate = DateAdd("m",-2,firstDay) '2ヶ月前の1日 ElseIf field(3) ="マンスリー" Then baseDate = DateAdd("yyyy",-2,firstDay) '2年前の1日 End If 'left(field(5),8) で日付部分を取りだし日付にして基準日より小さいか調べる If DateValue(left(field(5),8)) < baseDate Then WScript.Echo aLine ' 該当する行の書き出し End If Loop DirTxtFile.Close ---------------------------------------------- <エラー内容> D:\>cscript //nologo test1.vbs > output.txt D:\060713_001_DiskLaundry.vbs(23, 1) Microsoft VBScript 実行時エラー: インデックスが有効範囲にありま せん。: '[number: 3]' 23行目(If field(3) = "デイリー" Then 'デイリーの時)が間違っているようですが。。 わからなく困っています。 ご指導願えませんでしょうか。 宜しくお願いいたします。

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>何日前のとか何年前の文字列を抽出する方法がわからないです。 "d:\temp\0001\デイリー\aaa\2006年06月 のディレクトリ" から2006 と06 を取り出すということですか?

taffy001
質問者

補足

BLUEPIXYさん。 こんにちは。 ご回答いただき有難うございました。 取り出したい文字列ですが、例では下記になります。 ■DOSで出力したディレクトリ一覧.txtの内容 C:\temp\aaa\デイリー\12345\2006年03月 のディレクトリ C:\temp\bbb\デイリー\6789a\2006年07月 のディレクトリ C:\temp\aaa\マンスリー\12345\2001年03月 のディレクトリ C:\temp\bbb\マンスリー\6789a\2001年07月 のディレクトリ ■VBscriptにてディレクトリ一覧.txtから抽出したい文字列。 ※条件 (1)デイリーは現在日付よりも2ケ月前を対象。 (2)マンスリーは現在日付よりも2年前を対象 アウトプットしたいテキストファイル内は次のようになります。 C:\temp\aaa\デイリー\12345\2006年03月 のディレクトリ C:\temp\aaa\マンスリー\12345\2001年03月 のディレクトリ C:\temp\bbb\マンスリー\6789a\2001年07月 のディレクトリ InStr関数を使えばいいのでしょうか? ロジックが初心者で全く書けません。。 頭から3つ目の「\」でデイリー対象を挙げて、 次に頭から5つ目の「\」で日付を挙げる。 その日付が現在日付よりも2ケ月前のフォルダ対象かを比較する。 私のイメージです。。 間違っているかもしれませんが、頭を抱えています。。 宜しくご教授お願いいたします。 ご返答、本当に有難うございました。

すると、全ての回答が全文表示されます。

関連するQ&A