タグ:VBScript ( 58 ) タグの人気記事
[VBScript] フォルダ内のCSVファイルをひとつのExcelファイルにまとめる
どーもボキです。

フォルダ内にあるCSVファイルをひとつのExcelファイルにまとめるスクリプト。
CSVファイルごとにシートを分けるようにしている。

エキサイトブログには.openが記述できなかったので全角で記述した。
全角のOPENを半角へ変えること。

使い方は簡単、CSVファイルを保存したフォルダをVBSファイルにドロップするだけ。
フォルダ名.xlsx(拡張しは、実行PCのExcelバージョンによる)が作成される。

なお、CSVファイル名をそのままシート名にするため、
CSVファイル名が半角 31 文字 or 全角は 15 文字を超えていた場合、エラーとなる。
Set objWS = CreateObject("WScript.Shell")
Set objFS = CreateObject("Scripting.FileSystemObject")

' 引数なし
If WScript.Arguments.Count = 0 Then WScript.Quit

SetScriptHost("CScript") ' ドロップだとWScriptとなるためCScriptで再起動

For i = 0 To WScript.Arguments.Count -1: Do
s = WScript.Arguments.Item(i)

If objFS.FolderExists(s) Then
ProcFolder(s)
End If
Loop Until 1: Next

r = CreateObject("WScript.Shell").PopUp("処理が終了しました。",3,cTitle,64)
'================================================================================'
Function ProcFolder(DPath)
Dim i,r,s,b_init,objFolder,objExcel,xlBook,xlSheet

dprintf(DPath)
Set objExcel = CreateObject("Excel.Application")
objExcel.Application.DisplayAlerts = False ' 警告OFF
'objExcel.Application.Visible = True ' Excel非表示
objExcel.Workbooks.Add ' ブックの新規作成

' フォルダ内のファイル分ループ
b_init = True
Set objFolder = objFS.GetFolder(DPath)
For Each File In objFolder.Files: Do
If InStr(LCase(File.Path), LCase(".csv")) = 0 Then Exit Do ' .csv以外は処理しない

dprintf(vbTab & File.Name)
Set xlBook = objExcel.Workbooks.Open(File.Path) ' ファイルを開く
Set xlSheet = xlBook.Worksheets(1) ' シートを格納

s = objFS.GetFileName(File.Path) ' ファイル名
xlSheet.Name = Left(s, InStrRev(s,".")-1) ' ファイルタイトルをシート名
r = xlSheet.Move(,objExcel.Workbooks(1).Sheets( objExcel.Workbooks(1).Sheets.Count )) ' 最後に追加

If b_init Then
' 新規作成で生成されるSheet1~3を削除(Excelバージョンによる)
While objExcel.Workbooks(1).Sheets.Count > 1
objExcel.WorkBooks(1).Sheets(1).Delete
WEnd
b_init = False
End If

'objExcel.Workbooks(1).WorkSheets(1).Select ' 先頭シートを最前面へ
Loop Until 1: Next

' 解析結果を保存
objExcel.Workbooks(1).SaveAs(objFolder.Path)
objExcel.Quit

Set objExcel = Nothing ' オブジェクト開放 ※これをしないとExcelプロセスが残る
End Function
' -------------------------------------------------------------------------------
' デバッグ ※ここだけ抜粋してもOK
Dim objDbg
' クラス
Class TDebug
Dim FCScript
' 初期化処理
Private Sub Class_Initialize()
FCScript = InStr(LCase(WSCript.FullName), "cscript") > 0
End Sub

' 終了処理
Private Sub Class_Terminate()
If Not FCScript Then Exit Sub

WScript.StdOut.WriteLine WScript.ScriptFullName & " [END]"
WScript.StdIn.ReadLine
End Sub

' デバッグメッセージ処理
Public Sub dprintf(v)
Dim i,s,ityp
If Not FCScript Then Exit Sub

s = v
ityp = VarType(v)
If ityp = vbBoolean Then
s = CStr(v)
ElseIf VarType(v) >= vbArray Then
s = ""
For i = 0 to UBound(v)
s = s & "dprintf(" &i& ")=" & v(i) & vbCRLF
Next
End If
WScript.Echo s
End Sub
End Class
' 関数
Sub dprintf(v)
If VarType(objDbg) = vbEmpty Then Set objDbg = New TDebug
objDbg.dprintf(v)
End Sub
' -------------------------------------------------------------------------------
' 実行ホストを切り替える
Sub SetScriptHost(HostName)
If InStr(LCase(WSCript.FullName), LCase(HostName)) <> 0 Then Exit Sub

