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 |