Powershellを使ったバックアップツールを作ってみた(検証2回目)

投稿者:

はい、どうも。
前回はプロセスの割り出しや停止処理をしましたが、今回は環境変数の外出しを検証していきます。

テキストの変数取り込みもできますが、簡単にいきたいので、
変数のコンフィグもPowershellで作っていってしまいます。

流れとしては簡単

コンフィグ書く

本処理ファイルで取り込む

幸せになれる

まずは机上のお話。
変数にしたい要素たちを出していきます。

作りたい物はThunderbirdの停止をしてネットワークドライブなりにバックアップデータを圧縮して吐き出す。
なんて単純なフローです。もちろん動作ログも出していきます。
ただ、続きなので、前回のノートパッド停止スクリプトを変数にして検証していきましょう。

では洗い出しましょう。

・ログファイル名定義
・ログファイル保存パスの定義
・スクリプト実行時間の取得定義
・停止対象プロセス名定義

こんなところでしょうか。

ではモリモリ書いていきます。

#時刻設定
$getSysTime = Get-Date -Format "yyyy-MMdd-HHmmss"
$getSysTime_log = Get-Date -Format "yyyy年MM月dd日HH時mm分ss秒"

###設定項目###
# $LogDirPath ログファイル出力先ディレクトリをフルパスで指定します。パス末尾に「\」必須
$LogDirPath = "C:\temp\log\"

# $LogFileName ログファイル出力名を指定します。
$LogFileName = "result_$getSysTime.log"

# $pname プロセス名
$pname = "notepad"

getSysTimeで二つの変数を作ってると思いますが、時刻の表現の差です。
無印はログファイル名つける時に、_logのものはログファイル内に表記する際に見やすくするためです。

ではここまで出来たら折り返し地点です。
本スクリプトを実行スクリプトと同じところに保存して、
実行スクリプトの編集を進めていきます。

前回のスクリプトはこんな感じ

#判定ファンクション
Function hantei {
$ps_count2 = (Get-Process -ErrorAction 0 "notepad").Count

if ($ps_count2 -ne 0){
  Write-Host "ノートパッドは停止できませんでした"
  }
}
#ここまで

$ps_count = (Get-Process -ErrorAction 0 "notepad").Count

if ($ps_count -eq 0){
  Write-Host "ノートパッドは停止中"
  }else{
  Write-Host "ノートパッドは起動中"
  Write-Host "ノートパッド停止します"
  (Get-Process notepad).CloseMainWindow() 
  hantei
  }

ではこれを変数化してログ出力処理を追加していきます。

#変数取り込み
.".\notepad_stop_env.ps1"

#logファイル出力
Write-Output $getSysTime_log "======停止処理開始=======" | Out-File $LogDirPath$LogFileName -Encoding utf8

#判定ファンクション
Function hantei {
$ps_count2 = (Get-Process -ErrorAction 0 $pname).Count

if ($ps_count2 -ne 0){
  Write-Output "ノートパッドは停止できませんでした" | Add-Content $LogDirPath$LogFileName -Encoding utf8
  Write-Output "======停止異常終了=======" | Add-Content $LogDirPath$LogFileName -Encoding utf8
  }else{
  Write-Output "======正常終了=======" | Add-Content $LogDirPath$LogFileName -Encoding utf8
  }
}
#ここまで

$ps_count = (Get-Process -ErrorAction 0 $pname).Count

if ($ps_count -eq 0){
  Write-Output "ノートパッドは停止中" | Add-Content $LogDirPath$LogFileName -Encoding utf8
  }else{
  Write-Output "ノートパッドは起動中" | Add-Content $LogDirPath$LogFileName -Encoding utf8
  Write-Output "ノートパッド停止します" | Add-Content $LogDirPath$LogFileName -Encoding utf8
  (Get-Process $pname).CloseMainWindow() | Add-Content $LogDirPath$LogFileName -Encoding utf8
  hantei
  }

