の、スタートアップ/ログオン/ログオフ/シャットダウン 向けのスクリプトを更新。
▲ を、右クリックしてファイルとして保存してください。
以前の版では、実行するアプリケーションに対するコマンドラインパラメータを
条件なくダブルクォーテーションで囲んで処理していた・・・
以前のiniファイル記述例)
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ファイル記述例)
C:\Applications\System Tools\ProcessorManegements\CrystalCPUID\CrystalCPUID.exe;/F22 /P1 /E;pnWq;1;True;[CrystalCPUID]
|
但し、確実に単独で動作が完結する処理以外で、この指定は行わないでください。
特に、スタートアップスクリプトとして利用する場合、Windowsがスタートアップで停止していまい、
起動しなくなる可能性があります。
(既定であれば、Windowsのスタートアップスクリプトのタイムアップ設定により回避される)
アーカイブ内のサンプルini
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ファイルソース
Dim My, Shell, Fs Set My = WScript With My Set Shell = .CreateObject("WScript.Shell") Set Fs = .CreateObject("Scripting.FileSystemObject") End With Dim sTitle, artargets, iExe, sWq, rTarget, wType, sSec Const vbWq = """" sTitle = Fs.GetBaseName(My.ScriptName) 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 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 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) WScript.Sleep 150 Do Until iFile.AtEndOfStream rL = iFile.ReadLine lResult = lResult & "**" & rL & "**" Loop WScript.Sleep 150 iFile.Close strResults = Replace(Replace(lResult,"****","*"),"**","") If Control = 0 Then inArrays strResults, "*" & lSplitter, iniLoader Else iniLoader = Replace(strResults,"*",lSplitter) End If End If End Function Function inArrays(tSources, strLimitters, arReturn) Dim arSources, arLimitters, iLimitter, arInArrays, iSource, Pc arSources = tSources lArray strLimitters, arLimitters 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 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 鯖管理 起動順序 スタートアップ>