はじめに
前回、別ファイルのPowerShell Scriptの実行について試しましたが、そういえばスコープとか、参照元と参照先の関数名が重複したらどうなんだろうか?と思いました。
少し調べてみたのですが、ぱっと見では見つかりませんでした。
そこで、単一ファイル内で関数の重複を試してみることにしました。
試した結果、納得!となりました。
今回実施する内容
一つのファイルに同一の関数名で関数を作成するとどうなるかを試します。
ソースコード(Git Hub)
PowerShell_06_SameFunctionName
環境
OS: Windows 10 JP (64bit)
PowerShell version: 5.1.19041.1
参考
PowerShell 第5回 他のPowerShell Scriptを実行
PowerShell Scriptから他のPowerShell Scriptを実行する方法を紹介しています。
用語
同一関数の動き
一つのファイルに同一関数を記載します。それを実行するとどうなるでしょうか?
ソースコード
function ShowMessage {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$Message
)
Write-Host "1番目の関数:" -NoNewline
Write-Host $Message
}
function ShowMessage {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$Message
)
Write-Host "2番目の関数:" -NoNewline
Write-Host $Message
}
function ShowMessage {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$Message
)
Write-Host "3番目の関数:" -NoNewline
Write-Host $Message
}
try {
ShowMessage("同一関数が三つあります。")
} catch {
Write-Host $Error[0]
}
動作結果
3番目の関数:同一関数が三つあります。
最後に記載した3番目の関数が実行されました。
エラーが出るのではないか?と思っていたので、動作して驚きました。
が、これが動作するということは、同じ関数を定義すると上書きしているってことですね。
そうか!Shellだから、コマンドを順に実行する動作なのねと。
ということでそれを確認するために、次の実験です。
同一関数の動き2(関数と関数の間に実行文を書く)
一つのファイルに同一関数を記載します。
関数定義と関数定義の間にその関数を実行します。実行するとどうなるでしょうか?
ソースコード
function ShowMessage {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$Message
)
Write-Host "1番目の関数:" -NoNewline
Write-Host $Message
}
ShowMessage("同一関数が三つあります。")
function ShowMessage {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$Message
)
Write-Host "2番目の関数:" -NoNewline
Write-Host $Message
}
ShowMessage("同一関数が三つあります。")
function ShowMessage {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$Message
)
Write-Host "3番目の関数:" -NoNewline
Write-Host $Message
}
try {
ShowMessage("同一関数が三つあります。")
} catch {
Write-Host $Error[0]
}
動作結果
1番目の関数:同一関数が三つあります。
2番目の関数:同一関数が三つあります。
3番目の関数:同一関数が三つあります。
思った通り、順番に実行されています。関数名は同じですが、その直前に定義されている関数が実行されています。
おわりに
わかってしまえば納得の結果でした。
が、VB ScriptとかJava Scriptとかを多くやってきた身としては、ちょっと戸惑いました。
PowerShellの基本中の基本なんでしょうけど。
ということで、次回は、別ファイルに同一関数がある場合について記載したいと思います。
まあ、すでに答えはわかってしまいましたが、独特な記載も少しあるようなので、それらもメモしておこうと思います。