実行中のスクリプトファイルの拡張子を判定することで.ps1と.psm1のハイブリッドスクリプトを作ることが出来ないかと思い試してみました。
<#
.SYNOPSIS
拡張子を指定してファイルを新規作成
.DESCRIPTION
ファイルを新規作成
.EXAMPLE
New-File [-Extention][txt]
.PARAMETER Extension
作成するファイルの拡張子(ドット(.)は含めない)
.LINK
#>
$ErrorActionPreference = "STOP"
function New-File
{
param(
[Parameter(ValueFromPipeline=$false,Mandatory=$false)]
[string[]]
$Extension = "txt",
[switch]
$Force
)
begin {}
process {
$path = (Join-Path (pwd).Path ("new." + $Extension))
if ($Force) {
New-Item -Path $path -Force
} else {
New-Item -Path $path
}
}
end {}
}
if ([System.IO.Path]::GetExtension($PSCommandPath).ToLower() -eq ".ps1") {
# モジュールのインストール(コピー)
$moduleName = [System.IO.Path]::GetFileNameWithoutExtension($PSCommandPath)
$ps1Path = Join-Path ([Environment]::GetFolderPath('MyDocument')) ("WindowsPowerShell\Modules\" + $moduleName)
if (-not (Test-Path $ps1Path)) { mkdir $ps1Path | Out-Null }
cp -LiteralPath $PSCommandPath -Destination (Join-Path $ps1Path ($moduleName+".psm1")) -Force
} else {
# モジュールの公開
Export-ModuleMember -Function New-File
}
まず、ファイル名をNew-File.ps1で保存します。PowerShellのコンソールからNew-File.ps1を実行するとモジュールフォルダにNew-File.psm1としてコピーします。一度PowerShellのコンソールを終了し再度PowerShellのコンソールを起動しNew-File
と入力し実行すると、カレントディレクトリにnew.txtという空のテキストファイルが出来上がります。
実行中のスクリプトファイル名が格納された変数から拡張子を判定し、ps1であればモジュールのインストール、それ以外の拡張子であればスクリプトモジュールと断定しモジュールの公開を行っています。
コメント