変数取り込みの箇所で、相対パスで環境変数スクリプトの「notepad_stop_env.ps1」を取り込んでいます。
これは一番初めに書いておくといいと思います。
勿論絶対パスも有効ですが、スクリプトと同じ位置に置くことを想定していれば、上記のように書けば、配置先を変えても動作してくれます。
もしくはconfディレクトリとかを切りたいというのであれば、「../conf/notepad_stop_env.ps1」としてもよいかと思います。
その辺はいっぱい情報転がってるので勉強しましょう。

次にログ出力ですが、Powershellだと「>>」のようなリダイレクションも利用できますが、
文字化けたり不要なオブジェクトが残存することがあるので、Add-Contentでエンコードして追記していきます。
ログファイルの処理初め、つまり新規作成時にはOut-Fileを利用して、ファイルを生成してあげます。
ちなみに、Out-Fileだけで書くと上書きになるので、最終処理のログしか残りません。

ログ出力では、Write-Hostにしていた箇所を全て、Write-Outputにしています。
実行端末画面(Host)ではなく、出力(Output)に吐き出すようにしているんですね。
そして吐き出された内容は「|(パイプ)」を介して、Add-Contentに渡されるという流れです。

次に停止対象のプロセスの変数化ですが、お分かりの通り、
”notepad”となっていた箇所を$pnameに置き換えて終わりです。
それでは動作させてみます。

powershell C:\temp\bin\notepad_stop.ps1

結果
なし

指定したログ出力先にファイルが生成され、処理内容がログとして出ていると思います。
やり方によっては、異常終了を検出したらWindowsシステムにエラーを出すこともできますが、
それは今回のスコープ外なんで機会があればということで。

C:\temp\logを見てみると「result_2020-1014-102120.log」みたいなファイルができています。
中身は

2020年10月14日10時21分20秒
======停止処理開始=======
ノートパッドは起動中
ノートパッド停止します
False
False
ノートパッドは停止できませんでした
======停止異常終了=======

うん、外出しのコンフィグを読み込んでちゃんと実行できていますね。

ちな正常終了もテストしてみます。

2020年10月14日10時25分46秒
======停止処理開始=======
ノートパッドは起動中
ノートパッド停止します
True
True
ノートパッドは停止できませんでした
======停止異常終了=======

ん?Trueになってるのに停止できない、でも、実際にnotepadは閉じてる。
まぁ大体こんな時は、notepadプロセスが終了しきる前にhanteiのfunctionが動いて、
プロセス数が0じゃないと判断をしているっぽいので開始時にちょっとだけ処理を遅延させます。

#変数取り込み
.".\notepad_stop_env.ps1"

#logファイル出力
Write-Output $getSysTime_log "======停止処理開始=======" | Out-File $LogDirPath$LogFileName -Encoding utf8

#判定ファンクション
Function hantei {
sleep 1
$ps_count2 = (Get-Process -ErrorAction 0 $pname).Count

if ($ps_count2 -ne 0){
  Write-Output "ノートパッドは停止できませんでした" | Add-Content $LogDirPath$LogFileName -Encoding utf8
  Write-Output "======停止異常終了=======" | Add-Content $LogDirPath$LogFileName -Encoding utf8
  }else{
  Write-Output "======正常終了=======" | Add-Content $LogDirPath$LogFileName -Encoding utf8
  }
}
#ここまで

$ps_count = (Get-Process -ErrorAction 0 $pname).Count

if ($ps_count -eq 0){
  Write-Output "ノートパッドは停止中" | Add-Content $LogDirPath$LogFileName -Encoding utf8
  }else{
  Write-Output "ノートパッドは起動中" | Add-Content $LogDirPath$LogFileName -Encoding utf8
  Write-Output "ノートパッド停止します" | Add-Content $LogDirPath$LogFileName -Encoding utf8
  (Get-Process $pname).CloseMainWindow() | Add-Content $LogDirPath$LogFileName -Encoding utf8
  hantei
  }

hanteiファンクションにsleepで1秒の処理遅延を作ってあげます。
すると、

2020年10月14日10時34分25秒
======停止処理開始=======
ノートパッドは起動中
ノートパッド停止します
True
======正常終了=======

はい、hanteiでちゃんと正常終了しましたね。
これで、外出しコンフィグの設定とログ出力の設定は整いました。

次回は実際のバックアップrobocopyについて書きます。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です