🐷

Chat GPT3にPowerShellの書き方を教えてもらう

2023/03/26に公開

概要

先日エントリで適当に書いたコードをChat-GPTさん(3)に直してもらえないか試しました。
https://zenn.dev/laudektoj/articles/ff2574e3510404
巷でいわれている通り、何をしたいかを適切に言語化できれば「そうそうこんな感じ!」という感じのWaoな返答をもらえる嘘かどうか公式な情報も参照して検査できれば、Chat-GPTさん(3)とやりたいことを話しながら修正するのに向いていると思いました。

修正したかった点

  1. 出力文
  2. ログファイル出力

1.出力文

指示

以下は1行で記載できますか

$hogeout = "System Disk MediaType: {0}, Free {1:N0}GB, USED{2:N0}GB" -f $hpd.MediaType,($hoge.free/1GB),($hoge.Used/1GB)
Write-Output $hogeout

回答

はい一行で記載できます。

Write-Output ("System Disk MediaType: {0}, Free {1:N0}GB, USED{2:N0}GB" -f $hpd.MediaType,($hoge.free/1GB),($hoge.Used/1GB))

検査

ありがとうございます。まぁ意味わかるし、大丈夫かなぁ

2.ログ出力

指示

スクリプトを実行する度にいか要件のログファイルを出力したいが可能か
ログファイルの内容はWrite-Output で標準出力したものすべて
ログファイルの保存先は実行カレントディレクトリにあるlogディレクトリ配下
ログファイルのファイル名は実行時点の日時を含む

回答

以下はPowerShellでログファイルを出力するスクリプト例です。

$logDirectory = Join-Path $PSScriptRoot "log"
$logFilename = "$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
$logPath = Join-Path $logDirectory $logFilename
if (-not (Test-Path $logDirectory)) {
    New-Item -Path $logDirectory -ItemType Directory | Out-Null
}
Write-Output "ログファイルを作成しました: $logPath"
Start-Transcript -Path $logPath -Force
# ここに実行したいコードを記述
Stop-Transcript

このスクリプトを実行すると、まずログファイルの保存先であるlogディレクトリが存在するか確認し、存在しない場合は作成します。次に、実行時点の日時をファイル名に含むログファイルを作成します。ログファイルの作成に成功した場合は、そのファイルパスを標準出力に出力します。
Start-TranscriptとStop-Transcriptを使うことで、スクリプトの実行中に発生した標準出力やエラー出力をログファイルに書き込むことができます。-Pathパラメータには作成したログファイルのパスを指定し、-Forceオプションを指定することで既に同名のログファイルが存在する場合でも上書きするようにします。Stop-Transcriptを呼び出すことで、ログの記録を終了します。

検査

解説までしてくれるなんて親切なんだ。
Get-Date -Format 'yyyyMMdd_HHmmss' そうこういう風にエレガントに書きたいですね
一応参考資料で索引を引いて妥当な提案だと思われる
Join-Path フォルダパスを安全に作成するにはこれですね。[1]
Start-Transcript : トランススクリプトの保存開始 [2]
Stop-Transcript : StartしたらStopですよね [3]
Test-Path : bool値を返す[4]
Out-Null : 出力を出さないようにするコマンドレット

実行結果

スクリプト自体の実行結果

トランスクリプトが開始されました。出力ファイル: *******
システム モデル:        HP ProDesk 600 G1 SFF
OS 名:                  Microsoft Windows 10 Pro
Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
物理メモリの合計:       8,098 MB
利用できる物理メモリ:   2,724 MB
システムディスクの MediaType: SSD, Free 64GB, USED55GB
トランスクリプトが停止されました。

出力ファイル名をぼかしています。

ログフォルダに作られた様子

PS Get-ChildItem | Format-Table LastWriteTime, Name

LastWriteTime       Name
-------------       ----
2023/03/26 11:32:07 20230326_113201.log
2023/03/26 11:45:13 20230326_114507.log

普通にlsすると見づらいのでこれもChatGPTさんに聞きました。[5]

参考文献等

https://learn.microsoft.com/ja-jp/powershell/scripting/developer/windows-powershell-reference?view=powershell-7.3
https://amzn.asia/d/3yFsXUc

まとめ

コードについてちゃんと解説してくれるのとてもありがたいですが、あまり鵜呑みにせずに提示された知らないコマンドレットは公式情報を参照すべきですが、
ロースキルな身としては、うまく抽象化した要件を伝えてChatGPTさんとうまく付き合っていきたいと思います。

脚注
  1. WindowsPowerShellクックブック レシピ14.9 各コンポーネントからファイルパスを安全に作成する ↩︎

  2. WindowsPowerShellクックブック レシピ1.17 シェルセッションのトランススクリプトを記録する ↩︎

  3. Powershellリファレンス ↩︎

  4. Powershellリファレンス ↩︎

  5. 「Powershell でカレントディレクトリをls したときに LastWriteTime とNameだけ出力したい」と聞きました。 ↩︎

Discussion