続々々・PowerShellを触ろう~まだまだログ出力について調べる

batにPowershellを叩いてもらう

Powershellを叩くと、とある一連の処理を全て実行するという動きをさせたいという話を聞いた。なんかPowershellを使うことを想定してはいるが、バッチファイルも使うかも、みたいな話らしい。よくわからん。
ちなみに、バッチファイルからpowershellを呼び出して処理をさせる、ということはできそう。
下記のコマンドでできた。

powershell .\TestScript.ps1

.\なのは、このバッチファイルがps1ファイルと同じ階層にあるからです。

Start-transcriptで出力するログファイル名や出力先フォルダを変更する

これから作成するスクリプトは、色々なホストに対して実行する予定です(と先方が言っている)
んで、後でログを見る時に「このログってどの機器で作業したやつだっけ?」ってのがわかるように、ログファイル名にホスト名を自動でつけるようにしたらいいなーと思うのです。Teratermのログの命名規則でも、ログイン先の機器名をファイル名に設定できたと思うのですが、これPowerShellでもできるよね?ってことで。

$DATE = Get-Date -Format "yyyyMMdd_HHmmss"
#ログ命名
$HOSTNAME = hostname
$EXEDATE = get-date -format G
# 実行時間
Start-transcript -path C:\logs\${DATE}_${HOSTNAME}.txt

Write-output "${EXEDATE}: 実行開始"

echo "Hello world"

Start-Sleep -s 5
# 小休止

echo "Hello and Goodbye"

Start-Sleep -s 3
# 小休止

Write-output "${EXEDATE}: 実行終了"

Stop-transcript

Read-Host "続けるには Enter キーを押してください..."

参考:https://matome.naver.jp/odai/2141066809067267301/2143279698431157403
$HOSTという変数は使えないみたいだったので、$HOSTNAMEにした次第です。
んで、実行結果は以下の通り

PS C:\Users\bladecatcher> C:\Users\bladecatcher\Desktop\TestScript.ps1
トランスクリプトが開始されました。出力ファイル: C:\logs\20190221_150914_bladecatcher-PC.txt
2019/02/21 15:09:14: 実行開始
Hello world
Hello and Goodbye
2019/02/21 15:09:14: 実行終了
トランスクリプトが停止されました。出力ファイル: C:\logs\20190221_150914_bladecatcher-PC.txt
続けるには Enter キーを押してください...:

すばらしい。
こんだけない脳みそ&ないスキルを活用したにもかかわらず「そこまで考えなくていいです」とか言われる悲しみ。正直、自分が一番動きをイメージしやすいところからやっていってるって気持ちはある。


ところで、出力先のフォルダが存在していないとエラーになる。ファイルは上記の記述で自動で作成してくれるけど、フォルダはそうもいかない。
色々な機器に対して実行させる予定なので、出力先フォルダは一律にしたい→C直下なら楽だな、と思ってC直下をしてみたが、なんかダメそうだったので、しょうがないのでC直下にフォルダを作成し、そこに吐き出してもらうことにした
Start-transcriptの前に、以下の行を追加。

New-Item c:\tmp -itemType Directory

これで、C直下にtmpフォルダを作成してくれる。
実行結果は以下の通り。

PS C:\Users\bladecatcher> C:\Users\bladecatcher\Desktop\TestScript.ps1


ディレクトリ: C:\


Mode LastWriteTime Length Name

        • ------------- ------ ----

d---- 2019/02/21 15:28 tmp
トランスクリプトが開始されました。出力ファイル: C:\tmp\20190221_152815_bladecatcher-PC.txt
2019/02/21 15:28:15: 実行開始

ちゃんとc:\tmpの下にログを出力していました。

フォルダの存在有無を確認する

これまでの記述では、C:\tmpフォルダがない前提だったけど、もし既にtmpフォルダが存在していた場合は?
変なエラー起こして止まったらめんどくさいので、一連の処理の前に、c:\tmpフォルダが存在しているかどうかを確認してもらうことにした。
もしc:\tmpフォルダが無ければ作成し、あればフォルダを作成する処理はスキップする、という感じ。
参考:https://bayashita.com/p/entry/show/54

# C:\tmpのフォルダ が存在するかを確認
$result = (Test-Path "C:\tmp")

if($result){
#ファイルが存在する場合はこちらが実行されます。
Write-Host "フォルダが存在しているため、フォルダ作成処理をスキップしました。"
}else{
#ファイルが存在しない場合はこちらが実行されます。
New-Item c:\tmp -itemType Directory
Write-Host "tmpフォルダを作成しました。"

}

Read-Host "続けるには Enter キーを押してください..."

これ単体なら上手く動きました。
そんで、既存のスクリプトに組み込んでみる。

PS C:\Users\bladecatcher> C:\Users\bladecatcher\Desktop\TestScript.ps1


ディレクトリ: C:\


Mode LastWriteTime Length Name

        • ------------- ------ ----

d---- 2019/02/21 16:06 tmp
tmpフォルダを作成しました。
トランスクリプトが開始されました。出力ファイル: C:\tmp\20190221_160630_bladecatcher-PC.txt
2019/02/21 16:06:30: 実行開始
Hello world
Hello and Goodbye
2019/02/21 16:06:30: 実行終了
トランスクリプトが停止されました。出力ファイル: C:\tmp\20190221_160630_bladecatcher-PC.txt
続けるには Enter キーを押してください...:

【フォルダ作成後再実行】
PS C:\Users\bladecatcher>
PS C:\Users\bladecatcher> C:\Users\bladecatcher\Desktop\TestScript.ps1
フォルダが存在しているため、フォルダ作成処理をスキップしました。
トランスクリプトが開始されました。出力ファイル: C:\tmp\20190221_160644_bladecatcher-PC.txt
2019/02/21 16:06:44: 実行開始
Hello world
Hello and Goodbye
2019/02/21 16:06:44: 実行終了
トランスクリプトが停止されました。出力ファイル: C:\tmp\20190221_160644_bladecatcher-PC.txt
続けるには Enter キーを押してください...:

できたー