【bat】Oracleサービスとリスナー起動停止

Oracleサービスとリスナーをbatファイルで起動する。
起動順序としてはリスナー起動、サービス起動となる。
停止順序は逆順となる。

Oracleリスナー起動
@echo off
setlocal
REM Oracleリスナー起動
set ROOT_DIR=D:/batch
set BIN_DIR=%ROOT_DIR%/bin
set LOG_FILE=%ROOT_DIR%log/%~n0.log
 
echo [ INFO ] %DATE% %TIME% Oracleリスナー起動開始>>%LOG_FILE%
cd D:/Product/Ofs41_1\FailSafe\Client
FSCMD ONLINERESORCE FslDBServer /CLUSTER=DBServer>>%LOG_FILE%

if NOT %ERRORLEVEL%==0 goto ERR_END

timeout /t 120 /nobreak

echo [ INFO ] %DATE% %TIME% Oracleリスナー起動終了>>%LOG_FILE%
exit /b

:ERROR_END
echo [ ERROR ] %DATE% %TIME% Oracleリスナー起動失敗>>%LOG_FILE%
exit

endlocal
Oracleサービス起動
@echo off
setlocal
REM Oracleサービスー起動
set ROOT_DIR=D:/batch
set BIN_DIR=%ROOT_DIR%/bin
set LOG_FILE=%ROOT_DIR%log/%~n0.log
 
echo [ INFO ] %DATE% %TIME% Oracleサービス起動開始>>%LOG_FILE%
cd D:/Product/Ofs41_1\FailSafe\Client
FSCMD ONLINERESORCE IFSDB /CLUSTER=DBServer>>%LOG_FILE%

if NOT %ERRORLEVEL%==0 goto ERR_END

timeout /t 120 /nobreak

echo [ INFO ] %DATE% %TIME% Oracleサービス起動終了>>%LOG_FILE%
exit /b

:ERROR_END
echo [ ERROR ] %DATE% %TIME% Oracleサービス起動失敗>>%LOG_FILE%
exit

endlocal

【bat】サーバ再起動

batファイルでサーバを再起動させます。

@echo off
setlocal

set ROOT_DIR=D:/batch
set BIN_DIR=%ROOT_DIR%/bin
set LOG_FILE=%ROOT_DIR%log/%~n0.log

echo [ INFO ] %DATE% %TIME% サーバ再起動開始>>%LOG_FILE%
SHUTDOWN /r /f /c "batファイルによるリブート"
if NOT %ERRORLEVEL%==0 goto ERR_END
echo [ INFO ] %DATE% %TIME% サーバ再起動終了>>%LOG_FILE%
exit /b

:ERR_END
echo [ ERROR ] %DATE% %TIME% サーバ再起動失敗>>%LOG_FILE%
exit /b

endlocal

【bat】共有フォルダへの接続

共有フォルダへの接続をbatファイルで自動化する。
[bat]
@echo off
rem 接続解除
net use /delete \\server\dir$ /yes

rem 接続
net use /presistent:yes “\\server\dir” /user:testuser@testdom.local password
[/bat]

上記のbatファイルをタスクスケジューラでSYSTEMユーザ実行などで登録する。
起動するとSYSTEMユーザが「\\server\dir」に接続できるようになる。
net useの「/user」はあくまでも共有フォルダへ接続するための
ユーザIDとパスワードになる。

上記の例でいうと「testuser」が共有フォルダに接続できるようになるわけではない点に注意。
(元々、ログインするためのユーザなので勘違いしやすい)

【bat】サービス起動バッチ

サービスの状態を確認し、「STATE」になっている場合、
サービスを起動します。

前提
サービス名は「TES_SER」とします。

FOR /f "usebackq tokens=1,2,3,4,5 delims=: " %%A IN (`sc query "TES_SER" ^| findstr -i "STATE"`) DO if "%%A"=="STATE" if "%%C"=="STOPPED" sc start TES_SER TES_SERの起動引数(任意)

【bat】UTF-8のDBデータ取得

バッチファイルでUTF-8のDBデータを取得します。
DBデータ取得部分はDBに併せて変更する。

@echo off
REM バッチ実行ファイルと同階層に実行したいSQLファイルを配置する。
REM SQLファイルは1文を1行で記載する。
REM SQLファイルは「PARAM1」と「PARAM2」を置換文字列としておく。
setlocal ENABLEDELAYEDEXPANSION

REM SQLファイルの置換内容の入力
set /P START_DAY="開始日(YYYYMMDD)を入力してください。:"
set /P END_DAY="終了日(YYYYMMDD)を入力してください。:"

REM バッチ実行ディレクトリの設定
set CURRENT_DIR=%~dp0

REM 日付時刻の設定
set CURRENT_DATE_TIME_HOUR=%time:~0,2%
set CURRENT_DATE_TIME_MINUTE=%time:~3,2%
set CURRENT_DATE_TIME_SECOND=%time:~6,2%
set CURRENT_DATE_TIME=%date:~0,4%%date:~5,2%%date:~8,2%%CURRENT_DATE_TIME_HOUR: =0%%CURRENT_DATE_TIME_MINUTE: =0%%CURRENT_DATE_TIME_SECOND: =0%

REM DB接続ファイルのディレクトリに移動
REM 今回の例ではMySQLとする
set MYSQL_DIR="C:\Program Files\MySQL\MySQL Server 5.7\bin"
cd /d %MYSQL_DIR%

set SQL_FILE=%CURRENT_DIR%%~n0.sql
set SQL_FILE_TMP=%CURRENT_DIR%%~n0_tmp.sql
set WORK_DIR="D:\work"
set OUT_DIR=%CURRENT_DIR%output\%CURRENT_DATE_TIME%
mkdir %OUT_DIR%

