LoginSignup
3
3

More than 3 years have passed since last update.

「送る」で「PATH」を通す

Last updated at Posted at 2019-07-19

windows_path.png

エクスプローラのフォルダやファイルを右クリックして現れる「送る」メニューから、Windowsの環境変数「PATH」を追加できるようになるバッチファイル(中身はPowerShell)ができたので、ご紹介します。

動作

  • フォルダに対して行うと、そのフォルダへのパスを追加します。
  • ファイルに対して行うと、そのファイルが入れられた親ディレクトリへのパスを追加します。

ダウンロード

v2.0以降のPowerShell版を推奨します。
GitHub - リリース
GitHub

最初に注意

  • 追加されたパスは、通常通り、windowsにログオンしなおさないと反映されません。
  • もとの環境変数にトラブルが生じないよう最大限配慮していますが、万一に備え、 もとの環境変数のバックアップ を強く推奨いたします。
  • 使用は自己責任でお願いします。万一、もとの環境変数が破壊されるなどしても、当方は一切の責任を負いかねます。
  • 環境変数PATHのバックアップについては、こちら。Qiita > 環境変数Pathのバックアップ

手順

1. バッチファイル(中身はPowerShell)

下記の内容で、バッチファイルを作ります。
バッチファイルと言いつつ、中身はPowerShellです。拡張子を*.ps1にすると実行時に面倒なので、外からはバッチファイルに見えるよう、*.batにしています。
参考 : バッチファイルから PowerShell を呼び出す方法

send-to-user-path.bat
@powershell -NoProfile -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \"%~f0\"|?{$_.readcount -gt 1})-join\"`n\");&$s" ""%*""&goto:eof

# 引数
Param($Arg1)
Write-Debug $Arg1

# ファイル存在チェック
Write-Debug "ファイル存在チェック"

if( -Not(Test-Path $Arg1) ){
    Write-Host '指定されたファイルは存在しません。処理を終了します。'
    exit
}

# アイテムを取得
$item = Get-Item $Arg1

# PSIsContainer でファイルかフォルダかを判定 https://bayashita.com/p/entry/show/229
Write-Debug "ファイルかフォルダかを判定"
if($item.PSIsContainer)
{
    # フォルダの場合の処理
    Write-Debug "$($item.Name)はフォルダです。"
}
else
{
    # ファイルの場合は・・・
    Write-Debug "$($item.Name)はファイルです。"

    # 親フォルダをアイテムとして再取得
    # バヤシタ > PowerShell > ファイル・フォルダ > 親フォルダの絶対パスを取得する方法 https://bayashita.com/p/entry/show/133
    $parent_folder = Split-Path $Arg1

    # アイテムを再取得
    $item = Get-Item $parent_folder

    if ($item.PSIsContainer) {
        Write-Debug "アイテムを$($item.Name)として再取得成功"
    }
}
Write-Debug "フルネーム $($item.FullName)"

# 新しい環境変数を生成。新規/上書きで処理を分岐。

# 新規の場合
if ( -Not(Test-Path Env:Path2) ) {
    # 新しい文字列を生成
    Write-Debug "new Path2"
    $NewPath = $item.FullName
}
# 追加の場合
else
{
    # 新しい文字列を生成
    Write-Debug "add Path2"
    $NewPath = "$($env:Path2);$($item.FullName)"
}

# 環境変数をセット
Write-Host "セット予定 $($NewPath)"
[Environment]::SetEnvironmentVariable('Path2', $NewPath, 'User')

Write-Debug "現在のenv:Path2 $($env:Path2)"

2. コンテキストメニュー追加

同梱のsendoto_menu.lnkをダウンロードして開きます。
または、以下の操作でフォルダを開きます。

  1. Windowsキー + Rキー
  2. ダイアログに入力:shell:sendto

ここへ、上記で作成したバッチファイルのショートカットを作成します。
ファイル名は、「このファイルにパスを通す」などがおすすめです。
ショートカットのアイコンも、右クリックのプロパティからお好きなように設定できます。

3. 環境設定を開きます

  1. Windowsキー + Pauseキー -> 設定の変更 -> 詳細設定 -> 環境変数
  2. もともとのユーザー環境変数pahtに、%path2%を追加します。

path2がまだないときは、1のバッチファイルにて自動追加されます。path2に分けることで、環境変数の文字制限(注3-1.)に引っかかる危険性を回避したり、もとの環境変数`path`を保護したりできます。

(注3-1.) @IT > クラウド > Windows Server Insider > 環境変数のサイズやPATHの長さ制限に注意

4. 番外編。システム環境変数とする場合

以下のコマンドがある行で、一番右の'User'を、'Machine'に書き換えます。

send-to-user-path.bat
[Environment]::SetEnvironmentVariable('Path2', $NewPath, 'Machine')

参考1: バッチファイル

参考2: PowerShell

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3