こんにちは、武田です。
今回もwindows用UCI「PowerShell」を触っていきます

業務に使えそうなテクニック

ちょっと調べてみたらよさ気なテクニックがありました。

  • 指定フォルダ以下のgrep
    指定フォルダ以下を rgba で検索
PS C:\Users\ken\Desktop\Chart.js-master> Get-ChildItem . -include *.js -Recurse -Force | Select-String "rgba" -Encoding default

src\Chart.Bar.js:17:       scaleGridLineColor : "rgba(0,0,0,.05)",
src\Chart.Bar.js:220:      gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)",
src\Chart.Core.js:78:      scaleLineColor: "rgba(0,0,0,.1)",
src\Chart.Core.js:123:     tooltipFillColor: "rgba(0,0,0,0.8)",
src\Chart.Line.js:14:      scaleGridLineColor : "rgba(0,0,0,.05)",

たしかに取れてる。やたらと記述が多いけど。。。

  • ファイル名によるfind
    hogeといファイル名をカレント以下から検索
PS C:\> ls -r | where { $_.Name -match "hoge" }
    ディレクトリ: C:\
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2016/04/09     14:25            hoge

    ディレクトリ: C:\aaaa
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2016/03/08     18:09          4 hoge.txt

検索できてます

  • ファイル名でfind + rm
    *.backupでhitするファイルを削除
PS C:\hoge>  ls -Recurse -Include '*.backup'

    ディレクトリ: C:\hoge\dir1
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2016/03/08     18:09          4 hoge_0123.txt.backup

    ディレクトリ: C:\hoge
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2016/03/08     18:09          4 hoge.txt.backup

PS C:\hoge>  ls -Recurse -Include '*.backup' | rm
PS C:\hoge>  ls -Recurse -Include '*.backup'

ちゃんと消えてます。

  • 指定フォルダ以下の文字列置換
    bbb -> zzzへ置換
PS C:\hoge> cat .\hoge.txt
aaaaaaaaa
bbbbbbbbbbb
ccccccccccccc
PS C:\hoge> gci -r -i *.txt . |  %{(gc -en UTF8 $_)|%{$_ -replace'bbb','zzz'}|sc -en UTF8 $_}
PS C:\hoge> cat .\hoge.txt
aaaaaaaaa
zzzzzzzzzbb
ccccccccccccc

置換もできてます。やたら(ry

  • コマンドプロンプトからエクスプローラに移動する
    ii .
    指定したディレクトリが開いた状態のエクスプローラがたちがあってきます。これちょっと便利!

  • 処理結果をHTMLに書き出し
    パイプで繋いだ結果をConvertTo-Htmlに渡すとhtmlに整形してくれるようです。

PS C:\Users\ken\Desktop\Chart.js-master>  Get-ChildItem . -include *.js -Recurse -Force | Select-String "rgba" -Encoding
 default | ConvertTo-Html | Out-File -FilePath C:\Users\ken\Desktop\aaa.html

html

まあ、簡単な検索や置換、grepはなんとかなりそうですな!
win環境にしかファイル無い時、わざわざlinuxに移して処理して
またwinに戻すみたいな事しなくてもいい!

簡単なアプリケーションを作ろう

社内の残念作業の生け贄選定のためにPHPで作ったくじ引きツールが
あるのですが、せっかくなのでPowerShellで作りなおしてみましょう。

  • まずは下地としてechoするだけのスクリプトを動かしてみましょう
PS C:\hoge> cat .\test.ps1
echo "test"

PS C:\hoge> .\test.ps1
.\test.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\hoge\test.ps1 を読み込むことができませ
ん。詳細については、「about_Execution_Policies」(http://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ .\test.ps1
+ ~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

セキュリティエラー。権限設定が必要なのかもしれません。
どうも調べてみたところ、[実行ポリシーの変更]なるものが必要なようです。

PowerShell自体を管理者権限で立ち上げなおした上で、ポリシー変更します。

現状の権限

PS C:\windows\system32>  Get-ExecutionPolicy
Restricted

変更の実施

PS C:\windows\system32> Set-ExecutionPolicy RemoteSigned
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): Y

さて、いまいちどテストスクリプトを動かしてみる。。。

PS C:\hoge> .\test.ps1
test

ちゃんとechoされました。

プログラムを書いてみると動かすと。。。

PS C:\hoge> .\test.ps1
### くじ引きツール ###
当選者は武田さんです!
このツールは以下のメンバーからランダムで1人選んでます。
渕上,山本,武田(計3名)

くじ引きツールとして動いてくれますね。。。

参考としてPHP/PowerShellを見比べてみましょう

  • PHP
<?php
$members = array("渕上", "山本", "武田");
$hitMember = $members[array_rand($members)];
?><HTML>
<HEAD><TITLE>くじ引きツール</TITLE></HEAD>
<BODY>
<h1>くじ引きツール</h1>
当選者は<font color='red' size='+3'><?php echo $members[array_rand($members)] ?></font>さんです!
<hr>
このツールは以下のメンバーからランダムで1人選んでます。<br>
<?php echo implode(", ", $members )?>(計<?php echo count($members); ?>名)
<hr>
</BODY>
</HTML>

恐ろしくシンプルなphp
最近とんと見ない[ font color=’red’ ]を使っているところがポイント

  • PowerShell
$members = [string[]]("渕上", "山本", "武田"); # くじ引きメンバーを定義
$hitMemberKey = Get-Random $members.Length     # 配列の要素数を最大としてランダム数を取得
echo "### くじ引きツール ###"
echo ("当選者は" + $members[$hitMemberKey] + "さんです!")
echo "このツールは以下のメンバーからランダムで1人選んでます。"
echo (($members -join ",") + "(計" +  $members.Length  + "名)" )

こんな簡単な機能なら全然余裕です。
基本的にはphpとほぼ同じような組み方で大丈夫
-joinがphpにおけるimplodeなのが興味深い

本当にさわりではありましたがwindowsでもスクリプト組んだりする事ができる事が分かっていただけたかと思います。
これを機にちょっとPowerShellを触ってみてはいかがでしょうか!

参考資料