Windows PowerShell 入門(7)-関数編2
この連載では、Microsoftが提供している新しいシェル、Windows Power Shellの使い方を解説します。前回に引き続きPowerShellにおける関数の取り扱いとして、変数と関数のスコープ、プロファイルの登録、パイプライン処理などについて取り上げます。
はじめに
この連載では、Microsoftが提供している新しいシェル「Windows Power Shell」の使い方を解説します。今回は、関数をファイルに作成する方法、関数のプロファイルへの登録方法、パイプライン引数、begin/process/endについて説明します。
対象読者
- Windows PowerShellでコマンドレット操作ができる方
- 何らかのプログラミング経験があればなお良い
必要環境
- Windows PowerShell
関数をファイルに作成する
PowerShellの関数をファイルに作成するには、テキストエディタがあれば十分です。
まずは、テキストエディタを開いて下記のように入力し、「MyFunction.ps1」として保存してください(説明の都合上、「C:\Work」に保存するものとします)。
function funcA
{
Write-Host "funcAです"
}
では、この「MyFunction.ps1」にあるfuncA
を実行するにはどうしたらよいでしょうか?
1つの方法としては、この「MyFunction.ps1」に下記のように1行追加すると関数funcA
を呼び出すことになります。
function funcA
{
Write-Host "funcAです"
} funcA #この行を追加することでfuncAを呼び出す
この「MyFunction.ps1」は function funcA { ~ }
までが関数の定義で、ファイルにこの部分が書かれているだけでは実行されません。関数を実行するには、最後に追加した行のように、関数を呼び出す必要があります。
「MyFunction.ps1」はfuncA
を呼び出すように1行追加したので、下記のようにすれば、funcA
が実行されることとなります(PowerShell入門(3) スクリプト編の「スクリプトファイルの実行とセキュリティ」を参照ください)。
PS C:\Work> ./MyFunction.ps1
funcAです
では、この関数をコマンドラインから、コマンドレットであるかのように関数名を指定するだけで呼び出すにはどうしたら良いでしょうか?
「C:\Work」の下に「MyFunction.ps1」がある状態で、関数名を記述して[Enter]を押すと、
PS C:\Work> funcA
用語 'funcA' は、コマンドレット、関数、操作可能なプログラム、またはスクリプト ファイルと
して認識されません。用語を確認し、再試行してください。
発生場所 行:1 文字:5
+ funcA <<<<
のようにエラーが表示され実行することができません。関数名を記述するだけではだめなようです。
では、いったいどのようにすればよいでしょうか?
実は、コマンドラインから直接関数を呼び出すには、関数名の先頭にglobal修飾子が必要です。「MyFunction.ps1」を下記のように修正してください。
function global:funcA
{
Write-Host "funcAです"
}
そして関数を使用するために、下記のようにしてPowerShellに関数を登録します。
PS C:\Work> ./MyFunction.ps1
PS C:\Work>
これで準備はOKです。後は下記のように、コマンドラインで関数名を記述すれば実行されます。
PS C:\Work> funcA
funcAです
このようにして登録を行った関数はGet-ChildItem
コマンドレットで確認することができます。
PS C:\Work> Get-ChildItem function: CommandType Name Definition
----------- ---- ----------
Function prompt 'PS ' + $(Get-Location) + $(if ($...
Function Clear-Host $spaceType = [System.Management.A...
:
:長いので省略
:
Function funcA Write-Host "funcAです"...
実は、この方法で登録した関数はPowerShellを終了すると無効になってしまいます。ということで、次はこの問題を解決する方法について説明したいと思います。
関数をプロファイルに登録する
PowerShellコンソール上で直接入力して作成した関数は、PowerShellコンソールを閉じてしまうと利用できなくなります。この問題は、関数をプロファイルに登録することで解決することができます。
まずは、プロファイルについて説明します。プロファイルはPowerShell起動時に1度だけ読み込まれる特別なスクリプトファイルです。このファイルは、あらかじめパスが決まっており、$Profile
という自動変数に格納されています。
試しにコマンドラインで$Profile
を確認してみましょう(表示されるパスはお使いの環境によって異なります)。
PS > $Profile
C:\Users\HIRO\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
コマンドラインで下記のように入力し、メモ帳でプロファイルを開いてみましょう。
PS > Notepad $Profile
後は、下記のように入力して、先ほど確認したパス(ここでは「C:\Users\HIRO\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1」)に保存します。
function funcA
{
Write-Host "funcAです"
}
保存が終わったら、PowerShellを再起動し、funcA
を実行してみましょう。
PS > funcA
funcAです
このように、プロファイルに関数を記述すると、毎回PowerShellに関数を手動で登録する必要がなくなります(スクリプトの実行にはセキュリティ設定が必要ですので、動作しない場合は「関連記事 Windows PowerShell 入門(3)-スクリプト編」を参考に設定してください)。
しかし、多数の関数を「Microsoft.PowerShell_profile.ps1」に記述するのはメンテナンスが大変です。
これを解決する方法としてよこけんさんのサイトの「プロファイル活用」でスマートな方法が紹介されています(よこけんさんの承諾を得て掲載しております。よこけんさん、ありがとうございます)。実は、筆者自身もこの方法を採用していて、関数の管理が容易になります。
ただし、1点だけ注意してもらいたいことがあります。それは、プロファイルに記述する関数はスコープを指定しなくても問題ありませんが、ファイルに記述する関数はglobal
スコープが必要であるということです。
先ほどのfuncA
を「MyFunction.ps1」というファイルにグローバルスコープを付けて保存する場合は、
function global:funcA
{
Write-Host "funcAです"
}
とします。
パイプライン引数
PowerShellでの関数は、パイプラインからの値を受け取ることが可能です。パイプラインからの渡された値は$input
という自動変数に格納されます。
まずは、コンソールで下記の通り入力し、pipe-func1
という関数をPowerShellに登録しましょう。
PS > function pipe-func1
>> {
>> foreach ($a in $input)
>> {
>> Write-Host $a
>> }
>> }
>>
この関数は、パイプラインで受け取った値をforeach
で1つずつ取り出し表示するという単純な関数です。
次のようにして、この関数を実験してみてください。
PS > 1..10 | pipe-func1
1
2
3
4
5
6
7
8
9
10
1..10
というのは、1から10までを表します(Windows PowerShell 入門(4)-変数と演算子の範囲演算子を参照ください)。結果としてこの関数は、$input
に1から10までの数値を受け取り、その値を表示します。
もう1つ実験してみましょう。
PS > "apple","banana","orange" | pipe-func1
apple
banana
orange
こちらは"apple"
,"banana"
,"orange"
という3つの値が$input
に渡され、結果その値を表示します。
begin, process, end
PowerShellでは、パイプラインで受け取った値を処理する方法にbegin
/process
/end
というものが存在します。まずは、下記スクリプトを入力してください。
PS > function f
>> {
>> begin { $local:cnt = 1 }
>> process { ("$local:cnt:$_"); $local:cnt += 1 }
>> end { $local:cnt }
>> }
>>
このスクリプトには、begin
/process
/end
がありますが、パイプラインから値を受け取ると
begin {最初の1回だけ実行}
process {パイプラインで受け取った値ごとに実行}
end {最後に1回だけ実行}
という動作をします。
つまり、先ほど入力した関数f
は、
- 最初にローカル変数
cnt
を1で初期化 - パイプラインから受け取った値(
$_
に値が代入されている)を表示し、ローカル変数をインクリメント - 最後にローカル変数の現在値を表示
ということを行います。
先ほど、パイプライン引数の値は$input
自動変数に入ることを説明しました。process
節でパイプラインの値を取得する場合は$_
自動変数となりますので、使用には注意してください。
実際に、この関数にパイプラインから値を渡してみましょう。
PS > "apple","banana","orange" | f
1:apple
2:banana
3:orange
4
パイプラインからの値を処理する際、前処理と後処理を行いたい場合は、ぜひ使用してみてください。
まとめ
今回は、前回に引き続きPowerShellでの関数の取り扱いを取り上げ、次の内容について解説しました。
- 関数をファイルに作成する
- 関数をプロファイルに登録する
- パイプライン引数
- begin, process, end
次回もPowerShellでの関数の取り扱いについて取り上げると共に、変数のスコープについても説明したいと思います。
Windows PowerShell 入門(7)-関数編2的更多相关文章
- 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 入門(6)-関数編1
この連載では.Microsoftが提供している新しいシェル.Windows Power Shellの使い方を解説します.今回は.関数の作成基礎と引数.戻り値.Switchパラメータについて説明します. ...
- 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 ...
随机推荐
- Ansible Callback
非api模式下自定义callback ansible.cfg中开启callback功能 callback_plugins = /usr/share/ansible/plugins/callback # ...
- Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码
Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习MapReduce时的一些 ...
- 【c++】编译器为我们实现了几个类成员函数?
#include <cassert> #include <complex> #include <iostream> class Empty{}; Empty e; ...
- 安装Blend+SketchFlow Preview for Visual Studio 2012出现错误
安装Blend+SketchFlow Preview for Visual Studio 2012出现如下错误: 首先是这个网址:http://msdn.microsoft.com/en-us/exp ...
- DataTabe使用Linq实现 Group
DataTable dt = dataSet.Tables[]; var query = from t in dt.AsEnumerable() group t by new { t1 = t.Fie ...
- 21.Buffer Pool与压缩页/CheckPoint/LSN
一. 思考题解析• 查看Buffer Pool中的Flush List不要在线上操作该SQL语句,开销较大 SELECT pool_id, lru_position, space, page_numb ...
- 微信小程序开发(6) SSL证书及HTTPS服务器
1. 域名 在万网购买,略 2. 云服务器 阿里云购买,略 3. 安装lnmp 使用lnmp.org程序,略 4. 申请证书 阿里云-管理控制台-安全(云盾)-证书服务-购买证书证书类型: 免费型DV ...
- MySQL的一些基本命令笔记(2)
1.逻辑运算符的补充 between 的用法:(在....之间) select column1,column2,......columnN from 表名 where columnX between ...
- Creating A Moddable Unity Game
前言: 对游戏进行修改与拓展(MOD)是我一直以来感兴趣的东西,我的程序生涯,也是因为在初中接触到GBA口袋妖怪改版开始的,改过也研究过一些游戏的MOD实现方式,早就想在自己的游戏中实现“MOD系统” ...
- CMD之入门篇
本博文最早是记录在本地电脑的,由于清理电脑的缘故,顺便将这篇笔记转移到公共博客,以便日后查阅和快速上手使用. 开门见山,步入正题,以下是Windows系统的常用CMD命令. 一 文件系统操作 0.[脚 ...