プロが教えるわが家の防犯対策術!

はじめまして。
開発初心者です。
宜しくご教授お願いいたします。

環境:Windows2000(XP)

フォルダ、サブフォルダを含め対象のディレクトリ一覧をDOSにて出力させる。
dir %DIR% /S /A:D /D | FIND " のディレクトリ" > %DIRLIST%

このテキストファイルをインプットとして、VBscriptでファイル内の特定の文字列を抽出したいです。
<テキストファイル内容>
d:\temp\0001\デイリー\aaa\2006年01月 のディレクトリ
d:\temp\0001\デイリー\aaa\2006年06月 のディレクトリ
d:\temp\0001\マンスリー\aaa\2002年01月 のディレクトリ
d:\temp\0001\マンスリー\aaa\2006年06月 のディレクトリ

現在の日付を取得しデイリーについては2ケ月前、マンスリーについては2年前の一覧をテキストファイルに出力したいです。

日付はフォルダ境界月の1日のシリアル日付を求め、
デイリーについて。デイリーは2ケ月前の1日のシリアル日付。
マンスリーについて。マンスリーは2年前の1日のシリアル日付。

デイリーは2ケ月前の1日のシリアル日付より小さければテキスト一覧に書き込む(マンスリー同様)でいいのでしょうか。

単純に思えたのですが、何日前のとか何年前の文字列を抽出する方法がわからないです。

初心者でうまく伝えられませんが、
宜しくお願いします。

A 回答 (4件)

>何日前のとか何年前の文字列を抽出する方法がわからないです。


"d:\temp\0001\デイリー\aaa\2006年06月 のディレクトリ"
から2006 と06 を取り出すということですか?

この回答への補足

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ケ月前のフォルダ対象かを比較する。

私のイメージです。。
間違っているかもしれませんが、頭を抱えています。。

宜しくご教授お願いいたします。

ご返答、本当に有難うございました。

補足日時:2006/07/12 20:10
    • good
    • 0

#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

この回答への補足

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 'デイリーの時)が間違っているようですが。。
わからなく困っています。

ご指導願えませんでしょうか。

宜しくお願いいたします。

補足日時:2006/07/13 15:58
    • good
    • 0

#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
みたいにすればいいかもしれません。

この回答への補足

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月でよいのかと思っていたのですが。。

よろしくご教授お願いします!

補足日時:2006/07/14 10:37
    • good
    • 0

#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 されているようなので、それはちょっと考えにくいですね。
    • good
    • 0
この回答へのお礼

BLUEPIXYさん。

ご連絡が大変遅れ申し訳ございませんでした。
最終にいただいたアドバイスを元に私なりに
考え、不明な部分につきましては参考書などをみて
なんとか「動く」ロジックが書けました。

まだ完成には至っておりませんが、
参考書片手に勉強し対応したいと思います。

この度、長々とご対応いただき本当に有難うございました。

お礼日時:2006/07/18 19:16

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