s = HostName & " """ & WScript.ScriptFullName & """"
If WScript.Arguments.Count > 0 Then
For i = 0 To WScript.Arguments.Count -1
s = s &" """ & WScript.Arguments.Item(i) & """"
Next
End If
CreateObject("WScript.Shell").Run s
WScript.Quit
End Sub

[PR]
by yozda | 2017-11-23 14:23 | プログラミング | Trackback | Comments(0)
[VBScript] 半角カナを全角へ、全角記号&英数は半角へ変換する関数
どーもボキです。

AdjustStringは
 ・半角カナ → 全角カナ
 ・全角記号 → 半角記号
 ・全角英数 → 半角数字
と変換する関数。

半角カナは、濁点(゛)や半濁点(゜)が別の文字となる、つまり、次の文字まで読まないと文字を確定できない。
そのため、今回はひとつの関数内で変換元の文字管理と変換処理を行った。

全角と半角とで文字の並びが統一されていなかったため、Case文処理が必須だったものの、可能な限り定型処理化した。
a0021757_12555734.gif
SetScriptHost("cscript")

s = "どーもボキです"
dprintf " 前:" & s
dprintf " 後:" & AdjustString(s)
dprintf ""

s = "http://yozda.exblog.jp"
dprintf " 前:" & s
dprintf " 後:" & AdjustString(s)
dprintf ""

s = "2004/05~"
dprintf " 前:" & s
dprintf " 後:" & AdjustString(s)
dprintf ""

' ===============================================================================
' 全角→半角
Function AdjustString(iStr)
Dim i,a1,a0,r,s,s0,s1

i = 1
r = ""
Do While i <= Len(iStr)
a1 = 1
a0 = 0
s0 = ""
s = Mid(iStr, i, 1)
r = s
If ( Asc(s) >= Asc("。") ) And ( Asc(s) <= Asc("゚") ) Then
' 半角カナ → 全角
Select Case s
Case "。" r = "。"
Case "ヲ" r = "ヲ"
Case "ッ" r = "ッ"
Case "ー" r = "ー"
Case Else
If Asc(s) >= Asc("゙") Then
s0="゙": s1="゛": a1=1
ElseIf Asc(s) >= Asc("ワ") Then
s0="ワ": s1="ワ": a1=4
ElseIf Asc(s) >= Asc("ラ") Then
s0="ラ": s1="ラ": a1=1
ElseIf Asc(s) >= Asc("ヤ") Then
s0="ヤ": s1="ヤ": a1=2
ElseIf Asc(s) >= Asc("ム") Then
s0="ム": s1="ム": a1=1
ElseIf Asc(s) >= Asc("マ") Then
s0="マ": s1="マ": a1=1
ElseIf Asc(s) >= Asc("ハ") Then
s0="ハ": s1="ハ": a1=3
If Mid(iStr, i+1, 1) = "゙" Then a0=1
If Mid(iStr, i+1, 1) = "゚" Then a0=2
ElseIf Asc(s) >= Asc("ナ") Then
s0="ナ": s1="ナ": a1=1
ElseIf Asc(s) >= Asc("ツ") Then
s0="ツ": s1="ツ": a1=2
If Mid(iStr, i+1, 1) = "゙" Then a0=1
ElseIf Asc(s) >= Asc("タ") Then
s0="タ": s1="タ": a1=2
If Mid(iStr, i+1, 1) = "゙" Then a0=1
ElseIf Asc(s) >= Asc("カ") Then
s0="カ": s1="カ": a1=2
If Mid(iStr, i+1, 1) = "゙" Then a0=1
ElseIf Asc(s) >= Asc("ア") Then
s0="ア": s1="ア": a1=2
ElseIf Asc(s) >= Asc("ャ") Then
s0="ャ": s1="ャ": a1=2
ElseIf Asc(s) >= Asc("ァ") Then
s0="ァ": s1="ァ": a1=2
ElseIf Asc(s) >= Asc("、") Then
s0="、": s1="、": a1=4
ElseIf Asc(s) >= Asc("「") Then
s0="「": s1="「": a1=1
End If
End Select
ElseIf ( Asc(s) >= Asc(" ") ) And ( Asc(s) <= Asc("z") ) Then
' 全角記号&英数 → 半角
Select Case s
Case " " r=" "
Case "," r=","
Case "." r="."
Case ":" r=":"
Case ";" r=";"
Case "?" r="?"
Case "!" r="!"
Case "^" r="^"
Case "_" r="_"
'Case "ー" r="-" ' 全角文字で利用するため半角変換しない
Case "―" r="-"
Case "‐" r="-"
Case "/" r="/"
Case "\" r="\"
'Case "
" r="~" ' 全角文字で利用するため半角変換しない
Case "
" r="|"
Case "
" r="'"
Case "”" r=""""
Case "(" r="("
Case ")" r=")"
Case "[" r="["
Case "]" r="]"
Case "{" r="{"
Case "}" r="}"
'Case "「" r="「" ' 全角文字で利用するため半角変換しない
'Case "」" r="」" ' 全角文字で利用するため半角変換しない
Case "+" r="+"
Case "-" r="-"
Case "=" r="="
Case "<" r="<"
Case ">" r=">"
Case "′" r="'"
Case "″" r=""""
Case "¥" r="\"
Case "
" r="$"
Case "
" r="%"
Case "
" r="#"
Case "
" r="&"
Case "
" r="*"
Case "
" r="@"
Case Else
If Asc(s) >= Asc("
") Then
s0="
": s1="a"
ElseIf Asc(s) >= Asc("
") Then
s0="
": s1="A"
ElseIf Asc(s) >= Asc("
") Then
s0="
": s1="0"
End If
End Select
End If
If s0 <> "
" Then r=Chr( (Asc(s) -Asc(s0))*a1 +Asc(s1) +a0) ' 変換処理
AdjustString = AdjustString & r

i = i +1 +Abs(CInt(a0 > 0))
Loop
End Function
' ===============================================================================
' 実行ホストを切り替える
Sub SetScriptHost(HostName)
Dim i,s

If InStr(LCase(WSCript.FullName), LCase(HostName)) <> 0 Then Exit Sub

s = HostName & "
""" & WScript.ScriptFullName & """"
If WScript.Arguments.Count > 0 Then
For i = 0 To WScript.Arguments.Count -1
s = s &"
""" & WScript.Arguments.Item(i) & """" ' 引数
Next
End If
CreateObject("
WScript.Shell").Run s
WScript.Quit
End Sub
' -------------------------------------------------------------------------------
' デバッグ
Dim objDbg
' クラス
Class TDebug
Dim FCScript

' 初期化処理
Private Sub Class_Initialize()
FCScript = InStr(LCase(WSCript.FullName), "
cscript") > 0
End Sub

' 終了処理
Private Sub Class_Terminate()
If Not FCScript Then Exit Sub

WScript.StdOut.WriteLine NOW & "
[END]"
WScript.StdIn.ReadLine
End Sub

' CScriptホストかどうか
Public Property Get CScript
CScript = FCScript
End Property

' デバッグメッセージ処理
Public Sub dprintf(v)
Dim i,s,ityp
If Not FCScript Then Exit Sub

s = v
ityp = VarType(v)
If ityp = vbBoolean Then
s = CStr(v)
ElseIf VarType(v) >= vbArray Then
s = "
"
For i = 0 to UBound(v)
s = s & "
dprintf(" &i& ")=" & v(i) & vbCRLF
Next
End If
WScript.Echo s
End Sub
End Class
' 関数
Sub dprintf(v)
If VarType(objDbg) = vbEmpty Then
Set objDbg = New TDebug
objDbg.dprintf(NOW & "
" & WScript.ScriptFullName)
End If
objDbg.dprintf(v)
End Sub
' -------------------------------------------------------------------------------
[VBScript] 全角文字を半角文字へ変換する

[PR]
by yozda | 2017-08-18 20:40 | プログラミング | Trackback | Comments(0)
[VBScript] 全角英数&記号を半角へ変換する
どーもボキです。

定型業務のツール支援するにも、文字バイトが統一されていないとそれすらままならない。

というか、たいていの人は文字バイトなど意識しない。
本当にわからないのだろう、言っても直らない。ツール側で吸収したほうが早い。

以下のZenToHan関数で文字サイズを半角に統一するとよい。
a0021757_09255103.png
ZenToHan関数での変換事例

SetScriptHost("cscript")

s = "yozda ( … > Z_ ̄∂ "
dprintf " 前:" & s
dprintf " 後:" & ZenToHan(s)

' ===============================================================================
' 全角→半角
Function ZenToHan(iStr)
Dim i,r

r = ""
For i = 1 To Len(iStr)
r = r & ZenToHan_func(Mid(iStr, i, 1))
Next
ZenToHan = r
end function
' 関数
Function ZenToHan_func(iStr)
Dim r
r = iStr
ZenToHan_func = r
If Asc(r) < Asc(" ") Then Exit Function
If Asc(r) > Asc("z") Then Exit Function

Select Case r
Case " " r = " "
Case "," r = ","
Case "." r = "."
Case ":" r = ":"
Case ";" r = ";"
Case "?" r = "?"
Case "!" r = "!"
Case "^" r = "^"
Case "_" r = "_"
Case "ー" r = "-"
Case "―" r = "-"
Case "‐" r = "-"
Case "/" r = "/"
Case "~" r = "~"
Case "|" r = "|"
Case "’" r = "'"
Case "”" r = """"
Case "(" r = "("
Case ")" r = ")"
Case "[" r = "["
Case "]" r = "]"
Case "{" r = "{"
Case "}" r = "}"
Case "+" r = "+"
Case "-" r = "-"
Case "=" r = "="
Case "<" r = "<"
Case ">" r = ">"
Case "′" r = "'"
Case "″" r = """"
Case "¥" r = "\"
Case "
" r = "$"
Case "
" r = "%"
Case "
" r = "#"
Case "
" r = "&"
Case "
" r = "*"
Case "
" r = "@"
Case Else
If Asc(r) >= Asc("
") Then
r = Chr(Asc(r) -Asc("
") +Asc("a"))
ElseIf Asc(r) >= Asc("
") Then
r = Chr(Asc(r) -Asc("
") +Asc("A"))
ElseIf Asc(r) >= Asc("
") Then
r = Chr(Asc(r) -Asc("
") +Asc("0"))
End If
End Select
ZenToHan_func = r
End Function
' ===============================================================================
' 実行ホストを切り替える
Sub SetScriptHost(HostName)
Dim i,s

If InStr(LCase(WSCript.FullName), LCase(HostName)) <> 0 Then Exit Sub

s = HostName & "
""" & WScript.ScriptFullName & """"
If WScript.Arguments.Count > 0 Then
For i = 0 To WScript.Arguments.Count -1
s = s &"
""" & WScript.Arguments.Item(i) & """" ' 引数
Next
End If
CreateObject("
WScript.Shell").Run s
WScript.Quit
End Sub
' -------------------------------------------------------------------------------
' デバッグ ※ここだけ抜粋してもOK
Dim objDbg
' クラス
Class TDebug
Dim FCScript

' 初期化処理
Private Sub Class_Initialize()
FCScript = InStr(LCase(WSCript.FullName), "
cscript") > 0
End Sub

' 終了処理
Private Sub Class_Terminate()
If Not FCScript Then Exit Sub

WScript.StdOut.WriteLine NOW & "
[END]"
WScript.StdIn.ReadLine
End Sub

' CScriptホストかどうか
Public Property Get CScript
CScript = FCScript
End Property

' デバッグメッセージ処理
Public Sub dprintf(v)
Dim i,s,ityp
If Not FCScript Then Exit Sub

s = v
ityp = VarType(v)
If ityp = vbBoolean Then
s = CStr(v)
ElseIf VarType(v) >= vbArray Then
s = "
"
For i = 0 to UBound(v)
s = s & "
dprintf(" &i& ")=" & v(i) & vbCRLF
Next
End If
WScript.Echo s
End Sub
End Class
' 関数
Sub dprintf(v)
If VarType(objDbg) = vbEmpty Then
Set objDbg = New TDebug
objDbg.dprintf(NOW & "
" & WScript.ScriptFullName)
End If
objDbg.dprintf(v)
End Sub



[PR]
by yozda | 2017-08-16 22:11 | プログラミング | Trackback | Comments(0)
[VBScript] Leeyesを自動ページめくりに対応させる。
どーもボキです。

Leeyes(見開き画像ビューア)は自動ページめくりに対応していない。
ページめくり操作は、矢印キーで指示できるので、VBScriptでボタン押下を再現してやればいい。

対応しているアプリもあるかもしれないが、調べてはいない。
SetScriptHost("CScript")    ' CScriptで実行

sec=3 ' sec

Set objWS = WScript.CreateObject("WScript.Shell")
cnt=0
While True
cnt = cnt +1
WScript.Sleep sec*1000 ' msec指定
objWS.SendKeys "{DOWN}" ' 保存するボタンを押下
WScript.StdOut.WriteLine cnt*sec
Wend
' -------------------------------------------------------------------------------
' 実行ホストを切り替える
Sub SetScriptHost(HostName)
If InStr(LCase(WSCript.FullName),LCase(HostName)) <> 0 Then Exit Sub

s = HostName & " """ & WScript.ScriptFullName & """"
If WScript.Arguments.Count > 0 Then
For i = 0 To WScript.Arguments.Count -1
s = s &" """ & WScript.Arguments.Item(i) & """"
Next
End If
CreateObject("WScript.Shell").Run s
WScript.Quit
End Sub

[VBScript] ブラウザでのダウンロードダイアログ操作を自動化する。
[PR]
by yozda | 2017-04-09 11:53 | プログラミング | Trackback | Comments(0)
[VBScript] ブラウザでのダウンロードダイアログ操作を自動化する。
こんにチワワ。どーもボキです。

a0021757_1545294.png
Firefoxでは、ZIPファイルなどのリンクをクリックすると、
「***を開く」というタイトルのダイアログが表示されるため、ダウンロードはユーザ操作が必要。
(IEでは、「ファイルのダウンロード」。Chromeではダイアログが表示されることなくダウンロードが始まる)

そのユーザ操作を自動化するスクリプト。
1.「***を開く」というタイトルのウィンドウがある場合は、それを最前面に移動する。
2.Alt+Sで、「ファイルを保存する」を選択する。
3.Enterで、ダイアログを閉じる。

実行状態がわかるように、CScriptで実行させている。
実行ホストの切り替えには、[VBScript] 引数を引き継いだ上で、指定したホストで実行するを使った
SetScriptHost("CScript")    ' CScriptで実行

Set objWS = WScript.CreateObject("WScript.Shell")
While True
If objWS.AppActivate("を開く") Then
WScript.StdOut.WriteLine "実行"
WScript.Sleep 500
objWS.SendKeys "%(S)" ' 保存するボタンにフォーカス
WScript.Sleep 500
objWS.SendKeys "{ENTER}" ' 保存するボタンを押下
End If
WScript.Sleep 1000
Wend
' -------------------------------------------------------------------------------
' 実行ホストを切り替える
Sub SetScriptHost(HostName)
If InStr(LCase(WSCript.FullName),LCase(HostName)) <> 0 Then Exit Sub

s = HostName & " """ & WScript.ScriptFullName & """"
If WScript.Arguments.Count > 0 Then
For i = 0 To WScript.Arguments.Count -1
s = s &" """ & WScript.Arguments.Item(i) & """"
Next
End If
CreateObject("WScript.Shell").Run s
WScript.Quit
End Sub



[PR]
by yozda | 2016-06-25 15:46 | プログラミング | Trackback(1) | Comments(0)
[VBScript] 管理者昇格してスクリプトを実行する 【改良版】
こんにちわわ。どーもボキです。

ExecRunas関数内でWScript.Quitすれば、前回バージョンのような判定処理は不要になるね。

実行部
' 管理者権限でVBSを実行する
ExecRunas

' ~管理者権限で実行したいソース~


実装部
'--------------------------------------------------------------------------------------------------------
'OSのバージョンを取得する
Const osWinNT = 4.0
Const osWin2k = 5.0
Const osWinXP = 5.1
Const osVista = 6.0
Const osWin7 = 6.1
Const osWin8 = 6.2
Function GetOSVersion
Dim objWMI, osInfo, os

Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set osInfo = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")
For Each os in osInfo
GetOSVersion = CDbl(Left(os.Version, 3))
Next
End Function
'--------------------------------------------------------------------------------------------------------
' 管理者に昇格して実行する
Function ExecRunas
Const cKey = "/ExecRunas"
Dim s

' ExecRunas実行チェック'
If WScript.Arguments.Count > 0 Then
If WScript.Arguments.item(0) = cKey Then Exit Function
End If

' OSバージョンチェック'
If GetOSVersion < osVista Then Exit Function

' 引数を生成'
s = ""
For i = 0 To WScript.Arguments.Count -1
s = s & " """ & WScript.Arguments.item(i) & """"
Next

' Runas実行'
CreateObject("Shell.Application").ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """" & " " &cKey& " " & s, "", "runas", 1

' VBS実行を終了'
WScript.Quit
End Function
'--------------------------------------------------------------------------------------------------------

[VBScript] 管理者昇格してスクリプトを実行する
[PR]
by yozda | 2015-12-20 15:37 | プログラミング | Trackback | Comments(0)
[VBScript] 更新日時を元にファイルをリネームする
こんばんワイン。どーもボキです。

iPhoneに限った話ではないが、デバイスの保存画像ファイルをすべて吸い上げると、
ファイル名がリセットされ、また同じ名前でファイルが作られる。

同じ名前のファイルが存在する場合、同じフォルダに保存できず不便なため、
ファイルの更新日時情報からファイル名を変更するスクリプトを作成した。

使い方は、以下の実行プログラムをメモ帳にペーストし、vbsファイルとして保存、実行するだけ。
図のようにフォルダ選択ダイアログが表示される。

なお、VBSファイルへのフォルダ/ファイルドロップでも処理可能。
a0021757_13225160.gif
実行プログラム
'==============================================================================='
Set objWS = CreateObject("WScript.Shell")
Set objFS = CreateObject("Scripting.FileSystemObject")

If WScript.Arguments.Count = 0 Then
If Not SelectDirectory("処理するフォルダを選択",0,dpth) Then WSCript.Quit

objWS.Run "CScript """ & WScript.ScriptFullName & """ """ & dpth & """"
WScript.Quit ' 引数を渡し再起動
Else
SetScriptHost("CScript") ' ドロップだとWScriptとなるためCScriptで再起動

For i = 0 To WScript.Arguments.Count -1: Do
s = WScript.Arguments.Item(i)

If objFS.FileExists(s) Then
ProcFile(s)
Else
SearchFile(s)
End If
Loop Until 1: Next
End If

r = objWS.PopUp("処理が終了しました。",3,"終了メッセージ",64)
'================================================================================

' -------------------------------------------------------------------------------
' フォルダ内のファイル検索
Sub SearchFile(DPath)
Set Folder = objFS.GetFolder(DPath)

' フォルダ内のフォルダ
For Each SubFolder In Folder.SubFolders: Do
SearchFile(SubFolder.Path)
Loop Until 1: Next

' フォルダ内のファイル
For Each File In Folder.Files: Do
ProcFile(File.Path)
Loop Until 1: Next
End Sub
' -------------------------------------------------------------------------------'
' ファイル処理本体
Function ProcFile(FPath)
Dim i,s,ttl,ext,dpth,dnam,fnam0,fnam,fpth
ProcFile = False
'If LCase(Right(FPath, Len(FPath) -InStrRev(FPath,"."))) <> "csv" Then Exit Function

dpth = objFS.GetParentFolderName(FPath) &"\"
'dnam = objFS.GetFileName(objFS.GetParentFolderName(FPath))
fnam0 = objFS.GetFileName(FPath)

s = objFS.GetFile(FPath).DateLastModified
'If Len(s)=18 Then s = Replace(s, "
", " 0") ' h→hh
ttl = Mid(s,3,2) & Mid(s,6,2) & Mid(s,9,2) ' yymmdd
ext = Right(FPath, Len(FPath) -InStrRev(FPath,"
.") +1) ' 拡張子

fnam = ttl & ext
fpth = dpth & fnam
If objFS.FileExists(fpth) Then
i = 1
fnam = ttl &"
_"& IntToStr0(i,1) & ext
fpth = dpth & fnam
While objFS.FileExists(fpth)
i = i+1
fnam = ttl &"
_"& IntToStr0(i,1) & ext
fpth = dpth & fnam
Wend
End If
dprintf(fnam0 &"
"& fnam)
objFS.GetFile(FPath).Name = fnam

ProcFile = True
End Function
' -------------------------------------------------------------------------------
' 実行ホストを切り替える
Sub SetScriptHost(HostName)
If InStr(LCase(WSCript.FullName), LCase(HostName)) <> 0 Then Exit Sub

s = HostName & "
""" & WScript.ScriptFullName & """"
If WScript.Arguments.Count > 0 Then
For i = 0 To WScript.Arguments.Count -1
s = s &"
""" & WScript.Arguments.Item(i) & """"
Next
End If
CreateObject("
WScript.Shell").Run s
WScript.Quit
End Sub
'-------------------------------------------------------------------------------
' フォルダ選択ダイアログ
Function SelectDirectory(sCaption, sInitDir, sSelectDir)
Dim objFS,objSA,dpth

SelectDirectory = False
Set objFS = CreateObject("
Scripting.FileSystemObject")
Set objSA = CreateObject("
Shell.Application")

Set objFolder = objSA.BrowseForFolder(0, sCaption, 0, sInitDir)
If objFolder Is Nothing Then Exit Function ' キャンセル

If objFolder.Items.Item Is Nothing Then
dpth = CreateObject("
WScript.Shell").SpecialFolders("Desktop") &"\" ' デスクトップ
Else
dpth = objFolder.Items.Item.Path &"
\"
End If
If Not objFS.FolderExists(dpth) Then Exit Function '指定異常 (ゴミ箱とか)

sSelectDir = dpth
SelectDirectory = True
End Function
'-------------------------------------------------------------------------------
' 0付き文字に変換
Function IntToStr0(Value, Digits)
Dim i,cnt,s

s = CStr(Value)
cnt = Digits - Len(s)
For i = 0 To cnt
s = "
0" & s
Next
IntToStr0 = s
End Function
' -------------------------------------------------------------------------------
' デバッグ ※ここだけ抜粋してもOK
Dim objDbg
' クラス'
Class TDebug
Dim FCScript

' 初期化処理
Private Sub Class_Initialize()
FCScript = InStr(LCase(WSCript.FullName), "
cscript") > 0
End Sub

' 終了処理
Private Sub Class_Terminate()
If Not FCScript Then Exit Sub

WScript.StdOut.WriteLine NOW & "
[END]"
WScript.StdIn.ReadLine
End Sub

' CScriptホストかどうか
Public Property Get CScript
CScript = FCScript
End Property

' デバッグメッセージ処理
Public Sub dprintf(v)
Dim i,s,ityp
If Not FCScript Then Exit Sub

s = v
ityp = VarType(v)
If ityp = vbBoolean Then
s = CStr(v)
ElseIf VarType(v) >= vbArray Then
s = "
"
For i = 0 to UBound(v)
s = s & "
dprintf(" &i& ")=" & v(i) & vbCRLF
Next
End If
WScript.Echo s
End Sub
End Class
' 関数
Sub dprintf(v)
If VarType(objDbg) = vbEmpty Then
Set objDbg = New TDebug
objDbg.dprintf(NOW & "
" & WScript.ScriptFullName)
End If
objDbg.dprintf(v)
End Sub
' -------------------------------------------------------------------------------



[PR]
by yozda | 2014-12-13 17:46 | プログラミング | Trackback | Comments(0)
[VBScript] 指定時間経過後にPCをスタンバイにする
こんばんワイン。どーもボキです。

PCをスタンバイにするで紹介したもの使った。
Excel未インストールの場合には、SendKeyを利用するようにしている。

何かしらの処理(○○な動画ダウンロード・変換など)で一定時間後にPCを切りたいときなどに利用できそう。
a0021757_23433621.gif
s = InputBox("hh:mm形式","指定時間後にスタンバイ","00:10")
If s = "" Then WScript.Quit

t = CDate(s) + Time
While CDate(t) > Time
WScript.Sleep(10000)
Wend

Set objWS = CreateObject("WScript.Shell")
r = objWS.PopUp("スタンバイにします。",3,"確認",vbOKCancel)
If r = vbCancel then WScript.Quit

On Error Resume Next ' Excel未インストール対応
Set objExcel = CreateObject("Excel.Application")
On Error GoTo 0
If Not (objExcel Is Nothing) Then
' Excelあり
cmd = "CALL(""powrprof.dll"",""SetSuspendState"",""JJJJ"",0,0,0)" '1,0,0とすると休止
objExcel.ExecuteExcel4Macro(cmd)
objExcel.Quit ' Quitしないとプロセスが残るため
Else
' Excelなし ⇒ タスクマネージャーを起動
objWS.SendKeys "^+{esc}" ' タスクマネージャー起動
Do While Not objWS.AppActivate("Windows タスク マネージャ")
WScript.Sleep 250 ' タスクマネージャー起動待ち
Loop
WScript.Sleep 1000

' ショートカットキーを送信
objWS.SendKeys "%ub%fx" ' スタンバイ
'objWS.SendKeys "%uh%fx" ' 休止状態
'objWS.SendKeys "%uu%fx" ' シャットダウン
'objWS.SendKeys "%ur%fx" ' 再始動
'objWS.SendKeys "%ul%fx" ' ログオフ
End If

[VBScript] Craving Explorerの動画変換の終了後、PCをスタンバイにする

[PR]
by yozda | 2014-11-22 23:46 | プログラミング | Trackback | Comments(0)
[VBScript] デバッグ上手はプログラム上手6 ~まとめ改~
こんにチワワ。どーもボキです。

以下と組み合わせれば、実行時にホストを変更でき、デバッグが楽になる。
引数を引き継いだ上で、指定したホストで実行する

前回はデバッグクラスを自分で生成するようにしていたが、
今回の記事では、最初にdprintf()を実行したタイミングで自動生成するよう改良した。

配布時は、SetScriptHostのみコメントアウトすればよい。
デフォルトであるWScriptホストでは、デバッグメッセージが表示されないようにしているので。

プログラムとその実装例
SetScriptHost("CScript")
dprintf("デバッグモード")

' ↑上記にスクリプト本体を記載する
' ===============================================================================
' デバッグ
Dim objDbg
' クラス
Class TDebug
Dim FCScript

' 初期化処理
Private Sub Class_Initialize()
FCScript = InStr(LCase(WSCript.FullName), "cscript") > 0
End Sub

' 終了処理
Private Sub Class_Terminate()
If Not FCScript Then Exit Sub

WScript.StdOut.WriteLine NOW & " [END]"
WScript.StdIn.ReadLine
End Sub

' CScriptホストかどうか
Public Property Get CScript
CScript = FCScript
End Property

' デバッグメッセージ処理
Public Sub dprintf(v)
Dim i,s,ityp
If Not FCScript Then Exit Sub

s = v
ityp = VarType(v)
If ityp = vbBoolean Then
s = CStr(v)
ElseIf VarType(v) >= vbArray Then
s = ""
For i = 0 to UBound(v)
s = s & "dprintf(" &i& ")=" & v(i) & vbCRLF
Next
End If
WScript.Echo s
End Sub
End Class
' 関数
Sub dprintf(v)
If VarType(objDbg) = vbEmpty Then
Set objDbg = New TDebug
objDbg.dprintf(NOW & " " & WScript.ScriptFullName)
End If
objDbg.dprintf(v)
End Sub
' -------------------------------------------------------------------------------
' 実行ホストを切り替える
Sub SetScriptHost(HostName)
If InStr(LCase(WSCript.FullName), LCase(HostName)) <> 0 Then Exit Sub

s = HostName & " """ & WScript.ScriptFullName & """"
If WScript.Arguments.Count > 0 Then
For i = 0 To WScript.Arguments.Count -1
s = s &" """ & WScript.Arguments.Item(i) & """" ' 引数
Next
End If
objWS.Run s
WScript.Quit
End Sub
' -------------------------------------------------------------------------------
[VBScript] デバッグ上手はプログラム上手5 ~まとめ~

[PR]
by yozda | 2014-08-24 14:48 | プログラミング | Trackback | Comments(0)
[VBScript] 管理者昇格してスクリプトを実行する
こんばんワイン。どーもボキです。

Win7以降(Vista以降?)、管理者でのログインといえど、
プログラムが管理者権限で実行されるわけではない。これはスクリプトも同じ。

管理者権限で実行するならば、右クリック > 管理者として実行する。
これをしなければ、スクリプトでレジストリの書き換えすら出来ない。

PBPには、ボタン押す以外は困難を極めるため、こういった高度な操作は期待できない。

なので、スクリプト内でOSを判定させ、Win7以降の場合は、
勝手に管理者に昇格して、スクリプトを実行しなおす仕組みを用意した。

なお、Win7以前は管理者ログインで実行されたプロセスは管理者権限で動作するため、
OSバージョンがWin7以前の場合は、何もしないようにしている。

実行部
' 管理者権限でVBSを実行する
If ExecRunas Then WScript.Quit

' ~管理者権限で実行したいソース~


実装部
'--------------------------------------------------------------------------------------------------------
'OSのバージョンを取得する
Const osWinNT = 4.0
Const osWin2k = 5.0
Const osWinXP = 5.1
Const osWin7 = 6.1
Const osWin8 = 6.2
Function GetOSVersion
Dim objWMI, osInfo, os

Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set osInfo = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")
For Each os in osInfo
GetOSVersion = CDbl(Left(os.Version, 3))
Next
End Function
'--------------------------------------------------------------------------------------------------------
' 管理者に昇格して実行する
Function ExecRunas
Const cKey = "/ExecRunas"
Dim s

ExecRunas = False

' OS情報を取得'
If GetOSVersion < osWin7 Then Exit Function

' 引数の処理'
s = ""
If WScript.Arguments.Count > 0 Then
If WScript.Arguments.item(0) = cKey Then Exit Function ' 実行済み'

For i = 0 To WScript.Arguments.Count -1
s = s & " """ & WScript.Arguments.item(i) & """"
Next
End If

' Runas実行'
CreateObject("Shell.Application").ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """" & " " &cKey& " " & s, "", "runas", 1

ExecRunas = True
End Function
'--------------------------------------------------------------------------------------------------------



[PR]
by yozda | 2014-04-29 23:59 | プログラミング | Trackback(1) | Comments(0)