- PR -

VBSであるフォルダの以下特定のファイルを全て参照する方法

投稿者投稿内容
ポン
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 98
投稿日時: 2006-11-09 16:01
platiniさんご回答ありがとうございます。投稿が入れ違ったようで返信が遅れておりました。申し訳ございません。

参考HPを見まして作成してみました

'ファイルオブジェクトを作成
Set Lo_objFileSys = CreateObject("Scripting.FileSystemObject")
'フォルダ内の名前取得
Set Lo_objFileSys = Lo_objFileSys.GetFolder("C:\DelFile")

ShowSubFolders(Lo_objFileSys)

'サブプロシージャーで再帰使用?
Sub ShowSubFolders(Folder)
  Lt_Msg="ファイルが存在しません。"
  Sp_Log( Lt_Msg )
'取得したフォルダーのサブフォルダーを検索
For Each objWK_T in Folder.SubFolders

  'ファイルシステムオブジェクトの作成
Set Lo_objFileSys_File = CreateObject("Scripting.FileSystemObject")
'フォルダ内の名前取得
Set Lo_objFile_File = Lo_objFileSys_File.GetFolder(objWK_T.Path)

'ファイル名を全部回す
For Each objTT in Lo_objFile_File.Files
  'ファイル名に"db"があるかないかをチェック
   If InStr(objTT.Path,".db") > 0 then
       'ファイルの削除を行います
     Lo_objFile_File.DeleteFile objTT.Path
   Else
   End If
    Next

'オブジェクトの開放
Set Lo_objFileSys_File = Nothing
Set Lo_objFile_File = Nothing
'????
Wscript.Echo objWK_T.Path
'再帰呼び出し?
ShowSubFolders(objWK_T)
Next
End Sub

と作成してみたのですがうまく動作はしません・・・
色々試行錯誤中でございます。何かご教授いただければ幸いです。
宜しくお願い致します。

かずくんさんご回答ありがとうございます。

VBSでの作成が今回初めてで今日中に作成しなければならないので・・・
すみませんだいぶ焦っている状態です・・・
完成後参考HPを読みもう一度勉強しなおしたいと思っております
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-09 16:05
引用:

ポンさんの書き込み (2006-11-09 14:57) より:

If InStr(objWK_T.Path,".txt") > 0 then


ファイル名自体に 「.txt」 が含まれた場合も、削除対象になりますが良いのでしょうか?
それと、拡張子が 「.TxT」 だった場合の考慮がなされていないようですね。
(拡張子が、小文字ばかりとは限りません)

引用:

Sp_Log(objWK_T.Path)


とは、何でしょうか?

引用:

Set Lo_objFile = CreateObject("Scripting.FileSystemObject")


何故、ここで無意味にインスタンスを再取得しているのでしょうか?

引用:

何かお気づきの点がありましたらご教授よろしくお願いします


再帰呼び出しする場所は、ディレクトリを列挙している箇所です。
当たり前ですが、再帰呼び出しをするのであれば、関数化しなければなりません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ポン
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 98
投稿日時: 2006-11-09 16:22
じゃんぬねっとさんご回答ありがとうございます。

>ファイル名自体に 「.txt」 が含まれた場合も、削除対象になりますが良いのでしょうか?
それと、拡張子が 「.TxT」 だった場合の考慮がなされていないようですね。
(拡張子が、小文字ばかりとは限りません)

こちらは今回小文字のみの指定で大丈夫との事でしたので固定です。

>Sp_Log(objWK_T.Path)

これはログファイルを出力するもので・・・関数では関係ないものです
消し忘れていました。申し訳ございません。

>Set Lo_objFile = CreateObject("Scripting.FileSystemObject")
フォルダ用とファイル用でオブジェクトを分けなければならないと思っておりました。

>再帰呼び出しする場所は、ディレクトリを列挙している箇所です。
当たり前ですが、再帰呼び出しをするのであれば、関数化しなければなりません。

すみません・・・今日初めてやったばかりで右も左も分からない状況です・・・
さきほど書いたソースで関数化もしたつもりでした。
もう一度見直します


じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-09 16:35
引用:

ポンさんの書き込み (2006-11-09 16:22) より:

こちらは今回小文字のみの指定で大丈夫との事でしたので固定です。


UCase 関数で合わせるだけで万全なのですから、わざわざ固定しなくても良いと思います。

> ファイル名自体に 「.txt」 が含まれた場合も、削除対象になりますが良いのでしょうか?

についてはスルーされているようですが、大丈夫なのでしょうか?

これも、せっかく FileSystemObject を使っているのですから、
GetExtensionName メソッドで、簡潔な実装をしましょう。

引用:

さきほど書いたソースで関数化もしたつもりでした。


関数の中身だけ掲載されても、再帰呼び出ししているかどうか、第三者には判断できないと思いませんか?
(関数名と引数リストがわからないわけですから)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ポン
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 98
投稿日時: 2006-11-09 16:40
ご回答ありがとうございます。

