はじめまして。
開発初心者です。
宜しくご教授お願いいたします。
環境: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日のシリアル日付より小さければテキスト一覧に書き込む(マンスリー同様)でいいのでしょうか。
単純に思えたのですが、何日前のとか何年前の文字列を抽出する方法がわからないです。
初心者でうまく伝えられませんが、
宜しくお願いします。
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 されているようなので、それはちょっと考えにくいですね。
BLUEPIXYさん。
ご連絡が大変遅れ申し訳ございませんでした。
最終にいただいたアドバイスを元に私なりに
考え、不明な部分につきましては参考書などをみて
なんとか「動く」ロジックが書けました。
まだ完成には至っておりませんが、
参考書片手に勉強し対応したいと思います。
この度、長々とご対応いただき本当に有難うございました。
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
みたいにすればいいかもしれません。
この回答への補足
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月でよいのかと思っていたのですが。。
よろしくご教授お願いします!
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
この回答への補足
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 'デイリーの時)が間違っているようですが。。
わからなく困っています。
ご指導願えませんでしょうか。
宜しくお願いいたします。
No.1
- 回答日時:
>何日前のとか何年前の文字列を抽出する方法がわからないです。
"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ケ月前のフォルダ対象かを比較する。
私のイメージです。。
間違っているかもしれませんが、頭を抱えています。。
宜しくご教授お願いいたします。
ご返答、本当に有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ftpのmgetコマンドの自分の格納...
-
ホームページのディレクトリを...
-
「照合パターンに合いません」...
-
7zを使うとフォルダの中身がす...
-
make時に出てきたエラーメッセ...
-
#./configureの時点でダメです。
-
ディレクトリ内に作成できる最...
-
tarコマンドのエラーについて
-
FTPでPUTできない原因は何?
-
FTPコマンドのCDについて
-
pkg-configの使い方
-
/(スラッシュ)で区切ったフル...
-
拡張子.dどういう意味
-
ftpでのフォルダごとの転送はで...
-
ファイル名で / (スラッシュ...
-
ファイル名の勝手な書き換えに...
-
unzipコマンドでディレクトリな...
-
「ドット(.)」と「¥」の意味...
-
linuxコマンド mkdirでディレ...
-
シェルススクリプト内のパス指...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ftpのmgetコマンドの自分の格納...
-
ホームページのディレクトリを...
-
拡張子.dどういう意味
-
scpによるデータ転送後、ディレ...
-
FTPコマンドのCDについて
-
7zを使うとフォルダの中身がす...
-
make時に出てきたエラーメッセ...
-
「ドット(.)」と「¥」の意味...
-
バッチファルの置き場所
-
ファイル名で / (スラッシュ...
-
FTPでPUTできない原因は何?
-
linuxコマンド mkdirでディレ...
-
Linuxコマンドについて
-
linuxのコマンドラインで、拡張...
-
2TBのUSBメモリを2000円ほどで...
-
「照合パターンに合いません」...
-
/(スラッシュ)で区切ったフル...
-
ftpでのフォルダごとの転送はで...
-
unzipコマンドでディレクトリな...
-
"cp -a"と"cp -r"の違い
おすすめ情報