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

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

VBscriptでディレクトリ一覧ファイルを抽出したい。

はじめまして。 開発初心者です。 宜しくご教授お願いいたします。 環境: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日のシリアル日付より小さければテキスト一覧に書き込む(マンスリー同様)でいいのでしょうか。 単純に思えたのですが、何日前のとか何年前の文字列を抽出する方法がわからないです。 初心者でうまく伝えられませんが、 宜しくお願いします。

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

  • ベストアンサー
  • 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

  • バッチファイルで一つのファイルをdirで比較し分岐

    バッチファイルでフォルダにある全てのファイルに対し ファイルごとにdir /T:Cとdir /T:Wで比較し 同じならば削除 異なれば何もしない 処理をしたく質問させて頂きました 次のような結果の場合日時が同じなのでファイルを削除する C:\>dir D:\AAA\001.jpg /T:C ドライブ D のボリューム ラベルは microSD です ボリューム シリアル番号は E484-83B8 です D:\AAA のディレクトリ 2012/11/28 12:59 1,284 001.jpg 1 個のファイル 1,284 バイト 0 個のディレクトリ 24,690,798,592 バイトの空き領域 C:\>dir D:\AAA\001.jpg /T:W ドライブ D のボリューム ラベルは microSD です ボリューム シリアル番号は E484-83B8 です D:\AAA のディレクトリ 2012/11/28 12:59 1,284 001.jpg 1 個のファイル 1,284 バイト 0 個のディレクトリ 24,690,798,592 バイトの空き領域 日時が異なるので何もしない C:\>dir D:\AAA\002.jpg /T:C ドライブ D のボリューム ラベルは microSD です ボリューム シリアル番号は E484-83B8 です D:\AAA のディレクトリ 2012/11/07 03:12 1,443,326 002.jpg 1 個のファイル 1,443,326 バイト 0 個のディレクトリ 24,690,798,592 バイトの空き領域 C:\>dir D:\AAA\002.jpg /T:W ドライブ D のボリューム ラベルは microSD です ボリューム シリアル番号は E484-83B8 です D:\AAA のディレクトリ 2012/11/04 17:53 1,443,326 002.jpg 1 個のファイル 1,443,326 バイト 0 個のディレクトリ 24,690,798,592 バイトの空き領域 またもっと簡単にdir D:\AAA /T:Cとdir D:\AAA /T:Wの結果で 分岐処理は可能でしょうか よろしくお願いします

  • Excel VBA サブディレクトリの取得について

    Excel VBA についての質問です。 私は、VBAの初心者です。 フォルダ選択ダイアログを開き、あるフォルダを選択させます。 選択したフォルダ配下のファイルとサブフォルダにあるファイル一覧とそのファイルのパス取得したいです。 【例】D:\TEMP\AAA フォルダを選択 D:\TEMP\AAA  D:\TEMP\AAA\BBB\CCC.txt D:\TEMP\AAA\BBB\DDD\EEE.txt D:\TEMP\AAA\BBB\DDD\FFF.txt GGG.txt が存在する。 まず、フォルダAAAまで選択されたら、 以下の結果がエクセルに出力したいです。 BBB         CCC.txt BBB\DDD        EEE.txt BBB\DDD        FFF.txt               GGG.txt うまく伝えないかもしれないですが、ご教授お願いいたします。

  • 親ディレクトリの更新日付を更新せずにファイルを削除するには

    親ディレクトリの更新日付を更新せずにファイルを削除するには 例えば、以下のディレクトリ構成で「aaa.txt」を削除しても親ディレクトリである「AAA」の更新日付が変更されない方法はありますでしょうか? なお、実装はRHEL5上でのBashスクリプトになります。 /home/hoge/AAA/ => 2010/10/01 06:30:00 /home/hoge/AAA/aaa.txt => 2010/10/01 06:30:00 2010/10/03 12:30:00に以下のコマンドを発行 rm /home/hoge/AAA/aaa.txt /home/hoge/AAA/ => 2010/10/03 12:30:00 に更新されてしまいます。 => 2010/10/01 06:30:00 を保持していたいのです。 できればコマンドのみで解決したいと思っています。 コマンド単体で無理なら、rmで削除する前にディレクトリ情報を一時ファイルへ書き出すしかないと思っています。 以上、よろしくお願いします。

  • ファイル一覧が見たい。

    UNIX系、Solaris、Linuxどちらの場合もあるのですが、 Apacheの公開ディレクトリのファイル一覧を見たいのです。 lsで見るのも、いちいち手間がかかるので、 Windowsのエクスプローラーの様な形式で見られるソフトで、尚且つファイルのパーミッションも全て見えるというのが理想ですが、 理想まで行かなくても、 ファイルの一覧をパッと、ツリー形式で見れるソフトは無いですか? windowsから、ログインして、一覧を抜き出すとか。 linux内で、textに書き出すとか。 どなたか教えて下さい。

  • ディレクトリ一覧作成の高速化

    UNIXで / 配下のディレクトリ一覧をファイル出力することになりました。 今は # find / -type d > /tmp/hoge.txt としてますが、/ 配下のファイル数(ディレクトリも含む)が30万以上もあるため、 一覧を出力するだけで非常に時間がかかります。 ディスクは1マシン辺り30本程ついています。 (この規模のマシンが50台くらい) 後の方法は、ls でドバーっと出力して後からディレクトリだけを抽出する、という 感じくらいかなと思うのですが、もっと早く出力する方法があれば教えてください。 よろしくお願いします。

  • WSHファイルからFTPを利用してダウンロードする

    batファイル,もしくはWSHファイルを使用してのFTPサーバからのファイルダウンロードを行う際の記述方法について質問致します。 行いたいことはFTPサーバ側に日毎のディレクトリが作成され その中に格納されるテキストファイルを自動でローカルの指定ディレクトリに上書きする手順になります。 WSHに関しては全くの素人なので非常に苦戦しております… FTPサーバ側 /@day/*.txt @dayには本日の日付が2桁で入ります。 1月1日なら01、2月23日なら23 Local保存側 D:\temp お手すきの時にでもご教授頂ければ幸いです。

  • コマンドプロンプトでディレクトリ内のファイル一覧をテキストファイルに書き出す

    コマンドプロンプトでディレクトリ内のファイル一覧をテキストファイルに書き出す事が出来たはずなのですが、方法を忘れてしまいました。 例えば dir Aフォルダ 内に 1.gif 2.jpeg 3.eps が入っている場合にコマンドプロンプトにて -------- 1.gif 2.jpeg 3.eps -------- という内要のテキストファイルを作成したいのです。 上記のように3点しかないものなら自力で作成するのですが 5000点ほどある為手作業ではしんどいです。 できれば純粋なファイル名(拡張子なし)で実現できればいいのですが、それが無理なら後はテキスト処理で対応しようと考えています。 識者の方よろしくお願いします。

  • ディレクトリー内のファイル名へのアクセス

    Windows10を使っています。 ファイルエクスプローラーを使ってあるディレクトリーをオープンした時に表示されるファイル名一覧を、テキストとして任意の場所にセーブする方法はありませんか? ご存知の方がいらっしゃいましたら、どうか教えてください。お願いします。

  • VBScriptで削除処理

    初めまして。 VBScriptを今回初めて使用しながらスクリプトを作成しようとしています。 〔質問〕 以下のような削除処理をVBScriptにて実施したいのですが、どのような構文を書けばいいのでしょうか? ご教授お願いします。 以下、例を挙げ記述致します。 (例)処理日が2008/3/22の場合。 「AAAA」ディレクトリ配下の以下のログファイルを二日前までの日付になっているログファイルのみ残し、あとは全て削除するという処理をしたい。 AAAAディレクトリの配下 ・aa080319.log→削除 ・aa080320.log→削除 ・aa080321.log→残す ・aa080322.log→残す 上記例を用いますが、自分で考えた処理フローとしまして、 (1)「AAAA」ディレクトリ配下のファイル一覧をテキストファイルに書き込む。 (2)「(1)」で作成したテキストファイルを読み込み、「2008322」と「2008321」に一致しないログファイルを削除。 以上、宜しくお願いします。

  • バッチファイルでのファイル一覧取得

    初心者です。初めてバッチファイルを作成しようと考えていますが、作成方法がわかりません。 環境はWindwsです。 C:\BディレクトリにAというフォルダがありその中に複数のテキストファイルが保存されています。 そのファイルの一覧をBディレクトリ直下のfile_name.txtへ書き込みたいのですが、dirコマンドでファイルの一覧が取得できるのはわかったのですが、ディレクトリ移動してファイルを書き込む方法がわからず困っています。 更にAフォルダには毎日違うテキストファイルが保存されるため、次回バッチを起動した際にはfile_name.txtの中身をクリアして新規に書き込みをしたいと考えています。 初心者で質問内容に不備があるかもしれませんが、ご教授お願いします。