本エントリはPowerShell Advent Calendar 2018 の5日目の記事です。
Advent Calender自体初めての参加です。宜しくお願い致します。
気軽によく使うTipsを簡単に紹介します。
###スクリプトブロックについて
スクリプトブロック{}はコマンドを事前に格納しておいて実行時に評価させることができる仕組みです。実際にスクリプトブロックを実行する時は「&」か「.」を頭に記入することで実行できます。
以下のような感じです。
PS C:\Users\TASK-PC> {Write-Host "Hello World!!"} # これだけではダメ
Write-Host "Hello World!!"
PS C:\Users\TASK-PC> & {Write-Host "Hello World!!"} # 「&」に後ろのスクリプトブロックを評価させることがポイント
Hello World!!
PS C:\Users\TASK-PC> . {Write-Host "Hello World!!"} # 「.」でもできる
Hello World!!
PS C:\Users\TASK-PC>
###よく利用する方法
この性質を利用すると、
リアルタイムで様々なコマンドを評価できるので汎用性が高いです。
以下は今回の使い方を利用していない例で、コマンドを通常通りに変数格納しただけです。
この場合は変数を呼び出しても、格納時の時刻が表示されるだけです。
PS C:\Users\TASK-PC> $Today = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
PS C:\Users\TASK-PC> $Today
2018/12/03 00:35:42
PS C:\Users\TASK-PC> $Today
2018/12/03 00:35:42
PS C:\Users\TASK-PC> $Today
2018/12/03 00:35:42
PS C:\Users\TASK-PC>
これを最初の変数格納時にスクリプトブロックを利用しておくと、
毎回変数呼び出しのたびに実行してくれるのでリアルタイム日時を出力できるようになります。
「&」と「.」を頭につけておくことだけは忘れないようにしてください。
PS C:\Users\TASK-PC> $Today = { (Get-Date).ToString("yyyy/MM/dd HH:mm:ss") }
PS C:\Users\TASK-PC> & $Today
2018/12/03 00:39:02
PS C:\Users\TASK-PC> & $Today
2018/12/03 00:39:06
PS C:\Users\TASK-PC> . $Today
2018/12/03 00:39:12
PS C:\Users\TASK-PC>
ループ処理時にループのたびにリアルタイムで値を可変させたい場合などに利用できますから、例に挙げたような時刻系(サーバ起動時間とか)や、インベントリ情報系(SUした後のユーザIDとか)でよく活用しています。以下が処理例です。
PS C:\Users\TASK-PC> $Today = { Write-Output (Get-Date).ToString("[yyyy/MM/dd HH:mm:ss(ddd)]") }
PS C:\Users\TASK-PC> 1..5 | ForEach-Object { Write-Host (& $Today) "Loop Count is $_";Start-Sleep -Milliseconds 5000 }
[2018/12/03 00:55:52(月)] Loop Count is 1
[2018/12/03 00:55:57(月)] Loop Count is 2
[2018/12/03 00:56:02(月)] Loop Count is 3
[2018/12/03 00:56:07(月)] Loop Count is 4
[2018/12/03 00:56:12(月)] Loop Count is 5
PS C:\Users\TASK-PC>
ループ構文内でわざわざコマンドを毎回書く必要もなく、
変数定義時の一回だけ書いて、あとは「&」か「.」で呼び出せばよいのでスッキリした書き方ができて愛用しています。
関数にするまでもない簡単なコマンドを呼び出したい時にご活用ください。
簡単ですが以上です。