[PowerShell][右クリック送る]Word,Excel,Powerpointを読み取り専用で開く

## 概要
WindowsでWordファイル、Excelファイル、Powerpointファイルを右クリック「送る」メニューを通して自動的に読み取り専用モードで開くための、PowerShellスクリプト埋め込みBatファイルです。
レジストリ修正等による対応はできない（管理者権限が無い）環境で作業することが当たり前になりつつ、officeソフトのバージョンやアプリケーション毎に対応方法が違うのも煩わしいので、自分用に作りました。

## 特徴
* レジストリ変更やインストールは不要
* ファイルの一時的なコピーなどは不要
* Windows標準で使用できる簡易なコード／スクリプトのみで実装
* 右クリックコンテクストメニューからのシンプルな操作
* officeソフトバージョン、OSバージョンに（多分）依存せずに使える
* word,excel,powerpointに対応
* 長いパス(260文字前後)の呪いに（多分）遭わない

誤操作によるファイル更新や不要なロックを抑止するため、参照するだけなら読み取り専用でファイルを開くように個人的に心がけています。**<font color="blue">（何となく、これに尽きます。）</font>**

## コード
```powershell:読み取り専用で開く.bat
<# : by earthdiver1
@echo off & setlocal EnableDelayedExpansion
set BATCH_ARGS=%*
for %%A in (!BATCH_ARGS!) do set "ARG=%%~A" & set "ARG=!ARG:'=''!" & set "PWSH_ARGS=!PWSH_ARGS! "'!ARG!'""
if defined PWSH_ARGS set "PWSH_ARGS=!PWSH_ARGS:^^=^!"
endlocal &  Powershell -NoProfile -Command "$input|&([ScriptBlock]::Create((gc '%~f0'|Out-String)))" %PWSH_ARGS%
exit/b
: #>
Function Main($aryArgs) {
    try {
        If ($aryArgs.Length -ne 1) { exit }
        $argitem = Get-Item $aryArgs[0]
        if ($argitem.PSIsContainer) {
            exit
        } else {
            switch ($argitem.Extension){
                {$_ -Like ".doc*"}{
                    $word = New-Object -ComObject Word.Application
                    $word.Visible = $True
                    $doc = $word.Documents.Open($argitem.FullName, $false, $true)
                    [Void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($doc)
                    [Void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($word)
                    break
                }
                {$_ -Like ".xls*"}{
                    $excel = New-Object -ComObject Excel.Application
                    $excel.Visible = $True
                    $book = $excel.Workbooks.Open($argitem.FullName, $false, $true)
                    [Void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
                    [Void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
                    break
                }
                {$_ -Like ".ppt*"}{
                    $ppt = New-Object -ComObject Powerpoint.Application
                    $prs = $ppt.Presentations.Open($argitem.FullName, $true)
                    [Void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($prs)
                    [Void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($ppt)
                    break
                }
                default { exit }
            }    
            [GC]::Collect()
        }
    } catch [System.Exception] {
        Write-Host "システム例外が発生しました。" -Fore Red
        Write-Host $Error[0].Exception
        Read-Host "何かキーを押すと終了します。" 
    } finally {
    }
}

Main $Args
```

## 使い方
1. このコードをbatファイル形式で保存して、batファイルへのショートカット又はbatファイル本体を、以下に格納します。  
C:\Users\username\AppData\Roaming\Microsoft\Windows\SendTo  
 ※[Windowsキー]+[R]で「ファイル名を指定して実行」から[shell:sendto]で開く場所です。
2. 開きたいファイルを右クリックして「送る」メニューからbatファイル(又はショートカット)を選べば、ファイルが読み取り専用で開きます。
3. ファイル起動処理中のプロンプト画面は、batファイルへのショートカットのプロパティで、実行時の大きさを「最小化」にしておくと隠せます。（タスクバーには出ます）

## コードの流れ
* BatファイルにPowerShellスクリプトを埋め込んでおり単一ファイルでスクリプト実行可能です。
* 右クリック「送る」へ送ったファイルパス名をbatファイルの引数として受け取り、さらにpowershellスクリプトの引数として渡します。この時にシングルクォートで囲む形で特殊文字をエスケープしています。
* powershellスクリプトで引数がフォルダかファイルかを判断し、さらに拡張子に合わせたofficeアプリケーションのComObjectを生成して、引数で受け取ったファイルを読み取り専用モードで開きます。
* このbat(PowerShell)自体は、ファイル起動に使った変数を破棄した後にすぐに終了するので、起動したファイルだけが残ります。

## 注意
* 1度に指定できる引数は1つだけということにしています。
* Word,Excel,Powerpoint以外のアプリケーションには対応していません。
* 拡張子を".doc*"、".xls*"、".ppt*"でマッチさせています。そのためテンプレートファイルなどは開きません。
* 起動したファイルを最前面に表示する制御は入れていないため、ファイル起動後にbat(PowerShell)が終了するタイミングで、ファイルを右クリックした時のエクスプローラーウインドウが前面に出ます。
  * 個人用としては事足りているので、あまり手の込んだ事はしていません・・・

## 参考・引用
以下の記事の続編です。
[レジストリ修正不要で、エクセルファイルを右クリックメニューから読み取り専用で開く](https://qiita.com/lifequery/items/949a040fa431c4d05d61)
クリエイティブ・コモンズ 表示 - 継承 4.0 国際