ラベル bat の投稿を表示しています。 すべての投稿を表示
ラベル bat の投稿を表示しています。 すべての投稿を表示

2017年7月3日月曜日

bat ファイルの実行時間を PowerShell で計測する

ググればいっぱい情報出てきますが、個人用備忘録として残しておく。
Windows PowerShell の機能
powershell -C "(Measure-Command { .\HogeHoge.bat | Out-Default }).TotalSeconds"

メモ:
* 秒だけ欲しいので .TotalSeconds
* ミリ秒で欲しいときは .TotalMilliseconds
* .\ をつけないと不明なコマンドになる
* 標準出力が欲しい場合は " | Out-Default" をつける
* 標準エラーはコマンドだけで出る

2016年12月26日月曜日

PowerShell を使って「ネットワークドライブ上の」バッチファイルを管理者権限で実行する

「ブログズミ: PowerShell を使ってバッチファイルを管理者権限で実行する」 の補足記事です。
上記との違いは「ネットワークドライブ上の」バッチファイルである点です。
以下がそのバッチ



前回と異なる点は、 PowerShell で自分自身を起動する前に net use でトライブ割当をしている点です。
管理者権限のユーザーに移動すると、割当ていたネットワークドライブが見えない場合があるので、このような対応をしています。

参考

2016年5月2日月曜日

PowerShell を使ってバッチファイルを管理者権限で実行する

自分用備忘録です。
よく runas コマンドを使った方法が紹介されていますが、Powershell を使ったほうが個人的には楽でいいなと思いました。

参考:

rem 管理者権限があるかどうかチェック
whoami /PRIV | find "SeLoadDriverPrivilege" >NUL
if not errorlevel 1 goto start

rem ない場合は powershell 経由で自分自身を実行
powershell.exe -Command Start-Process "%~0" -Verb Runas
goto :EOF

:start
rem ここからバッチ本来の処理

2013年3月5日火曜日

[Jenkins] ビルド番号の不整合を検出する

Jenkins がブルースクリーンなどで正常に終了しなかった場合、ビルド番号がリセットされてしまうことがあります。
(最新のバージョンではそんなことはないかもしれませんが)
その状態で古い履歴を削除する設定をしていると、
ビルド番号の大きい古いビルドが削除されず、ビルド番号の小さな新しいビルドが削除されてしまいます。

これが意外と気づきにくいんですよね。

というわけで自動化しましょう!
不整合の検出
@echo off

pushd "%~dp0"

if "x%~1" == "x" (
    call :target_jenkins_home
    if errorlevel 1 goto error
) else (
    call :target_command_line %*
    if errorlevel 1 goto error
)

SET TARGET_PATH
if errorlevel 1 goto error

SET ERRORCODE=0
for /D %%d in ( "%TARGET_PATH%\jobs\*" ) do (
    @echo %%~nd
    if exist "%%d\nextBuildNumber" (
        for /f %%i in ( %%d\nextBuildNumber ) do (
            call :checkbuildnumber %%d %%i
            if errorlevel 1 (
                SET ERRORCODE=1
            )
        )
    )
)

if "%ERRORCODE%" == "1" goto error
goto end

:checkbuildnumber
SET NEXT=%~2
rem @echo next build number %NEXT%

SET MAXNUM=0
setlocal enabledelayedexpansion
for /D %%d in ( "%~1\builds\*" ) do (
    call :getbuildlognumber %%d
    SET CURNUM=!errorlevel!
    if !CURNUM! gtr !MAXNUM! (
        SET MAXNUM=!CURNUM!
    )
)
rem @echo !MAXNUM!
if %NEXT% lss !MAXNUM! (
    @echo "Warning: next build number [%NEXT%] is smaller than the number of the log [!MAXNUM!]."
    exit /b 1
)
endlocal
exit /b 0

:getbuildlognumber
if not exist "%~1\build.xml" exit /b 0
for /f "tokens=1,2,3,4* delims=<>" %%a in ( %~1\build.xml ) do (
    if "%%b" == "number" (
        exit /b %%c
    )
)
exit /b 0

