以前、PowerShell ModuleをGitHubなどからCloneした後に、 User Moduleパスにインストール (要はコピー) するスクリプトを公開しました。
PowerShellのModuleインストール用スクリプトを作ってみた
前回のスクリプトはMS TechNetのやり方に沿ってちょろちょろいじったやつだったのですが、 フォルダ構造のコピーできない欠陥がありました。 今回、見直しを行い、フォルダ構造ごとコピーするようにしています。
GitHub
最新版はこちらから。
PowerShellUtil / Install-PowershellModule
利用方法
install.batを実行すると$env:userProfile\documents\WindowsPowerShell\Modulesにコピーされます。
詳しくは、ReadMeを参照してください。
そもそも Copy-Item コマンドレットができないのは
Copy-Itemコマンドレット単独でフォルダ構造毎コピーできないのはどうにかしてほしいと感じています。
-Recurseは用途が違うからいいのですが、別のオプションを設けるなりは必要でしょう。
今回のCopy-Moduleで、フォルダ構造毎コピーする動作は実現しており、 普通の用途に利用してもいいのですがもやもやしたものがあります。
Stack OverFlowや、他の方も自作を試みているようですがどうなんでしょう。
このページを検索で見つけた人が必要としているであろうCopy-Module部分を載せておきます。
Function Copy-Module{ [コマンドレットBinding()] param( [parameter( mandatory, position = 0, ValueFromPipeline, ValueFromPipelineByPropertyName)] [validateScript({Test-Path $_})] [string] $path, [parameter( mandatory, position = 1, ValueFromPipeline, ValueFromPipelineByPropertyName)] [validateScript({(Get-Item $_).PSIsContainer -eq $true})] [string] $destination ) if(Test-Path $path) { $rootpath = Get-Item $path Get-ChildItem -Path $path -File -Recurse | %{ # Define target directory path for each directory if ($_.Directory.Name -ne $rootpath.Name) { $script:droot = Join-Path $destination $rootpath.Name $script:ddirectory = Join-Path $droot $_.Directory.Name } else { $script:ddirectory = Join-Path $destination $_.Directory.Name } # Check target directory path is already exist or not if(-not(Test-Path $ddirectory)) { Write-Verbose "Creating $ddirectory" $script:ddirectorypath = New-Item -Path $ddirectory -ItemType Directory -Force } else { $script:ddirectorypath = Get-Item -Path $ddirectory } # Copy Items to target directory try { if (-not($_.PSIsContainer)) { $script:dpath = Join-Path $ddirectorypath $_.Name Write-Verbose "Copying $($_.name) to $dpath" Copy-Item -Path $_.FullName -Destination $ddirectorypath -Force -Recurse -ErrorAction Stop } } catch { Write-Error $_ } } # return copied destination path return $droot } else { throw "{0} not found exception!" -f $path } }
利用する際は、このようにします。
Copy-Module -path $path -destination $destination
たとえば、 c:\hogeをd:\hogeにコピーする場合はこうです。
Copy-Module -path c:\hoge -destination d:\hoge