dポイントプレゼントキャンペーン実施中!

はじめまして。
つい先日からvbsを勉強しはじめた者です。
質問内容が要領をえていないかもしれませんが、よろしくお願いいたします。

下記の内容をvbsで実行したいと思っているのですが、なかなかうまくいきません。
たとえば、aaaフォルダの中にさらにbbbやcccフォルダがあるとします。(実際はもっと多くのフォルダが存在します)
そのbbbやccc等の中にwordと一太郎のファイルがあります。
ファイル名が、
 C:\aaa\bbb\bbbああ.doc(x)
 C:\aaa\bbb\bbbああ①.doc
 C:\aaa\bbb\bbbああ.jtd
 C:\aaa\ccc\cccああ.jtd
 C:\aaa\ccc\ccc①ああ.doc
 C:\aaa\ddd\ddd①ああ.doc

だった場合に、「ああ」が含まれるファイルのみ削除したいと思っています。
Instr関数やRegExpを使えばいいのかなというところまではわかったのですが、
ファイル名をどう指定したらいいのか、また指定したファイルがあった場合のDeleteFileの書き方がいまいちわかりません。

もしよろしければ、ご教示いただけないでしょうか。
よろしくお願いします。

質問者からの補足コメント

  • うーん・・・

    上記で書いておりますファイル名のほかに、ファイル名に「いい」が含まれるものも削除したいです。
    C:\aaaフォルダ下の各フォルダ内にある「ああ」「いい」がファイル名に含まれるファイルをすべて削除したいです。

    例)
     C:\aaa\bbb\bbbああ.doc(x)   → 削除したい
     C:\aaa\bbb\bb123.doc(x)     → 削除したくない
     C:\aaa\bbb\bbbいい.doc(x) → 削除したい
     C:\aaa\ccc\cccいい.jtd → 削除したい
     C:\aaa\ddd\12345.jtd → 削除したくない

      補足日時:2016/09/09 14:04

A 回答 (3件)

以下のようにしてください。

(スクリプト名はsample.vbsとします)
---------------------------------------
Option Explicit

Dim objFSO ' FileSystemObject
Dim objStartFolder ' 開始フォルダ
Dim objREG '正規表現
set objREG = New RegExp
objREG.Pattern = "(ああ|いい)"
' フォルダ検索関数
Sub FindFolder(ByVal objMainFolder)
Dim objSubFolder ' サブフォルダ
Dim objFile ' ファイル
'各ファイルを表示
For Each objFile In objMainFolder.Files
'WScript.Echo "  " & objFile.Name
if objREG.Test(objFile.Name) then
WScript.Echo "  " & objFile.Name & "  削除対象"
'objFSO.DeleteFile objFile.Path 'ファイル削除
End If
Next
'サブフォルダを処理
For Each objSubFolder In objMainFolder.SubFolders
WScript.Echo objSubFolder.Path
FindFolder objSubFolder
Next
End Sub

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objStartFolder = objFSO.GetFolder("c:\aaa")
WScript.Echo objStartFolder.Path
FindFolder objStartFolder

Set objStartFolder = Nothing
Set objFSO = Nothing
---------------------------------------------------------------------------
コマンドプロンプト(DOSプロンプト)で
sample.vbsの存在するフォルダに移動し
cscript sample.vbs
と入力すると
c:\aaa下の
フォルダ一覧と ああ又はいいの文字が含まれるファイル名を表示します。
表示されたファイル名が削除対象であることを確認してください。
次に、'objFSO.DeleteFile objFile.Path 'ファイル削除 の行がコメントになっていますので
そのコメントをはずしてしてください。
cscript sample.vbs と入力すると、前回と同じ内容が表示され実際にファイルが削除されます。
    • good
    • 0
この回答へのお礼

お返事が大変遅くなってしまい申し訳ありません。
試してみたところ、複数のファイルを削除することができました!
ファイルを検索して指定のファイルのみ削除する、こういう命令も色々な書き方や考え方があるんですね。
お二方のコードを動かしてみて、ただただ感動するばかりです。
複数のファイルを削除できましたので、 tatsu99様をベストアンサーにさせていただきます。
本当にありがとうございました。