:target_command_line
if not exist "%~1" (
    @echo %~1 は存在しません。
    exit /b 1
)

SET TARGET_PATH=%~1
exit /b 0

:target_jenkins_home
SET JENKINS_HOME >NUL
if errorlevle 1 (
    @echo JENKINS_HOME が設定されていません。
    exit /b 1
)

SET TARGET_PATH=%JENKINS_HOME%
exit /b 0

:error
popd
@echo failed.
pause
exit /b 1

:end
popd
exit /b 0
bat ファイルでございます。
master ノードで実行する必要があります。
第一引数に ${JENKINS_HOME} のパスを指定します。省略した場合、環境変数のパスをそのまま使います。
こんなんでも定期的に実行するようにしたら、効果はきっとあるでしょう。

もう少しスマートに検出する
Groovy post build plugin を使って検出させてみました。
import hudson.model.AbstractProject

def jenkins = hudson.model.Hudson.instance

def projects = jenkins.getAllItems(AbstractProject.class)
projects.each { project ->
    def lastBuild = project.getLastBuild()
    if( lastBuild != null )
    {
        def lastNumber = lastBuild.getNumber()
        def nextNumber = project.getNextBuildNumber()
        if( nextNumber < lastNumber )
        {
            manager.listener.logger.println(project.getName())
            manager.listener.logger.println("Warning: next build number [${nextNumber}] is smaller than the number of the log [${lastNumber}].")
            manager.buildUnstable()
        }
    }
}
たったこれだけで出来ました~(^^
修復
ビルド番号の修正は Jenkins が"停止"しているときにする必要があります(たぶん)。 不整合の検出で使用したバッチファイルを少し変更して、不整合が見つかったら nextBuildNumber を修正します。
@echo off

pushd "%~dp0"

if "x%~1" == "x" (
    call :target_jenkins_home
    if errorlevel 1 goto error
) else (
    call :target_command_line %*
    if errorlevel 1 goto error
)

SET TARGET_PATH
if errorlevel 1 goto error

for /D %%d in ( "%TARGET_PATH%\jobs\*" ) do (
    @echo %%~nd
    if exist "%%d\nextBuildNumber" (
        for /f %%i in ( %%d\nextBuildNumber ) do (
            call :repairbuildnumber %%d %%i
        )
    )
)

goto end

:repairbuildnumber
SET NEXT=%~2
rem @echo next build number %NEXT%

SET MAXNUM=0
setlocal enabledelayedexpansion
for /D %%d in ( "%~1\builds\*" ) do (
    call :getbuildlognumber %%d
    SET CURNUM=!errorlevel!
    if !CURNUM! gtr !MAXNUM! (
        SET MAXNUM=!CURNUM!
    )
)
rem @echo !MAXNUM!
if %NEXT% lss !MAXNUM! (
    @echo "Warning: next build number [%NEXT%] is smaller than the number of the log [!MAXNUM!]."
    SET /a NEWNUM=!MAXNUM!+1
    @echo new next build number !NEWNUM!
    @echo !NEWNUM!| sed 's/\n//g'> "%~1\nextBuildNumber"
)
endlocal
exit /b 0

:getbuildlognumber
if not exist "%~1\build.xml" exit /b 0
for /f "tokens=1,2,3,4* delims=<>" %%a in ( %~1\build.xml ) do (
    if "%%b" == "number" (
        exit /b %%c
    )
)
exit /b 0

:target_command_line
if not exist "%~1" (
    @echo %~1 は存在しません。
    exit /b 1
)

SET TARGET_PATH=%~1
exit /b 0

:target_jenkins_home
SET JENKINS_HOME >NUL
if errorlevle 1 (
    @echo JENKINS_HOME が設定されていません。
    exit /b 1
)

SET TARGET_PATH=%JENKINS_HOME%
exit /b 0

:error
popd
@echo failed.
pause
exit /b 1


:end
popd
pause
exit /b 0
※上記バッチファイルの使用は自己責任でお願いします。