プロジェクト

全般

プロフィール

PowerShellについて » 履歴 » バージョン 6

sylow castle, 2019/03/13 18:12

1 1 sylow castle
# PowerShellについて
2
3
## 概要
4
5
ボスがPowerShellで詰まっていたので自分なりの理解を説明するための記事
6
PowerShellを知らない人が以下の記事の「Code」を理解できるようになるのを目的にする:
7
PowerShell でウインドウの位置と大きさを指定
8
https://qiita.com/yumura_s/items/f6fa9dbeb5c6c4b6e4fb
9
10
## 読めない
11
12
独特な書き味があって知らないと辛いことが多い。
13
シェルスクリプトの一種だと意識すると読みやすくなるかも。(でも中身の仕組み的には結構違うっぽい(後述))
14
パイプを通して各コマンドにデータを一つずつ渡していくような考え方は近いと思う
15
16
### コツ
17
18 2 sylow castle
上記記事のコードの場合、以下を意識すると良いかな。
19
20
* 「fileter」は「function」と読み替える。実際、filterは特殊なfunctionでしかない。
21 1 sylow castle
* %はforeachと読む。パイプで渡された各オブジェクトに対し{}ブロック内の処理を実行する
22
* C#のコードは無視する。それでもやりたいことは分かる。
23
* 各コマンドはオブジェクトが渡され、オブジェクトを出力
24 2 sylow castle
* 変数やリテラルだけの行は「Write-Output 変数やリテラル」と読む。$rc2は「Write-Output $rc2」と読む。Write-Outputは後述。
25 1 sylow castle
26 4 sylow castle
上記記事に書かれている「Code」は関数の定義だけ書かれてる感じになる。
27
bashでスクリプトをインクルードするときの同じく「. psスクリプト」で実行してあげたら、現在のコンテキストで実行してくれるので関数のインクルードがされる。
28 1 sylow castle
29
## PowerShellの気持ち
30
31
### bashと比較
32
33
bashの場合はパイプを通して各コマンドに文字列が渡されて、各コマンドが改行で区切って1つのレコードと処理してる感じ。
34
PowerShellの場合は、コマンドや関数がパイプというキューからデータ一個取り出して、処理したデータを後続のパイプ(キュー)に出している感じ。
35
一つの長大な文字列をパースしながら処理単位を切り出しているのがbashだけど、PowerShellの場合シェル側で各データを分けて考えられてるのは大きな違い。
36
37
ただ、どちらも各コマンド・コマンドレットは、1つの単位でデータを処理して後続に渡しているイメージは共通だと思う。
38
39
### Write-Outputと省略
40
41
Write-Outputコマンドレットは後続のパイプに出力する関数。
42 3 sylow castle
また、上の「コツ」に書いた通り「変数」だけ書かれた行は「Write-Output 変数」となり、パイプに出力をしていることになる。
43
この書き方のおかげでPowerShellの関数(function、filter)は、「引数をもらって値を一つ返す」という通常の言語の「関数」ではなくて、
44
パイプからデータ取り出して後ろのパイプにデータを垂れ流していく存在と考えるほうが近い気がする。
45
PowerShellにおいて「return」は処理を止める程度の意味合いしかない。
46 1 sylow castle
47
### Out-Nullコマンドレット
48
49
「Out-Null」はbashでいう/dev/nullへのリダイレクトのようなイメージ、出力したオブジェクトはその流れから消滅する。
50
51
### %とforeach
52
53
```
54
%{Get-WindowRect $_.Name}
55
```
56
で書かれている$_はコマンドレットが受け取ったオブジェクト1個を表す変数。
57
まとめて扱う訳じゃなくて一個一個に対して処理をしている。
58
59
#### 行き場のないオブジェクト
60
61
パイプから入って次のパイプに出していると考えると、最後のコマンドから出力されるオブジェクトは行き場がなくなる。
62 5 sylow castle
行き場がないオブジェクトは実行してコンソールに出力される。
63
デフォルトの行先がコンソールになるだけなので、パイプに出力せずコンソールに出力することは可能(それがWrite-Hostコマンドレット)
64 1 sylow castle
65
## 仕様
66
67
### function
68
69
PowerShellの関数は3つの処理ブロックを持つ。各オブジェクトが渡される前後に一度だけ実行されるBegin、Endブロックと各オブジェクトに対して実行されるProcessブロック。
70
filterはProcessブロックだけからなるfunctionになります。
71 6 sylow castle
72
### ExecutionPolicy
73
74
PowerShellスクリプトはデフォルトだと実行できません。繰り返します、デフォルトだと実行できません。
75
安全のため設定を変更する必要があります。確認は
76
77
```
78
Get-ExecutionPolicy
79
```
80
81
とりあえずローカルのものを動かせるようにするには、管理者権限でpowershell.exeを起動して以下のコマンドを打つ。
82
83
```
84
Set-ExecutionPolicy RemoteSigned
85
```
86
87
と思っていましたがそうでもないようです。
88
powershell.exeの起動時にオプションで「-ExecutionPolicy RemoteSigned」とか打ってあげればそのPowerShellプロセスだけRemoteSignedな権限で動かせるらしい。
89
90
より詳しくはこちら:
91
https://qiita.com/kikuchi/items/59f219eae2a172880ba6