ウェブ家の備忘録

ウェブデザイナーの備忘録

VBS 私的メモ

■ファイル・フォルダの名前変更、ファイル・フォルダの削除

'ファイル・フォルダ名前変更
WScript.CreateObject("Scripting.FileSystemObject").GetFile("C:\test\a.txt").Name = "aa.txt"
WScript.CreateObject("Scripting.FileSystemObject").GetFolder("C:\test").Name = "test1"
'ファイル・フォルダ削除
WScript.CreateObject("Scripting.FileSystemObject").DeleteFile "C:\test\*.*"
WScript.CreateObject("Scripting.FileSystemObject").DeleteFolder "C:\test\1"
Dim wsFSO,FSO
Set wsFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set FSO   =         CreateObject("Scripting.FileSystemObject")

'環境変数可、対象データ不在エラー回避
Call getTarget("file","C:\test\a.txt","aa.txt")
Call deleteTarget("folder","C:\test\1")

Sub getTarget(dataType,address,rename)
  If dataType = "folder" and FSO.FolderExists(envStr(address)) = True Then
    wsFSO.GetFolder(envStr(address)).Name = rename
  End If
  If dataType = "file"   and FSO.FileExists(envStr(address))   = True Then
    wsFSO.GetFile(envStr(address)).Name = rename
  End If
End Sub

Sub deleteTarget(dataType,address)
  If dataType = "folder" and FSO.FolderExists(envStr(address)) = True Then
    wsFSO.DeleteFolder(envStr(address))
  End If
  If dataType = "file" Then
  If FSO.FileExists(envStr(address)) = True or FSO.FolderExists(deleteAsterisk(envStr(address))) = True Then
    wsFSO.DeleteFile(envStr(address))
  End If
  End If
End Sub

Function envStr(address)
  envStr = WScript.CreateObject("WScript.Shell").ExpandEnvironmentStrings(address)
End Function

Function deleteAsterisk(address)
  If Right(address,3)="*.*" Then
    deleteAsterisk = Left(address,Len(address)-Len("*.*"))
  ElseIf Right(address,1)="*" Then
    deleteAsterisk = Left(address,Len(address)-Len("*"))
  Else
    deleteAsterisk = address
  End If
End Function

■対象フォルダのサブフォルダ以下削除

Dim f, gf, so
Set so = CreateObject("Scripting.FileSystemObject")
Set gf = so.GetFolder("C:\test\1")
For Each f In gf.SubFolders
so.DeleteFolder f, True
Next
Set gf = Nothing
Set so = Nothing

'プログラムファイルの存在するフォルダ内のすべてのサブフォルダを削除する場合は3行目を下記に変更
'Set gf = so.GetFolder(so.GetParentFolderName(WScript.ScriptFullName))
Call deleteSubFolders("C:\test")

Sub deleteSubFolders(address)
  Dim f
  For Each f In CreateObject("Scripting.FileSystemObject").GetFolder( envStr(address) ).SubFolders
    CreateObject("Scripting.FileSystemObject").DeleteFolder f, True
  Next
End Sub

Function envStr(address)
  envStr = WScript.CreateObject("WScript.Shell").ExpandEnvironmentStrings( address )
End Function

■ファイル名・フォルダ名の変更・削除を行う際の備考
 名前変更・削除をするファイル・フォルダがなかった場合はエラーメッセージが出てvbsファイル全体の処理が止まる。(例外だけれど、フォルダの中身全部削除という命令の場合はフォルダの中が空でもエラーなく動く)
 一旦Ifで対象のファイル・フォルダがあるかどうかを調べてTrueなら変更・削除命令を出すようにするとエラーは起きない。

target = "C:\test"
'対象フォルダの有無の確認
If CreateObject("Scripting.FileSystemObject").FolderExists( target ) = True then
'処理 WScript.CreateObject("Scripting.FileSystemObject").DeleteFolder( target ) End If 'もし環境変数を使いたい場合は下記の関数 'target = WScript.CreateObject("WScript.Shell").ExpandEnvironmentStrings("%LOCALAPPDATA%\hoge")

 システムファイルの名前変更・削除は基本エラーでできない。したい場合はvbsに管理者権限を付与する必要がある。

'管理者権限を付与
Option Explicit

Dim WMI, OS, Value, Shell

do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7
    '##### WScript5.7 または Vista 以上かをチェック
    Set WMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
    Set OS = WMI.ExecQuery("SELECT *FROM Win32_OperatingSystem")
    For Each Value in OS
    if left(Value.Version, 3) < 6.0 then exit do
    Next

    '##### 管理者権限で実行
    Set Shell = CreateObject("Shell.Application")
    Shell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ uac", "", "runas"

    WScript.Quit
loop

'##### メイン処理を実行
WScript.Echo "Hello World"

上記ソース引用元

■ファイル・フォルダを開く
 当該ファイル・フォルダがない場合はエラーもなくスルーする。
 もしvbsファイルの文字コードS-JIS以外の場合でパスに空白・漢字・記号があったら文字コードの互換ができてないんできちんと機能しない。

'環境変数未対応
WScript.CreateObject("Shell.Application").Explore "C:\test"
Call openTarget("%APPDATA%")

Sub openTarget(address)
  WScript.CreateObject("Shell.Application").Explore envStr( address )
End Sub

Function envStr(address)
  envStr = WScript.CreateObject("WScript.Shell").ExpandEnvironmentStrings( address )
End Function

コメントアウト

'コメントです
rem コメントです

 基本一行ずつしかコメントアウトできない。
 複数行コメントアウトしたい場合は「If false then~End If」がいいかもしれない。

環境変数を使いたい場合

WScript.CreateObject("WScript.Shell").ExpandEnvironmentStrings("%LOCALAPPDATA%\hoge")

■シャットダウン

CreateObject("WScript.Shell").Run "%WINDIR%\system32\shutdown.exe -s -t 0", 0

■Msgbox内での改行

MsgBox("改行" & vbCr & "しました")

参考サイト