2009/04/11

VBScriptで鯖管理 そにょ2b・・・


   2009/03/13 - VBScriptで鯖管理 そにょ2・・・    
の、スタートアップ/ログオン/ログオフ/シャットダウン 向けのスクリプトを更新。

   sScriptor.zip    
▲ を、右クリックしてファイルとして保存してください。

以前の版では、実行するアプリケーションに対するコマンドラインパラメータを
条件なくダブルクォーテーションで囲んで処理していた・・・

以前のiniファイル記述例)
    ;{アプリケーションフルパス};{Parameter};{CallType DDE or pnWq or 省略};WindowType 0 or 1;{mSec(Interval) or True or False};[Title(Memo)]      
C:\Applications\System Tools\ProcessorManegements\CrystalCPUID\CrystalCPUID.exe;/F22 /P1 /E;;1;4000;[CrystalCPUID]
C:\Windows\System32\Notepad.exe;TestText 0000.txt;;1;4000;[Test - Notepad]
C:\WINDOWS\system32\rundll32.exe;shell32.dll,Control_RunDLL desk.cpl,,3;DDE;1;2500;[MonitorProperty DDE]
・・・ので、この指定でも動作していた。
一見問題がないように見えたのだが、この影響で正常動作しないモノがあった・・・(^_^;

そこで、コマンドラインパラメータ(iniファイル中の第2引数)をダブルクォーテーション(Wq)で囲まないコトを既定にし
敢えてインラインパラメータをWqで囲みたい場合は、


そこで、敢えてインラインパラメータをWqで囲まない場合は、CallType引数(iniファイル中の第3引数)に、
pnWq と記述するコトにより、任意で設定が可能なよう変更。

また、インターバルmSecパラメータ(iniファイル中の第5引数)に True と記述するコトで、
その処理の終了まで待機できるようにした。

新たなiniファイル記述例)
    ;{アプリケーションフルパス};{Parameter};{CallType DDE or pnWq or 省略};WindowType 0 or 1;{mSec(Interval) or True or False};[Title(Memo)]      
C:\Applications\System Tools\ProcessorManegements\CrystalCPUID\CrystalCPUID.exe;/F22 /P1 /E;pnWq;1;True;[CrystalCPUID]
但し、確実に単独で動作が完結する処理以外で、この指定は行わないでください。
特に、スタートアップスクリプトとして利用する場合、Windowsがスタートアップで停止していまい、
起動しなくなる可能性があります。
(既定であれば、Windowsのスタートアップスクリプトのタイムアップ設定により回避される)

アーカイブ内のサンプルini
    ;{アプリケーションフルパス};{Parameter};{CallType DDE or pnWq or 省略};WindowType 0 or 1;{mSec(Interval) or True or False};[Title(Memo)]      
;←行頭にセミコロンで非実行
C:\Windows\System32\Notepad.exe;TestText 0000.txt;;1;4000;[Test - Notepad 3SecWait]
C:\WINDOWS\system32\taskmgr.exe;;;1;2000;[TaskManeger 2SecWait]
C:\WINDOWS\system32\rundll32.exe;shell32.dll,Control_RunDLL desk.cpl,,3;DDE;1;5000;[MonitorProperty DDE]
C:\Master\! Creates\Scripts\! TestTargetFolder\TestPopUp.vbs;sScriptor Test1;;1;True;[Test1 ExitWait]
C:\Master\! Creates\Scripts\! TestTargetFolder\TestPopUp.vbs;sScriptor Test2;;1;3000;[Test2 3SecWait]
TestPopUp.vbs;sScriptor Tested;;1;;[Test]

アーカイブ内の.vbsファイルソース
    '***** ↓↓↓ScriptTitle↓↓↓ *********************************************************     
' Startup/ShoutdownScripting with out TestMode
'- Created by LazwardFox -