お礼日時:2016/09/16 09:03

たまたま見ていたら、こんな書き込みがありました。


http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …

コードの以下にある、
fso.DeleteFile subFold.path
ここで削除の部分をコメントアウトしておけば、削除する一覧が出てきますから、それで、実際に「Run」するか決めればよいです。いきなり削除というわけにはいかないと思います。

それと、全部削除できるとは限らないような気がします。
以下は、Zipファイルの中まで検索しています。

また、正規表現も少し考えてみたけれども、ややこしさが深まります。
以下では、Msgbox msg または、 objText.WriteLine msg で出力するようにしています。

最終的には、コメントアウトを外して、fso.DeleteFile subFold.Pathを実行してください。

トラブルがあっても、こちらでは、責任を持てませんので、後は、よろしくおねがいします。


Option Explicit
Const BASEFOLDER ="C:\Temp\Test1\" '末尾は\をつけます
Const SEARCHPATTERN ="ああ"
Dim Re
Dim i, k, j
Dim msg, arg, FSO, oShell
Dim objRootDir
ReDim fns(100)
Dim objText
i = 1
If Right(BASEFOLDER, 1) <> "\" Then MsgBox BASEFOLDER & "の末尾に、' \ ' が抜けています。": WScript.Quit

Set FSO = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject("Shell.Application")

If FSO.FolderExists(BASEFOLDER) =False Then
MsgBox BASEFOLDER & "が見つかりません。",64
WScript.Quit
End If
Set objRootDir = oShell.Namespace(BASEFOLDER)
i=0
Search objRootDir.Items.Item, i '
ReDim Preserve fns(k)
msg = Join(fns, Chr(13))
'WScript.echo msg
Set objText =FSO.CreateTextfile(BASEFOLDER &"DeleteFiles.Txt")
objText.WriteLine msg
objText.Close
Set FSO = Nothing: Set oShell = Nothing
WScript.Quit

Sub Search(arg , i )
Dim objItmes
Dim subFold
Dim fn
i = i + 1
If arg.IsFolder Then
Set objItmes = arg.GetFolder.Items
On Error Resume Next
For Each subFold In objItmes
If subFold.IsFolder Then
fol = subFold.Name
Else
fn = subFold.Name
'ファイル削除 (ここを工夫すべし)
If InStr(1,fn,SEARCHPATTERN,1)>0 Then
'fso.DeleteFile subFold.path 'ここで削除
k= k + 1
fns(k) = "-" & subFold.Path
End if
End If
Search subFold, i
Next
On Error GoTo 0
End If
End Sub
    • good
    • 0
この回答へのお礼

お返事が大変遅くなってしまい申し訳ありません。
試してみたところ、txtにリストが書き出され、削除もできました。
ここから「いい」ファイルも削除する場合、SERACHPATTERNをもう一つ増やすとできるのでしょうか?
恥ずかしながら、Constも初めて知りました。
vbsの勉強を始めたばかりですので、こんな風に教えてくださって、本当に助かりました。
このコードを参考にもっと知識を深めたいと思います。
本当にありがとうございました。

お礼日時:2016/09/16 09:00

これはc:\aaaを指定した時に、再帰的に全ファイルを検索して


「ああ」がファイル名に含まれるファイルを削除するという意味ですね?
かりにディレクトリ名に「ああ」が含まれる場合はディレクトリごと削除でしょうか?
それともファイル名にさえ入っていなければ無視でしょうか?
    • good
    • 0
この回答へのお礼

早速ありがとうございます。

>これはc:\aaaを指定した時に、再帰的に全ファイルを検索して
>「ああ」がファイル名に含まれるファイルを削除するという意味ですね?

はい、おっしゃるとおりです。
言葉足らずですみません…。
ディレクトリ名には「ああ」が含まれるものはありません。
今ちょうど試行錯誤しているところで気づいたのですが、もう1点追加事項ができましたので、補足コメントに書いておきます。

もしよろしければ、合わせてご教示願えないでしょうか。

お礼日時:2016/09/09 13:58

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

このQ&Aを見た人はこんなQ&Aも見ています