廃x浄化

タイトルはコロコロ変えていくスタイル

PowerShellを書いてみたら捗った話

今職場ではPowerShellを書く機会がちょっと増えました。今までも存在自体は知っていたのですが、これが触ってみると意外と便利だったので軽くメモってみる。

ちょっとしたことを実現するにはすごく使いやすいし、Windowsなら開発環境も実行環境も1から設定する必要がない*1から良いですね。

現在日付を取る際のコード

よくありそうな「現在日付をYYYYMMDDで取ってきてよ」ってパターンを例にして考えます。多分何かのファイル名とかに使えるようにするんじゃないですかね?

とりあえず、変数にYYYYMMDDを格納して、変数の中身を標準出力という流れで書きます。

Windows Batchの場合

SET TODAY=%DATE:/=%
echo %TODAY%

Winodowsバッチやコマンドプロンプトでなにかやろうとするのはまぁ定番ですよね。ただし、ちょっと日付書式が分かりづらいと感じます。ググれば簡単なんですけど、自端末からググれない現場に押し込まれると…

bashの場合

#!/bin/bash
today=`date '+%Y%m%d'`
echo $today

こっちはまだ日付書式は分かりやすいですね。まぁ問題はUNIX内でしか使いようがないということです(そんなこと言ったらPowershellWindowsの中だけですが...)。

Javaの場合

// Dateクラスで現在日時を取得
Date d = new Date();

// SimpleDateFormatクラスで表示形式を指定
SimpleDateFormat d1 = new SimpleDateFormat("yyyyMMdd");
String q1 = d1.format(d);
System.out.println(q1);

コードが倍近く長くなってしまいました。「ちょっとしたこと」を実現するためにJavaをガチャガチャやるのはちょっともったいない?のかも。

Powershellの場合

$today = Get-Date -Format "yyyyMMdd"
Write-OutPut $today

コマンドレットも日付書式も、直感で分かりやすいですよね。おまけに標準で入っているコンソールも開発環境もコマンドレットのサジェストをしてくれます。非常にあんしんです。

Scriptの結果をファイルに書きたいんだけど?

こちらもよく聞く内容です。コマンドの結果をテキストに吐いたり(どうせExcelにペーストするんだ)、処理結果をログに吐いたりするというのはまぁどこでも使う処理ですよね。

簡単なパターン

> hoge.bat > fuga.txt
$ ./hoge.sh > fuga.txt

素晴らしいパターン(Powershell)

> powershell fuga.ps1
PS C:\Users\hogehoge> ./hoge.ps1 > fuga.txt
  • Powershellエンコード指定して出す
    • パイプラインが使えるのね!おまけにOut-Fileコマンドレットの使い方も分かりやすい。
PS C:\Users\hogehoge> ./hoge.ps1 | Out-File hoge.txt -Encoding "utf8"

えげつないパターン(Java)

  • Java
    • ファイル出力はめんどくさいから書きません(Fileクラスとか使うんだろうけど)。
    • 下記が最速だと思います。
      1. System.out.println するコードを書いてコンパイル
      2. javaコマンドでclass実行。> fuga.txt とかつけてやる。
java -cp %CLASSPATH% package.hoge > fuga.txt

PowerShellではまった点

まとめ

  • Powershellはコマンドが直感でわかるし、環境も簡単に揃う。

    • .NET Frameworkなんかも使えるらしい。
    • なんだったらODBCとかも使えるぞ
      • ちなみに僕はSQL*Plusの結果を標準出力させて変数格納させましたけど
  • UNIXめいたパイプラインが使えるのが嬉しい

    • 極力処理は標準出力させたほうがいいかも?
  • Javaはもっと高機能なアプリケーションに使いましょう...

最近はPowershellをVS Codeで書き出してます。会社ではサクラエディタ魔改造。まぁまぁ便利です。ところでこのエントリ、ソースコードシンタックスハイライトが書きたかっただけという話もあるみたいですね(棒

*1:Windows7以降からプリインストールらしい。WinodwsXPを渡されるクソみたいな現場じゃない限りセーフですね