' Update 20090411 2140 コマンドラインパラメータ(第2引数)をダブルクォーテーション(Wq)で囲むコトを既定に戻し、
' 代替として、CallType引数に pnWq を記述して、パラメータをWqで囲まず利用可能に。
' Update 20090411 1711 iniファイル内、インターバルパラメータ(第5引数)に True を記述で、処理終了待機
' コマンドラインパラメータ(第2引数)をダブルクォーテーション(Wq)で囲まないコトを既定に変更
' 代替として、CallType引数に pWq を記述して、パラメータをWqで囲むことができます。
' Update 20090313 1709 パラメータ省略によるエラー処理を訂正
' Update 20090311 1634 inArray を inArrays に差し替え、必須の lArray を追加
' iniLoaderを合せて修正
' Update 20090226 1908 テストルーチン排除
' Update 20090226 1202 DDE式の記述にフラグで対応へ変更
' Update 20090226 1025 DDE式の記述に、通常呼び出しを""で囲んで対応
' Update 20090226 0630 テストモード追加
' Update 20090226 0605 ウィンドウタイプの指定と、インターバルタイム設定可能に。
' Release 20090226 0451
' Update 20090226 0346 iniファイル仕様に変更
' DevStart 20090226 0235 単純動作のみ機能

'***** ↓↓↓ ObjectDecralations ↓↓↓ *************************************************
Dim My, Shell, Fs
Set My = WScript
With My
Set Shell = .CreateObject("WScript.Shell")
Set Fs = .CreateObject("Scripting.FileSystemObject") 'ファイル制御
End With

