tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

PowerShell の Moduleインストール用スクリプトを作ってみた

自分で作ったスクリプトや、GitHubでお知恵を拝借したスクリプトには、「Module Pathにして便利に使ってね!」というものが少なくありません。 というか、一々スクリプトをたたいてなどいられません。 しかもPowerShell 3.0 では、Import Moduleを一々しなくても、Module Pathを自動で確認します。 ということは、Module Pathに移動させたいスクリプトを移動させる ( = 甘々に解釈してインストールとでも呼称しておきます) のは、サクッと終わらせたいものです。 そもそもModule Pathを知らないユーザーも多いですし……移動スクリプトの時点でExecution-Policyの確認も行えるというのは一石二鳥?かもかも? ということで、公開します。

GitHub

以下にps1と起動用のバッチスクリプトを置いておきます。
GitHub - PowerShellUtil / Install-PowershellModule /

利用方法

簡単です。バッチダブルクリック一発!
  1. Moduleパスにコピーしたいファイルを指定された(指定がなければ作りたい)フォルダに纏めます。
  2. install.ps1 と install.bat を同フォルダに設置します。
  3. install.bat を実行します。
  4. Module Path の進捗が表示されるので、コピーされたことを画面表示で確認します。
  5. PowerShell 3.0なら、ISEなどを開いて Get-Module や 行き成りfunctionを入力すれば存在するはずです。
※ だめなら大体psm1の記述が上記の想定でない可能性がありますが……まずないかと。

スクリプト全文

Git-Hubを見ることすら面倒な方……というより、軽く参考までに。 TechNet参考にしてみようと思ったのですが、元々のは、VistaとかXPとか意味わからない言葉が書いてあったので、ごりっと削除しています。 あと、結構動作が気にくわなかったので、インストーラーのあるパスのフォルダ名でModuleにフォルダ作って、インストーラと同じフォルダ、より深い階層のps1やpsm1、psd1を、Moduleパスに全て同じ階層にまとめるようにしています。 .....面影がほぼなくなってしまった.... 個別フォルダの対応はしていないので、欲しい方はリクエスト下さい。 (私はいらない予感) なお、PowerShell Moduleのルートパスは以下です。 (Windows Vista移行は統一) "$env:userProfile\documents\WindowsPowerShell\Modules"
#Requires -Version 2.0

[CmdletBinding()]
Param(
	[Parameter(
	Position=0,
	Mandatory=$false,
	ValueFromPipeline=$True)]
	[string]
	$path=$(Split-Path $PSCommandPath -Parent)
)
	  
Function Get-OperatingSystemVersion{
	(Get-WmiObject -Class Win32_OperatingSystem).Version
}

Function Test-ModulePath{

	$Path = "$env:userProfile\documents\WindowsPowerShell\Modules"
 
	Write-Verbose "Checking Module Home."
	if ([int](Get-OperatingSystemVersion).substring(0,1) -ge 6) 
	{ 
		if(-not(Test-Path -path $Path))
		{
			Write-Verbose "Creating Module Home at $path"
			New-Item -Path $Path -itemtype directory > $null
		}
		else
		{
			Write-Verbose "$path found. Never create Module Direcoty and end Test-ModulePath function."
		}
	}

}

Function Copy-Module{
	
	param(
	[string]
	$name
	)

	$UserPath = $env:PSModulePath.split(";")[0]
	$global:ModulePath = Join-Path -path $userPath -childpath $(Get-Item $PSCommandPath).Directory.Name

	If(-not(Test-Path -path $modulePath))
	{
		Write-Verbose "Creating Custom Module Firectory at $ModulePath"
		New-Item -path $ModulePath -itemtype directory > $null

		try
		{
			Write-Verbose "Copying modules into $ModulePath"
			Copy-item -path $name -destination $ModulePath > $null
		}
		catch
		{
			Write-Warning "Copying error, Please check failed item. If you can, please copy it to $ModulePath"
		}
		finally
		{
		}
	}
	Else
	{ 
		Write-Verbose "Copying modules into $ModulePath"
		try
		{
			Copy-item -path $name -destination $ModulePath > $null
		}
		catch
		{
			Write-Warning "Copying error, Please check failed item. If you can, please copy it to $ModulePath"
		}
		finally
		{
		}
	}
}

Write-Host "Starting checking Module path and Copy PowerShell Scripts job." -ForegroundColor Green

Write-Host "Checking Module Path existing." -ForegroundColor Green
Test-ModulePath

Write-Host "Copying Modules to Module Path." -ForegroundColor Green
Get-ChildItem -Path $path -File -Recurse `
	| where {$_.Extension -eq ".ps1" -or ".psm1" -or ".psd1"} `
	| Foreach-Object { 
		Write-Verbose "Copying $($_.fullName) to $path ."
		Copy-Module -name $_.fullName  
		}

Write-Host "Installation finished. Your Module Path is $ModulePath" -ForegroundColor Green

参考サイト

時代は Windows 8 / Blue? ですよねー。
Hey, Scripting Guy! How Can I Install Windows PowerShell Modules on Multiple Users' Computers?

続き

上記のバグを修正しています。 GitHub には最新版をおいていますが、一応。
PowerShell の Moduleインストール用スクリプトを作ってみた (続き)