じゃんぬねっとさんのご教授をもとに少し変更したものを作成してみました。


'ファイルオブジェクトを作成
Set Lo_objFileSys = CreateObject("Scripting.FileSystemObject")
'フォルダ内の名前取得
Set Lo_objFileSys = Lo_objFileSys.GetFolder("C:\DelFile")

'取得したフォルダーのサブフォルダーを検索
For Each objWK_T in Lo_objFileSys.SubFolders

ShowSubFolders(objWK_T)

Next

///////////////サブプロシージャー///////////////////////
Sub ShowSubFolders(Folder)

'ファイルシステムオブジェクトの作成
Set Lo_objFileSys_File = CreateObject("Scripting.FileSystemObject")
'フォルダ内の名前取得
Set Lo_objFile_File = Lo_objFileSys_File.GetFolder(objWK_T.Path)
'ファイル名を全部回す
For Each objTT in Lo_objFile_File.Files
'Sp_Log(objWK_T.Path)
'ファイル名に"db"があるかないかをチェック
If InStr(objTT.Path,".db") > 0 then
'ファイルの削除を行います
Lo_objFileSys_File.DeleteFile objTT.Path
Else
End If
Next
'????
Wscript.Echo objWK_T.Path
'再帰呼び出し?
ShowSubF olders(objWK_T)
'オブジェクトの開放
Set Lo_objFileSys_File = Nothing
Set Lo_objFile_File = Nothing

End Sub

.txtの部分にはすみませんまだ修正はしておりません;;
上の点でまたお気づきの点がありましたらご教授宜しくお願い致します。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-11-09 16:45
似たようなVBSが手元にあったのでちょっといじったものです。
(ほぼ答えです。)
コード:
Option Explicit

Private objFSO

Call Main()
WScript.Quit

Public Sub Main()
    Dim strPath
    Dim strExt
    Dim blnSubFolder

    strPath = "C:\DelFile"  ' 削除対象ディレクトリ
    strExt = "txt"          ' 削除対象拡張子
    blnSubFolder = True     ' サブディレクトリ対象フラグ
    
    Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
    
    Call DeleteTextFile(objFSO.GetFolder(strPath), strExt, blnSubFolder)
    WScript.Echo "終了"
    
    Set objFSO = Nothing
End Sub

Private Sub DeleteTextFile(ByVal objFolder, ByVal strExt, ByVal blSubFolder)
    Dim objFile
    Dim objSubFolder
    
    ' サブディレクトリのファイルも削除するか
    If blSubFolder Then
        For Each objSubFolder In objFolder.SubFolders
            Call DeleteTextFile(objSubFolder, strExt, True)
        Next
    End If
    ' 対象ファイルの削除
    For Each objFile In objFolder.Files
        ' 拡張子の確認(小文字に変換して比較)
        If LCase(objFSO.GetExtensionName(objFile.Name)) = strExt Then
            Call objFile.Delete()
        End If
    Next
End Sub

ポン
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 98
投稿日時: 2006-11-09 17:20
Blueさんご回答ありがとうございます。

掲示板を確認する前にようやくサブフォルダの中は全部削除できるという段階でした。
しかし対象フォルダ直下のファイルが削除できていない事に気づきその部分を修正しておりました。

Blueさんのソースの綺麗さとは全然及びませんが皆様のお力を借りて作成でき
良かったです。
ありがとうございました。

ただやはりお力を借りての完成ということとBlueさんのソースのきちんとまとめられた
ものを見て・・・大変悔しい気持ちもありました

本日初めての言語とはいえ・・・もっと知識をつけたいです。ありがとうございました
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-09 17:22
即興で組んでみました。

コード:

    Option Explicit

    Call Main()

    Private Sub Main()
        Call DeleteFileMostDeep("C:\ぽぴ王子\House", "txt")    
    End Sub

    Private Sub DeleteFileMostDeep(stDirectoryPath, stExtension)
        stExtension = LCase(stExtension)

        Dim oFso 'As Scripting.FileSystemObject
        Set oFso = CreateObject("Scripting.FileSystemObject")

        Dim oFirstFolder 'As Scripting.Folder
        Set oFirstFolder = oFso.GetFolder(stDirectoryPath)

        Dim oFolder 'As Scripting.Folder
        For Each oFolder In oFirstFolder.SubFolders
            Call DeleteFileMostDeep(oFolder.Path, stExtension)
        Next

        Set oFolder = Nothing

        Dim oFile 'As Scripting.File
        For Each oFile In oFirstFolder.Files
            If LCase(oFso.GetExtensionName(oFile.Name)) = stExtension Then
                Call oFile.Delete(True)
            End If
        Next

        Set oFile = Nothing
        Set oFirstFolder = Nothing
        Set oFso = Nothing
    End Sub


間違いはあるかもしれません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)