Wednesday, May 21, 2008

スクリプトファイルでの引数(PowerShell 入門)で、Paramキーワードを使用した引数の受け取りについて説明しました。

実はParamキーワードを使用しなくても、実行時に引数を渡し、受け取ることができます。

それには、自動変数 $args を使用します。

下記は、スクリプト実行時に渡された引数の値をコンソールに表示するという簡単なスクリプトです。ExArgs1.ps1として保存してください。

Write-Host $args

このスクリプトを下記のようにして、実験してみましょう。

PS > ./ExArgs1.ps1 "HIRO"
HIRO

実行時に渡した値は、$argsに代入されるので、結果として渡した値が表示されます。

実はこの$args変数は、複数の値を受け取ることが可能で、複数の値を受け取った場合は配列変数となります。

下記のスクリプトで実験してみましょう。ExArgs2.ps1として保存してください。

foreach ( $a in $args )
{
	Write-Host $a
}

このスクリプトを下記のようにして、実験してみましょう。

PS > ./ExArg2.ps1 "HIRO" "PowerShell"
HIRO
PowerShell

$args変数は複数の値を取得できることがおわかりいただけたでしょうか? このように、paramキーワードを使用しなくても値を受け取ることができます。

では、paramと$argsの2つを同時に使用したら、どうなるでしょうか?

下記のスクリプトで実験してみましょう。ExArgs3.ps1として保存してください。

param ($a)
Write-Host ("Paramで受け取った値 " + $a)
Write-Host ("`$argsで受け取った値 " + $args[0])

実行時に、ExArg3.ps1に値を一つだけ渡してみましょう。この結果は、下記の通りparamの引数$aに値を受け取っています。

PS > ./ExArg3.ps1 "HIRO"
Paramで受け取った値 HIRO
$argsで受け取った値

では実行時に、ExArg3.ps1に値を二つ渡した場合はどうなるでしょうか?この結果は、下記の通りでparamの引数$aには最初の値"HIRO"が、$argsにはParamで受けきれなかった値"PowerShell"が代入されます。

PS > ./ExArg3.ps1 "HIRO" "PowerShell"
Paramで受け取った値 HIRO
$argsで受け取った値 PowerShell

PowerShellでのparamと$argsの性質について理解しておくことをおすすめします。

Wednesday, May 21, 2008 10:25:17 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [4]  |  Trackback
Thursday, May 22, 2008 1:22:27 AM (Tokyo Standard Time, UTC+09:00)
うーむ、これってしっくりこないですねえ。
まあparamを使ったときは$argsを使わなければ
いい話ですが、それにしても道理に合いませんね。
Thursday, May 22, 2008 8:10:08 AM (Tokyo Standard Time, UTC+09:00)
どう使い分けるかがポイントですね。
私個人としては、paramを使用しており、$argsを使用することはまずないです。
(paramをおすすめしているわけではありません)
自分が定義した引数に値が入っていないと気持ちが悪いですから。

「paramで受け取れなかったもの」が$argsに入るのは個人的にしっくりきません。
paramと同時に使用して場合でも、引数として渡した値のすべてが入ってくれれば納得いくんですが...
Friday, May 23, 2008 12:04:26 AM (Tokyo Standard Time, UTC+09:00)
知らなかった、てっきり $Args には常に全ての引数が入っているもんだと思ってました。

> 私個人としては、paramを使用しており、$argsを使用することはまずないです。
僕も $Args は基本的に使用しない派です。
ただ、関数を ScriptBlock.Invoke メソッドで実行する場合やイベントハンドラとして使用する場合は、param だと引数が入ってこないので $Args を使うしかないですね。。。

Friday, May 23, 2008 8:09:02 AM (Tokyo Standard Time, UTC+09:00)
>知らなかった、てっきり $Args には常に全ての引数が入っているもんだと思ってました。
自分も最初はそうだと思い込んでいました(汗

>ただ、関数を ScriptBlock.Invoke メソッドで実行する場合やイベントハンドラとして使用する場合は、param だと引数が入ってこないので $Args を使うしかないですね。。。

そうですね、やはり使い分けはケースバイケースといったところですね

Comments are closed.

Theme design by Jelle Druyts

Pick a theme: