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