set ROWNUM=1

REM コンソールの文字コードをUTF-8に変更
chcp 65001

for /f "tokens=*" %%i in (%SQL_FILE%) do (
set SQL_LINE1=%%i
set SQL_LINE2=!SQL_LINE1:PARAM1=%START_DAY%!
set SQL_LINE3=!SQL_LINE2:PARAM2=%END_DAY%!
echo !SQL_LINE3! > %SQL_FILE_TMP%

REM DB接続と実行
REM 今回の例ではMySQLとする
mysql -h localhost -u ユーザID -pパスワード -P ポート番号 docrdb < "%SQL_FILE_TMP%" >> %WORK_DIR%\!ROWNUM!.txt

set /A ROWNUM=!ROWNUM!+1
)

del %SQL_FILE_TMP%

REM コンソールの文字コードをShift-JISに変更
chcp 932

REM DBデータ出力結果のファイル名を変更
move %WORK_DIR%\1.txt %OUT_DIR%\01_案件数.txt
move %WORK_DIR%\2.txt %OUT_DIR%\02_案件数不備あり.txt
move %WORK_DIR%\3.txt %OUT_DIR%\03_案件数不備なし.txt

【bat】バッチファイルのテンプレート

バッチファイルのテンプレートとして、以下を設定する。
日付時刻の設定
バッチファイル実行場所の利用
バッチファイルと同名ファイルの利用

@echo off

REM 日付時刻の設定
set CURRENT_DATE_TIME_HOUR=%time:~0,2%
set CURRENT_DATE_TIME_MINUTE=%time:~3,2%
set CURRENT_DATE_TIME_SECOND=%time:~6,2%
set CURRENT_DATE_TIME=%date:~0,4%%date:~5,2%%date:~8,2%%CURRENT_DATE_TIME_HOUR: =0%%CURRENT_DATE_TIME_MINUTE: =0%%CURRENT_DATE_TIME_SECOND: =0%

REM バッチファイル実行場所の利用
REM バッチファイルと同名ファイルの利用
set LOG_FILE=%dp0/%n0_%CURRENT_DATE_TIME%.log

【bat】バッチファイルで全てのCSVファイル内の特定文字列を編集する

バッチファイルで同階層にあるCSVファイル内のの特定文字列を編集します。

前提条件
編集前のCSVファイル:TEST_yyyyMMddhhmmss.csv
編集後のCSVファイル:after_TEST_yyyyMMddhhmmss.csv
特定文字列:電話番号と仮定し、3桁、4桁、4桁のハイフン区切りに編集
補足:フォーマットは以下の例の通り
      電話番号は空欄の可能性あり
      電話番号の後続列は空欄の可能性あり
例
編集前
1,山田太郎,202-0003,09011112222,男
2,山田次郎,202-0003,,男
3,山田太郎,202-0003,,

編集後
1,山田太郎,202-0003,090-1111-2222,男
2,山田次郎,202-0003,,男
3,山田太郎,202-0003,,
@echo off
setlocal ENABLEDELAYEDEXPANSION
cd %~dp0
set LOG_FILE=%~n0.log
echo [ INFO ] %date% %time% CSVファイルの編集を開始します。 >>%LOG_FILE%

for %%x in (TEST_*.csv) do (
  echo %%x
  set OUTPUT_FILE=after_%%x
  type nul > !OUTPUT_FILE!

  for /f "tokens=1-5 delims=," %%a in (%%x) do (
    set STRTMP=%%d
    if not "!STRTMP!" == "" (
      if "!STRTMP:~0, 3!" == "090" (
        set STRTMP=!STRTMP:~0, 3!-!STRTMP:~4, 4!-!STRTMP:~7, 4!
        echo %%a,%%b,%%c,!STRTMP!,%%e >>!OUTPUT_FILE!
      ) else (
        echo %%a,%%b,%%c,,%%d >>!OUTPUT_FILE!
      )
    ) else (
      echo %%a,%%b,%%c,%%d,%%e >>!OUTPUT_FILE!
    )
  )
)
echo [ INFO ] %date% %time% CSVファイルの編集を終了します。 >>%LOG_FILE%
endlocal
exit /b
ポイント
・delimsでカンマ区切りを指定する。
・tokensで区切った配列のどのインデックスを利用するか決定する。
  配列は%%a~%%eで参照可能。
・値が空欄の場合、配列が詰められる。(ココがややこしい)
  1列目:配列の長さは5
  2列目:配列の長さは4
  3列目:配列の長さは3
・「type nul > !OUTPUT_FILE!」を行うことで、1度初期化してから実行している。
・繰り返し処理中は「setlocal ENABLEDELAYEDEXPANSION」~「endlocal」内で
  変数は「!XXX!」で参照可能。

【bat】ディレクトリ一覧とファイル一覧を取得する

コマンドプロンプトでディレクトリ一覧とファイル一覧を取得します。
パスとファイル名のみ取得できるようにオプションを追加して取得します。

  • ディレクトリ一覧取得

    /b:不要な情報を非表示(サイズや更新時間)
    /s:ディレクトリ内を再帰表示
    /ad:表示属性はディレクトリのみ(/aが属性、/dがディレクトリ)
    
    dir /b /s /ad
    
  • ファイル一覧取得

    /a-d:表示属性はファイルのみ(-をつけることでディレクトリを除く)
    
    dir /b /s /a-d
    
  • ディレクトリ一覧とファイル一覧取得

    dir /b /s