Windows PowerShell 入門(6)-関数編1
この連載では、Microsoftが提供している新しいシェル、Windows Power Shellの使い方を解説します。今回は、関数の作成基礎と引数、戻り値、Switchパラメータについて説明します。
はじめに
この連載では、Microsoftが提供している新しいシェル、Windows Power Shellの使い方を解説します。今回は、関数の作成基礎と引数、戻り値、Switchパラメータについて説明します。
対象読者
- Windows PowerShellでコマンドレット操作ができる方
- 何らかのプログラミング経験があればなお良い
必要環境
- Windows PowerShell
関数の基礎
PowerShellでの関数の基本構文は、
function 関数名 {
処理内容
}
です。このようにして作成した関数は、
関数名[Enter]
と入力して呼び出します。
早速ですが関数を1つ作成してみましょう。コンソールウィンドウで下記のように入力してください。
PS > function Hello {
>> Write-Host "Hello PowerShell World!!"
>> }
>>
上記は関数名がHelloで、呼び出されたらWrite-Hostコマンドレットを使用して"Hello PowerShell World!!"と表示するものです。
では実際にHello関数を使用してみましょう。コマンドラインでHelloと入力し、[Enter]キーを押下してください。
PS > Hello
Hello PowerShell World!!
関数が実行され、"Hello PowerShell World!!"と表示されます。
引数
引数のある関数
引数のある関数の構文は、
function 関数名 (引数1, 引数2, ...引数n) {
処理内容
}
またはparamキーワードを使用して、
function 関数名 {
Param(引数1, 引数2, ...引数n)
}
と書きます。この連載では前者の方で説明していきます。
引数のある関数の例として、足し算をする関数addを作成してみましょう。
PS > function add ($x, $y)
>> {
>> Write-Host ($x + $y)
>> }
>>
この関数は引数$xと$yの2つを持っています。このように複数の引数を持つ関数を実行する場合は、
PS > add 3 5
のようにし、引数に渡す値はスペースで区切ります。
実はこの関数は、
PS > add Code Zine
CodeZine
のように引数に文字列を渡すこともできます。これは引数に型が指定されていないためです。また加算演算子+は文字列の場合は連結を行うため、上記は"CodeZine"と表示されます。
引数の型指定
先ほどの関数addでは、引数の型が指定されていませんでした。今度は、引数に型を指定してみましょう。
PS > function add2 ([int]$x, [int]$y)
>> {
>> Write-Host ($x + $y)
>> }
>>
引数に型を指定するには、上記[int]のように[型]を引数の前に記述します。ここでは、関数add2の引数の型を[int]としました。
この関数に文字列を渡したらどうなるでしょうか?
PS > add2 Code Zine add2 : 値 "Code" を型 "System.Int32" に変換できません。エラー: "入力文字列の形式が正しく
ありません。"
発生場所 行:1 文字:5
+ add2 <<<< Code Zine
引数に型指定([int])を行ったため、文字列は受け取ることができずエラーとなります。
引数の初期値
引数には初期値を与えることが可能です。引数を省略して関数が呼び出された場合に、あらかじめ与えておいた初期値が使用されます。
初期値を与えるには引数を、
変数 = 値
のように記述します。
下記は引数$favoriteに"CodeZine"を与えています。
PS > function MyFavorite ($favorite="CodeZine") {
>> Write-Host ("My favorite is $favorite")
>> }
関数名のみで呼び出すと、
PS > MyFavorite
My favorite is CodeZine
となり、初期値が変数にセットされることが分かります。
先ほどは引数の初期値に定数を与えましたが、式を与えることも可能です。
PS > function Get-Year ([DateTime]$ymd = $(Get-Date)) {
>> Write-Host $ymd.Year
>> }
>>
上記の関数Get-Yearは受け取った引数(年月日)の年のみを表示する関数です。引数が省略された場合は、Get-Dateコマンドレットの結果(実行したときの年月日)が$ymdの初期値となります。
暗黙の引数
ここまでの引数の例は、どのような値をいくつ受け取るかを事前に指定しています。
PowerShellには$argsという自動変数があり、明示的に引数を指定していない関数でも値を受け取ることができます。例として引数のない関数Hello2を作成して$argsの動作を確認したいと思います。
PS > function Hello2 {
>> Write-Host ("こんにちは" + $args + "さん")
>> }
>>
入力が完了したら次のように実行してみましょう。
PS > Hello2 CodeZine
こんにちはCodeZineさん
このように明示的な引数がなくても値を受け取ることができます。
また、$args変数は複数の値を受け取ることができます。関数へ複数の値を渡す場合は、値をスペースで区切ります。
PS > function Test-Args {
>> foreach ( $val in $args )
>> {
>> Write-Host $val
>> }
>> }
>>
上記は受け取った引数すべてを表示するというものです。
試しに
PS > Test-Args "A" "B" "C"
と入力してみてください。
PS > Test-Args "A" "B" "C"
A
B
C
となり、3つの値を$args変数が受け取っていることを確認できます。
$Args以外にも多くの自動変数があります。興味のある方はコマンドラインで
help about_automatic_variables | more
と入力してみてください。
参照渡し
参照渡しをするには、引数の前に[ref]を付けます。
また、関数内部では参照渡しで受け取った値は、
$変数名.value
として使用する必要があります。
下記は、参照渡しのの引数$xと値渡しの引数$yを持つ関数です。この関数は、内部で受け取った引数の値を数値の5で上書きするというものです。
PS > function Test-Ref([ref]$x, $y)
>> {
>> $x.value = 5
>> $y = 5
>> }
>>
この関数を実行したらどうなるか実験してみましょう。
まず、変数$xと$yを準備し、初期値として1を代入しておきます。次に、関数Test-Refを実行するのですが、参照渡しの引数の書き方に注意が必要です。([ref]変数名)のように記述する必要があります。
PS > $x = 1
PS > $y = 1
PS > Test-Ref ([ref]$x) $y
では、この関数の実行結果はどうなったかを確認します。
PS > $x, $y
PS > 5
PS > 1
参照渡しである$xは"5"に書き換わり、$yは関数実行前の値"1"が格納されています。
戻り値
戻り値を設定するにはreturnキーワードを使用します。
下記は、引数で受け取った2つの値を足し算してreturnで返します。
PS > function Add3 ([int]$x, [int]$y)
>> {
>> return $x + $y
>> }
>>
returnで返される値は、下記のようにして変数に代入することができます。
PS > $ret = Add3 3 4
この場合は$retに3 + 4の結果が代入されます。
引数の位置指定
関数呼び出し時に引数名を指定すると、引数の順番を変更することができます。
下記はBMIを計算する関数です。
PS > function BMI($weight, $height) {
>> return $weight / [math]::pow($height,2)
>> }
>>
関数の呼び出しを、
PS> BMI 65 1.75
とした場合は、体重が65kg、身長が1.75mのBMIを求めることになり、結果として21.2244897959184という値が返されます。
これを
PS > BMI -height 1.75 -weight 65
として実行しても同じ結果が返されます。これは、関数呼び出し時に、引数heightには1.75、weightには65を渡すことを明示的に指定しているからです。
このようにPowerShellでは、どの引数に何の値を渡すかを指定することで、引数の順番を変更することが可能です。
BMIは 体重(kg)÷(身長(m)*身長(m)) で求めることができます。
ちなみにBMI 25以上が肥満、22が標準、18以下がやせ です
switchパラメータ
switchパラメータとは、その名の通りスイッチのような役割をする引数です。
PS > function Say-Hello ([switch]$help)
>> {
>> if ( $help )
>> {
>> Write-Host "これはSay-Hello関数の説明です"
>> }
>> else
>> {
>> Write-Host "Hello!!"
>> }
>> }
この関数を、
PS > Say-Hello -help
として呼び出すと、「これはSay-Hello関数の説明です」と表示されます。これは、関数Say-Helloにスイッチ-helpを指定すると、$helpにTrueの値がセットされるためです。
このようにswitchパラメータは、引数に値を渡さずに、パラメータの指定によって処理内容を分岐させたいときに有効です。
まとめ
今回は、次の内容について解説しました。
- 関数の基礎
- 引数の使い方
- 戻り値
switchパラメータ
今回の説明ではコンソールウィンドウで関数を作成しました。次回は関数をファイルとして作成し、利用する方法について解説したいと思います。
Windows PowerShell 入門(6)-関数編1的更多相关文章
- Windows PowerShell 入門(7)-関数編2
この連載では.Microsoftが提供している新しいシェル.Windows Power Shellの使い方を解説します.前回に引き続きPowerShellにおける関数の取り扱いとして.変数と関数のスコ ...
- Windows PowerShell 入門(3)-スクリプト編
これまでの記事 Windows PowerShell 入門(1)-基本操作編 Windows PowerShell 入門(2)-基本操作編 2 対象読者 Windows PowerShellでコマンド ...
- Windows PowerShell 入門(2)-基本操作編 2
前回に引き続きMicrosoftが提供している新しいシェル.Windows Power Shellの基本操作方法を学びます.基本操作編第2弾の今回は.パイプの使用方法を中心としたコマンドレットの操作方 ...
- Windows PowerShell 入門(8)-関数編3
この連載では.Microsoftが提供している新しいシェル.Windows PowerShellの使い方を解説します.今回は.フィルタ.スクリプトブロック.変数のスコープについて取り上げます. はじめ ...
- Windows PowerShell 入門(10)-デバッグ編
対象読者 Windows PowerShellでコマンドレット操作ができる方 何らかのプログラミング経験があればなお良い 必要環境 Windows PowerShell デバッグメッセージの出力 Po ...
- Windows PowerShell 入門(9)-エラー編
対象読者 Windows PowerShellでコマンドレット操作ができる方 何らかのプログラミング経験があればなお良い 必要環境 Windows PowerShell エラーをリダイレクトする リダ ...
- Windows PowerShell 入門(4)-変数と演算子
Windows PowerShellにおける変数と演算子の使用方法について学びます.今回は代表的な演算子として.算術演算子.代入演算子.論理演算子.比較演算子.範囲演算子.置換演算子.ビット演算子.型 ...
- Windows PowerShell 入門(1)-基本操作編
Microsoftが提供している新しいシェル.Windows Power Shellの基本操作方法を学びます.インストール.起動終了方法.コマンドレット.命名規則.エイリアス.操作方法の調べ方について ...
- Windows PowerShell 入門(5)-制御構文
Windows PowerShellにおける制御構文について学びます.数ある制御構文の中でもSwitch文は.他の言語に比べ豊富な機能が用意されています. 対象読者 Windows PowerShel ...
随机推荐
- Windows下的包管理工具-Scoop
关于scoop的介绍 https://www.jianshu.com/p/bb0ba62b519c https://blog.csdn.net/fcymk2/article/details/86653 ...
- layui(九)——flow组件常见用法总结
该模块包含 信息流加载 和 图片懒加载 两大核心支持,无论是对服务端.还是前端体验,都有非常大的性能帮助.下边分别给出了这两种技术的使用方法 一.信息流加载 信息流加载的核心方法时 flow.l ...
- linux 下安装ftp 并远程连接
1.确认是否已安装 ftp 1 pgrep vsftpd #查看ftp 服务进程 无结果如下图所示 2.执行安装 1 yum install vsftpd #安装ftp 服务 3.执行过程 ...
- 【1】Java中double转BigDecimal的注意事项
项目遇到该问题 先上结论:不要直接用double变量作为构造BigDecimal的参数. 线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3. 2,解析JSON并把这 ...
- Nginx 学习笔记(十)介绍HTTP / 2服务器推送(译)
原文地址:https://www.nginx.com/blog/nginx-1-13-9-http2-server-push/ 我们很高兴地宣布,2018年2月20日发布的NGINX 1.13.9支持 ...
- ArcGIS出图调整
上周为了出一张高分辨率的结合表,大致学了一下出图的过程. (1)打开基础数据的图层属性栏,将某一项属性值显示出来,如下图设置: 注意,字体尽量设置得小一点,否则出图的时候,字太大,会很乱. (2)打开 ...
- 我手机上常用的app和常访问的网站
====常用======Opera Mini browser 浏览器(版本26.0.2254.117241以上) 老版本7.7最最经典, 但该版本在新的安卓手机上总有部分区域显示空白. 现在的 Ope ...
- JS中var、let、const区别? 用3句话概括
使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象: 使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升: 使用const声明的是常量,在后面出现的代码中不能再修 ...
- 什么是CMD
cmd是command的缩写.命令提示符是在操作系统中,提示进行命令输入的一种工作提示符.在不同的操作系统环境下,命令提示符各不相同. 在windows环境下,命令行程序为cmd.exe,是一个32位 ...
- 十种MYSQL显错注入原理讲解(三)
这回间隔时间有点长了,年前年后忙的头晕眼花,外加大病.下面我继续讲解. 1.multipolygon() and multipolygon((select * from(select * from(s ...