'***** ↓↓↓Decralations↓↓↓ *********************************************************
Dim sTitle, artargets, iExe, sWq, rTarget, wType, sSec
Const vbWq = """"
sTitle = Fs.GetBaseName(My.ScriptName)

'***** ↓↓↓MainRoutine↓↓↓ *********************************************************
arTargets = arIni(";")
If IsEmpty(arTargets) Then
Else
For Each iExe In arTargets
If IsEmpty(iExe(0)) or iExe(0) = "" Then
ElseIf iExe(0) = "" Then
ElseIf Fs.FileExists(iExe(0)) Then
sWq = vbWq
pWq = vbWq
If IsEmpty(iExe(2)) or iExe(2) = "" Then
ElseIf Ucase(Cstr(iExe(2))) = "DDE" Then
sWq = ""
pWq = ""
ElseIf Ucase(Cstr(iExe(2))) = "PNWQ" Then
pWq = ""
End If
rName = vbWq & Fs.GetBaseName(iExe(0)) & vbWq
rTarget = sWq & Cstr(iExe(0)) & sWq
If IsEmpty(iExe(1)) or iExe(1) = "" then
Else
rTarget = rTarget & " " & pWq & Cstr(iExe(1)) & pWq
End If
If IsEmpty(iExe(3)) or iExe(3) = "" Then
ElseIf IsNumeric(iExe(3)) Then
wType = Cint(iExe(3))
Else
wType = 0
End If
If IsEmpty(iExe(4)) or iExe(4) = "" Then
ElseIf IsNumeric(iExe(4)) Then
sSec = Cint(iExe(4))
eWait = False
Else
sSec = 0
eWait = iExe(4)
End If
Shell.Run rTarget, wType, eWait
If sSec > 0 Then
My.Sleep sSec
End If
End If
Next
End If
Set Fs = Nothing
Set Shell = Nothing
My.Quit

'***** ↓↓↓Functions↓↓↓ *********************************************************
'------------------------------------
'arIni - スクリプトと同名のiniファイルがあれば、内容を配列で取得
'- Created by LazwardFox -

' Update 20090226 0330
' Update 20090223 0550 変則的フォルダ名回避のため修正
' Release 20090223 0509

Public Function arIni(lS)
Dim sNFull, rFolder, sN, iniFile
sNFull = Wscript.ScriptFullName
rFolder = Fs.GetParentFolderName(sNFull)
sN = Fs.GetBaseName(sNFull)
iniFile = Fs.BuildPath(rFolder,sN & ".ini")
If Fs.FileExists(iniFile) Then
arINI = iniLoader(iniFile,lS,0)
End If
End Function

'------------------------------------
'iniLoader - 対象をiniファイルより取得、既存iniファイルのみ指定可。
'- Created by LazwardFox -

' Update 20090311 1650 inArraysに合せて修正
' Update 20090226 1025 DDE式の記述に対応
' Update 20090226 0855 データ内にコンマを利用可能に
' Update 20090226 0356 多重配列向けに修正
' Update 20090223 0550 戻り値可変 [ 0 - 配列 ] [ 1 - lSplitterで指定した区切り文字で連結された文字列 ]
' Release 20090223 0509

Public Function iniLoader(iniFile, lSplitter, Control)
Dim nS
nS = Fs.GetFile(iniFile).size
If nS = 0 Then
iniLoader = Array(Fs.GetParentFolderName(iniFile))
Else
If IsEmpty(lSplitter) Then
lSplitter = ","
End If
Dim iFile, lResult, strResults, rL, iniLoaded
Set iFile = Fs.OpenTextFile(iniFile,1) 'iniファイルを読み取りモードで開く
WScript.Sleep 150
Do Until iFile.AtEndOfStream '読み込み
rL = iFile.ReadLine
lResult = lResult & "**" & rL & "**"
Loop
WScript.Sleep 150
iFile.Close 'Iniファイルを閉じる
strResults = Replace(Replace(lResult,"****","*"),"**","")
If Control = 0 Then
inArrays strResults, "*" & lSplitter, iniLoader
Else
iniLoader = Replace(strResults,"*",lSplitter)
End If
End If
End Function

'------------------------------------
'inArrays - 多次元配列構築
'- Created by LazwardFox -

'配列 及び 文字列から、区切り文字を指定して多重配列を作成し返す。

' Update 20090228 1248 strLimitters指定に、区切り文字 ~(チルダ)不要に。
' Update 20090228 0833 配列のほか、文字列もソースに適用可能に。
' Update 20090223 0917

'inArrays(
' tSources - 区切り文字を含む文字列 ないし、それらで構成された配列
' ,strLimitters - 区切り文字を順番に並べた文字列を指定
' ,arReturn - 戻り値が代入されます。
' )

Function inArrays(tSources, strLimitters, arReturn)
Dim arSources, arLimitters, iLimitter, arInArrays, iSource, Pc
arSources = tSources
lArray strLimitters, arLimitters '< Update 20090228 1248
For Each iLimitter In arLimitters
If VarType(arSources) = 8 Then
arInArrays = Split(arSources,iLimitter)
Else
Pc = 0
ReDim arInArrays(0)
For Each iSource in arSources
ReDim Preserve arInArrays(Pc)
arInArrays(Pc) = Split(iSource,iLimitter)
Pc = Pc + 1
Next
End If
arSources = arInArrays
arInArrays = Null
Next
arReturn = arSources
End Function

'------------------------------------
'文字列を1文字ずつバラし、配列として返す
'- Created by LazwardFox -

' Release 20090228 1246

' lArray(
' strLetters - 分解したい文字列
' ,rArray - 戻り値が代入されます。任意の変数名を指定
' )

Function lArray(strLetters, rArray)
Dim Pc, rLetters()
Set objADO = CreateObject("ADODB.Stream")
With objADO
.Type = 2
.Open
.WriteText strLetters
Pc = 0
.Position = 0
Do Until .EOS
ReDim Preserve rLetters(Pc)
rLetters(Pc) = .ReadText(1)
Pc = Pc + 1
Loop
End With
rArray = rLetters
objADO.Close
Set objADO = Nothing
End Function


いい加減、共通関数を.wsf(ライブラリ)化しようかな・・・
<そのまま使えるVBscript 鯖管理 起動順序 スタートアップ>