ここでPowerShellスクリプトでxamppのエラーログファイルの削減について触れた。
ただ上記のリンク先の方法だと、PowerShellのマドが開いたままになってあまり格好良くない。PowerShellのマドを非表示のままで実行する方法を Web検索すると、Javaや VBスクリプト(vbs)などの別のスクリプトからなら アプリのマドを開かないで起動するような方法があると知った。
そこでそれらの情報を参考に、独自に vbs経由で ps起動するような vbs/ps 両スクリプトを考えてみた。1週間ほどかかって結構難儀したが何とか動くようになった。概ねは以下の通り
log_del.vbsOption Explicit
Dim objFSO, objWshShell
' VBSパス、VBS格納フォルダ、PS1パス
Dim strVBSPath
Dim strVBSFolder
Dim strPS1Path
' オブジェクト参照
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objWshShell = WScript.CreateObject("WScript.Shell")
' VBSパス、VBS格納フォルダ、PS1パス
strVBSPath = Wscript.ScriptFullName
strVBSFolder = objFSO.GetFile(StrVBSPath).ParentFolder
strPS1Path = strVBSFolder & "\log_del.ps1"
' PS1起動オプション
Const OPT = "Powershell -ExecutionPolicy RemoteSigned -NoExit "
' PowerShellを Windowを表示せず非同期起動する
objWshShell.Run OPT & strPS1Path,0,false
' オブジェクト解放
Set objFSO = Nothing
Set objWshShell = Nothing
log_del.ps1$dtime = (Get-Date -Format "MM/dd/HH:mm:ss")
$process = Get-Process -Name httpd -ErrorAction SilentlyContinue # Apache 起動中チェック
Add-Content C:\xampp\Apache\logs\ps_result.txt $cmt
if ($process) { # ログオン時だけ(Apache非実行)なら必要ない
$cmt = $dtime + " / Apache(httpd) が起動中のためログを削除できません。"
Add-Content C:\xampp\Apache\logs\result.txt $cmt
exit
} else {
$efilePath = "C:\xampp\Apache\logs\error.log"
$afilePath = "C:\xampp\Apache\logs\access.log"
$fsyze = (Get-Content C:\xampp\Apache\logs\error.log).Length # ログ行数
$readstr = Get-Content $efilePath -Tail 100 # 最後の100行だけ読む
$readstr | Out-File $efilePath
$result1 = echo $? # ファイル出力結果
$readstr = Get-Content $afilePath -Tail 100
$readstr | Out-File $afilePath
$result2 = echo $?
$dtime += " / " + $fsyze
if(($result1 -eq "True") -or ($result2 -eq "True")){
$dtime += "/ログ削除OK "
}else{
$dtime += "/ログ削除NG "
}
Add-Content C:\xampp\Apache\logs\ps_result.txt $dtime
}
上記 vbsと ps1ファイルを適当な同一フォルダに保存し、タスクスケジューラで ログオン時に log_del.vbsスクリプトを実行するように指定する。以下は出力される ps_result.txtの例
07/02/23:35:40 / Apache(httpd) が起動中のためログを削除できません。
07/03/18:56:23 / 107/ログ削除OK
07/04/11:03:31 / 123/ログ削除OK