この連載では、Microsoftが提供している新しいシェル、Windows Power Shellの使い方を解説します。前回に引き続きPowerShellにおける関数の取り扱いとして、変数と関数のスコープ、プロファイルの登録、パイプライン処理などについて取り上げます。

はじめに

 この連載では、Microsoftが提供している新しいシェル「Windows Power Shell」の使い方を解説します。今回は、関数をファイルに作成する方法、関数のプロファイルへの登録方法、パイプライン引数、begin/process/endについて説明します。

対象読者

  • Windows PowerShellでコマンドレット操作ができる方
  • 何らかのプログラミング経験があればなお良い

必要環境

  • Windows PowerShell

関数をファイルに作成する

 PowerShellの関数をファイルに作成するには、テキストエディタがあれば十分です。

 まずは、テキストエディタを開いて下記のように入力し、「MyFunction.ps1」として保存してください(説明の都合上、「C:\Work」に保存するものとします)。

MyFunction.ps1
function funcA
{
Write-Host "funcAです"
}

 では、この「MyFunction.ps1」にあるfuncAを実行するにはどうしたらよいでしょうか?

 1つの方法としては、この「MyFunction.ps1」に下記のように1行追加すると関数funcAを呼び出すことになります。

MyFunction.ps1に1行追加
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」を下記のように修正してください。

global修飾子をつけたfuncA
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」というファイルにグローバルスコープを付けて保存する場合は、

MyFuntion.ps1
function global:funcA
{
Write-Host "funcAです"
}

 とします。

パイプライン引数

 PowerShellでの関数は、パイプラインからの値を受け取ることが可能です。パイプラインからの渡された値は$inputという自動変数に格納されます。

 まずは、コンソールで下記の通り入力し、pipe-func1という関数をPowerShellに登録しましょう。

pipe-func1
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は、

  1. 最初にローカル変数cntを1で初期化
  2. パイプラインから受け取った値($_に値が代入されている)を表示し、ローカル変数をインクリメント
  3. 最後にローカル変数の現在値を表示

 ということを行います。

 先ほど、パイプライン引数の値は$input自動変数に入ることを説明しました。process節でパイプラインの値を取得する場合は$_自動変数となりますので、使用には注意してください。

 実際に、この関数にパイプラインから値を渡してみましょう。

PS > "apple","banana","orange" | f
1:apple
2:banana
3:orange
4

 パイプラインからの値を処理する際、前処理と後処理を行いたい場合は、ぜひ使用してみてください。

まとめ

 今回は、前回に引き続きPowerShellでの関数の取り扱いを取り上げ、次の内容について解説しました。

  • 関数をファイルに作成する
  • 関数をプロファイルに登録する
  • パイプライン引数
  • begin, process, end

 次回もPowerShellでの関数の取り扱いについて取り上げると共に、変数のスコープについても説明したいと思います。

Windows PowerShell 入門(7)-関数編2的更多相关文章

  1. Windows PowerShell 入門(3)-スクリプト編

    これまでの記事 Windows PowerShell 入門(1)-基本操作編 Windows PowerShell 入門(2)-基本操作編 2 対象読者 Windows PowerShellでコマンド ...

  2. Windows PowerShell 入門(2)-基本操作編 2

    前回に引き続きMicrosoftが提供している新しいシェル.Windows Power Shellの基本操作方法を学びます.基本操作編第2弾の今回は.パイプの使用方法を中心としたコマンドレットの操作方 ...

  3. Windows PowerShell 入門(8)-関数編3

    この連載では.Microsoftが提供している新しいシェル.Windows PowerShellの使い方を解説します.今回は.フィルタ.スクリプトブロック.変数のスコープについて取り上げます. はじめ ...

  4. Windows PowerShell 入門(6)-関数編1

    この連載では.Microsoftが提供している新しいシェル.Windows Power Shellの使い方を解説します.今回は.関数の作成基礎と引数.戻り値.Switchパラメータについて説明します. ...

  5. Windows PowerShell 入門(10)-デバッグ編

    対象読者 Windows PowerShellでコマンドレット操作ができる方 何らかのプログラミング経験があればなお良い 必要環境 Windows PowerShell デバッグメッセージの出力 Po ...

  6. Windows PowerShell 入門(9)-エラー編

    対象読者 Windows PowerShellでコマンドレット操作ができる方 何らかのプログラミング経験があればなお良い 必要環境 Windows PowerShell エラーをリダイレクトする リダ ...

  7. Windows PowerShell 入門(4)-変数と演算子

    Windows PowerShellにおける変数と演算子の使用方法について学びます.今回は代表的な演算子として.算術演算子.代入演算子.論理演算子.比較演算子.範囲演算子.置換演算子.ビット演算子.型 ...

  8. Windows PowerShell 入門(1)-基本操作編

    Microsoftが提供している新しいシェル.Windows Power Shellの基本操作方法を学びます.インストール.起動終了方法.コマンドレット.命名規則.エイリアス.操作方法の調べ方について ...

  9. Windows PowerShell 入門(5)-制御構文

    Windows PowerShellにおける制御構文について学びます.数ある制御構文の中でもSwitch文は.他の言語に比べ豊富な機能が用意されています. 対象読者 Windows PowerShel ...

随机推荐

  1. 入侵检测中需要监控的注册表路径研究(Windows Registry Security Check)

    1. Windows注册表简介 注册表(Registry,繁体中文版Windows称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息.早在Wind ...

  2. Centos 7最小化InfluxDB部署

    配置源 [influxdb] name = InfluxDB Repository - RHEL \$releasever baseurl = https://repos.influxdata.com ...

  3. Mac下显示网页全屏快捷键

    control+command+F mac下谷歌浏览器全屏时隐藏头部:(隐藏标签页和地址栏) command+shift+B

  4. Sidetiq 定时任务

    class SidekiqCreateMonthPlanWorker #定时自动生成下月计划 include Sidekiq::Worker include Sidetiq::Schedulable ...

  5. Golang入门教程(三)beego 框架安装

    beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API.Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornado.sinatra ...

  6. 未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker

    昨晚遇到的这个问题,也知道Notifications service依赖底层的Service broker的.本以为只需要执行以下脚本对数据库启用Service broker即可. alter dat ...

  7. IIS回收时间设置

    IIS默认回收时1740分钟,这样的话,有可能在访问高峰期时时回收,可以设置为定时回收

  8. SpringBoot入门笔记(三)、热加载

    1.配置热加载环境,在pom.xml添加如下代码 <build> <!--springloader plugin --> <plugins> <plugin& ...

  9. 十一、移植优化---CONFIG 优化进 menuconfig(2)

    11.3 jz2440.h 中的剩余宏移植 11.3.1 CONFIG_SYS_TEXT_BASE CONFIG_SYS_TEXT_BASE:设置系统代码段的基地址,设为 0x0:menuconfig ...

  10. fail2ban 防爆破,防止CC 攻击

    fail2ban fail2ban监视检测日志文件,根据匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作. 可用来放置爆破 和 CC 攻击. 安装: yum install fail2ban -y ...