private knowhow
修订版 | 968eb211b9bcac38d43c316fd4092807c7ecd349 (tree) |
---|---|
时间 | 2014-01-25 18:30:35 |
作者 | oga <hyperoga@gmai...> |
Commiter | oga |
2014/01/25 add Win PowerShell Knowhow Ver0.01
@@ -0,0 +1,283 @@ | ||
1 | +Power Shellノウハウ | |
2 | + | |
3 | +1. 基本 | |
4 | +(1)PowerShellスクリプトの拡張子 *.ps1 | |
5 | +(2)*.ps1の実行を許可する | |
6 | +PS > Set-ExecutionPolicy RemoteSigned | |
7 | + | |
8 | +実行ポリシー 概要 | |
9 | +Restricted すべてのスクリプトを実行不可 | |
10 | +AllSigned すべてのスクリプトに証明書を要求 | |
11 | +RemoteSigned インターネット経由でダウンロードしたスクリプトのみ証明書を要求 | |
12 | +Unrestricted すべてのスクリプト実行を許可(ただしインターネット経由でダウンロードしたコードは実行確認のみあり) | |
13 | + | |
14 | +(3)予約変数 | |
15 | +$_ :(パイプライン経由で渡されたオブジェクト) | |
16 | + | |
17 | + 関数に渡された名前なし引数は自動変数$Args(配列)に登録されるので、 | |
18 | + あとは「$Args[0]」のように指定することで、与えられた引数値にアクセス | |
19 | + することができる。 | |
20 | + なおJavaScriptなどの言語に慣れている方は、自動変数$Argsには関数に | |
21 | + 渡されたすべての引数値(名前付き引数/名前なし引数の双方)が含まれ | |
22 | + るように思われるかもしれないが、PowerShellではあくまで名前なし引数 | |
23 | + だけしか含まれない。 | |
24 | + | |
25 | +(4)スコープ | |
26 | + スクリプト内の関数をスクリプト外から利用する場合 | |
27 | + 「global:」を付加する。スクリプト実行後PSプロンプトから | |
28 | + 関数を利用できる。 | |
29 | + bashで. <script>を行ったのと同じ効果 | |
30 | + | |
31 | +PS> cat tri.ps1 | |
32 | +function global:Triangle([double] $width=1, [double] $height=1) { | |
33 | + return $width * $height / 2 | |
34 | +} | |
35 | + | |
36 | +PS> ./tri.ps1 | |
37 | +PS> Triangle 6 2 (コールできる) | |
38 | + | |
39 | + | |
40 | +(5)プロファイル | |
41 | + (a)全ユーザ共通プロファイル | |
42 | +「C:\WINDOWS\SYSTEM32\windowspowershell\v1.0」フォルダ配下にprofile.ps1 | |
43 | + という名前でスクリプト・ファイルを配置しておく。 | |
44 | + これによってPowerShellの起動時にProfile.ps1が自動実行され、 | |
45 | +(例えば)関数やエイリアスの登録を行うことができる(*)。 | |
46 | + | |
47 | +* なお、profile.ps1の内容はすべてグローバル・スコープで登録される。 | |
48 | +従って、明示的にスコープ修飾子によるスコープ宣言を行う必要はない。 | |
49 | + | |
50 | + (b)ユーザ固有プロファイル | |
51 | + 「C:\Documents and Settings\<ユーザー名>\My Documents\WindowsPowerShell」 | |
52 | + フォルダにprofile.ps1を配置 | |
53 | + | |
54 | +2. 各仕様 | |
55 | +(1)引数の受け取り | |
56 | + | |
57 | +Param([string] $name) | |
58 | +Write-Output "こんにちは、 $name さん!" | |
59 | + | |
60 | +PS > ./Hello.ps1 "山田" | |
61 | +こんにちは、 山田 さん! | |
62 | +PS > ./Hello.ps1 -name "山田" | |
63 | +こんにちは、 山田 さん! | |
64 | + | |
65 | +(2)コメント | |
66 | +# | |
67 | + | |
68 | + | |
69 | +(3)変数 | |
70 | + $var | |
71 | + ${var} | |
72 | + | |
73 | +(4)データ型 | |
74 | + データ型はないが明示することもできる | |
75 | + [System.Int32] $x = 10 | |
76 | + | |
77 | +型名にはエイリアスが用意されている。 | |
78 | +エイリアス .NET Frameworkの型名 | |
79 | +byte System.Byte | |
80 | +int System.Int32 | |
81 | +long System.Int64 | |
82 | +single、float System.Single | |
83 | +double System.Double | |
84 | +decimal System.Decimal | |
85 | +char System.Char | |
86 | +bool System.Boolean | |
87 | +string System.String | |
88 | +array System.Array | |
89 | +xml System.Xml.XmlDocument | |
90 | +type System.Type | |
91 | +PowerShellの型エイリアス | |
92 | + | |
93 | +(5)標準出力 | |
94 | +PS > Write-Output "私の名前は $name です。" | |
95 | +私の名前は 山田 です。 | |
96 | +PS > Write-Output '私の名前は $name です。' | |
97 | +私の名前は $name です。 | |
98 | + | |
99 | +(6)エスケープシーケンス | |
100 | +エスケープ文字は\ではなく`(バッククォート) | |
101 | + | |
102 | +エスケープ・シーケンス 概要 | |
103 | +`b バックスペース | |
104 | +`n 改行 | |
105 | +`r キャリッジ・リターン | |
106 | +`t タブ | |
107 | + | |
108 | +(7)ヒアドキュメント | |
109 | +PS > $body=@" | |
110 | +>> こんにちは、WINGSの山田です。 | |
111 | +>> PowerShellの世界をご一緒に楽しみましょう。 | |
112 | +>> "@ | |
113 | +>> ……ここで[Enter]キーのみを入力して終了する | |
114 | + | |
115 | +PS > Write-Output $body | |
116 | +こんにちは、WINGSの山田です。 | |
117 | +PowerShellの世界をご一緒に楽しみましょう。 | |
118 | + | |
119 | +「@"<改行>〜<改行>"@」(または「@'<改行>〜<改行>'@」) | |
120 | + | |
121 | +(8)配列と連想配列 | |
122 | +配列 | |
123 | + 要素, 要素, 要素, ... | |
124 | + または、@(要素, 要素, 要素, ...) | |
125 | + 参照 | |
126 | + $変数名[インデックス番号] | |
127 | + | |
128 | +連想配列 | |
129 | + @{キー名=値; キー名=値; ...} | |
130 | + 参照 | |
131 | + $変数名["キー名"] | |
132 | + または、 | |
133 | + $変数名.キー名 | |
134 | + | |
135 | + | |
136 | +PS > $x = 1,2,3 | |
137 | +PS > Write-Output $x[0] | |
138 | +1 ……0番目の要素を出力 | |
139 | + | |
140 | +PS > $z = @{FirstName="Yoshihiro"; LastName="Yamada"; Birth="Shizuoka"} | |
141 | +PS > Write-Output $z["FirstName"] | |
142 | +Yoshihiro ……FirstName要素を出力 | |
143 | +PS > Write-Output $z.FirstName | |
144 | +Yoshihiro ……FirstName要素を出力 | |
145 | + | |
146 | + | |
147 | + | |
148 | +(9)分岐 | |
149 | +$x = 100 | |
150 | +if($x -ge 80){ | |
151 | + Write-Output '変数$xは80以上です。' | |
152 | +}elseif($x -ge 40){ | |
153 | + Write-Output '変数$xは40以上80未満です。' | |
154 | +}else{ | |
155 | + Write-Output '変数$xは40未満です。' | |
156 | +} | |
157 | + | |
158 | +(10)switch | |
159 | +$x = 1 | |
160 | +switch($x){ | |
161 | + 1 {Write-Output '変数$xは1です。'} | |
162 | + 1 {Write-Output '変数$xは1です。その2'} | |
163 | + 2 {Write-Output '変数$xは2です。'} | |
164 | + 3 {Write-Output '変数$xは3です。'} | |
165 | + default {Write-Output '変数$xは1、2、3ではありません。'} | |
166 | +} | |
167 | + | |
168 | +複数マッチをしたくない場合 | |
169 | +switch($x){ | |
170 | + 1 { | |
171 | + Write-Output '変数$xは1です。' | |
172 | + break | |
173 | + } | |
174 | + 1 { | |
175 | + Write-Output '変数$xは1です。(2)' | |
176 | + break | |
177 | + } | |
178 | + 3 { | |
179 | + Write-Output '変数$xは3です。' | |
180 | + break | |
181 | + } | |
182 | + default {Write-Output '変数$xは1、2、3ではありません。'} | |
183 | +} | |
184 | + | |
185 | +$x = "XYZ" | |
186 | +switch -wildcard ($x){ | |
187 | + "X*" {Write-Output '変数$xは"X"で始まります。'} | |
188 | + "X_" {Write-Output '変数$xは"X"+1文字です。'} | |
189 | + "XA*" {Write-Output '変数$xは"XA"で始まります。'} | |
190 | +} | |
191 | + | |
192 | +(11)forループ | |
193 | +$ary=@(100,120,300) | |
194 | +for($i=0; $i -lt 3; $i++){ | |
195 | + $sum += $ary[$i]; | |
196 | +} | |
197 | +Write-Output $sum | |
198 | + | |
199 | +(12)foreach系ループ | |
200 | +$ary=@(100,120,300) | |
201 | +foreach($dat in $ary){ | |
202 | + $sum += $dat; | |
203 | +} | |
204 | +Write-Output $sum | |
205 | + | |
206 | +@(100,120,300) | ForEach-Object {$sum += $_} | |
207 | +Write-Output $sum | |
208 | + | |
209 | + | |
210 | +(13)whileループ | |
211 | +$i=0; | |
212 | +$sum=0; | |
213 | +$ary=@(100,120,300) | |
214 | +while($i -lt 3){ ……変数$iが3未満の場合の間、ループを継続 | |
215 | + $sum += $ary[$i]; | |
216 | + $i++; | |
217 | +} | |
218 | +Write-Output $sum | |
219 | + | |
220 | +$i=0; | |
221 | +$sum=0; | |
222 | +$ary=@(100,120,300) | |
223 | +do{ | |
224 | + $sum += $ary[$i]; | |
225 | + $i++; | |
226 | +}while($i -lt 3) ……変数$iが3未満の場合の間、ループを継続 | |
227 | +Write-Output $sum | |
228 | + | |
229 | +(14)関数 | |
230 | +function Triangle([double] $width=1, [double] $height=1) { | |
231 | + return $width * $height / 2 | |
232 | +} | |
233 | + | |
234 | +型チェックが不要なら型は書かなくてもよい。 | |
235 | +以下の形で引数を受け取ることもできる。 | |
236 | + | |
237 | +function Triangle { | |
238 | + return $Args[0] * $Args[1] / 2 | |
239 | +} | |
240 | + | |
241 | + | |
242 | +<呼び出し> | |
243 | +Triangle 2 6 # 底辺2 高さ6 結果(面積)は 6 と表示される | |
244 | + | |
245 | +Triangle -width 2 -height 6 # という呼び出し方もできる。 | |
246 | + | |
247 | +function 関数名 [(引数[=デフォルト値],...)] { | |
248 | + 関数の本体 | |
249 | + [return 戻り値] | |
250 | +} | |
251 | + | |
252 | + | |
253 | +3. .NET Frameworkクラス・ライブラリの利用方法 | |
254 | +.NET Frameworkが提供するクラスをインスタンス化して、 | |
255 | +スクリプトの中で利用することも可能。 | |
256 | +これによって、スクリプト上でVisual BasicやC#と | |
257 | +限りなく同等の操作を行うことができる | |
258 | + | |
259 | + | |
260 | + | |
261 | + | |
262 | + | |
263 | +(例1)電子メール | |
264 | + # 電子メールのメッセージを作成 | |
265 | +$mail = New-Object System.Net.Mail.MailMessage("あて先@example.jp","送信元@example.co.jp") ……(1) | |
266 | +$mail.Subject = "PowerShellスクリプティング入門" # 件名 | |
267 | +$mail.Body = @" | |
268 | +こんにちは、PowerShell! | |
269 | +PowerShellでスクリプティングに挑戦しましょう。 | |
270 | +"@ # 本文 | |
271 | + # 件名/本文の文字エンコーディング | |
272 | +$mail.SubjectEncoding = [System.Text.Encoding]::GetEncoding("ISO-2022-JP") | |
273 | +$mail.BodyEncoding = [System.Text.Encoding]::GetEncoding("ISO-2022-JP") | |
274 | + # 指定されたSMTPサーバで電子メールを送信 | |
275 | +$smtp = New-Object System.Net.Mail.SmtpClient("smtp.examples.ne.jp") | |
276 | +$smtp.Send($mail) | |
277 | + | |
278 | + | |
279 | + | |
280 | + | |
281 | + | |
282 | + | |
283 | + |