自分で作ったスクリプトや、GitHubでお知恵を拝借したスクリプトには、「Module Pathにして便利に使ってね!」というものが少なくありません。
というか、一々スクリプトをたたいてなどいられません。
しかもPowerShell 3.0 では、Import Moduleを一々しなくても、Module Pathを自動で確認します。
ということは、Module Pathに移動させたいスクリプトを移動させる ( = 甘々に解釈してインストールとでも呼称しておきます) のは、サクッと終わらせたいものです。
そもそもModule Pathを知らないユーザーも多いですし……移動スクリプトの時点でExecution-Policyの確認も行えるというのは一石二鳥?かもかも?
ということで、公開します。
GitHub
以下にps1と起動用のバッチスクリプトを置いておきます。
GitHub - PowerShellUtil / Install-PowershellModule /
利用方法
簡単です。バッチダブルクリック一発!
- Moduleパスにコピーしたいファイルを指定された(指定がなければ作りたい)フォルダに纏めます。
- install.ps1 と install.bat を同フォルダに設置します。
- install.bat を実行します。
- Module Path の進捗が表示されるので、コピーされたことを画面表示で確認します。
- 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インストール用スクリプトを作ってみた (続き)