【Windows】ExecutionPolicyがRestrictedのときに起きることをまとめました。

ExecutionPolicyをRestrictedに設定した状態でパソコンを使っていて、実際に経験したことを記録していきます。

ExecutionPolicyの基本

Windows 11でPowerShellスクリプトが動かない? Set-ExecutionPolicy を正しく理解する
現状の設定確認
Get-ExecutionPolicy
Restricted

スコープと設定値表示
Get-ExecutionPolicy -List                                                  

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser      Restricted
 LocalMachine      Restricted
スコープの優先順位順(強い → 弱い)で並んでいます。
そして、最終的に有効になる実行ポリシーは「最も強いスコープで Undefined ではないもの」です。

設定変更コマンド
Set-ExecutionPolicy 設定値 -Scope CurrentUser                          
設定値
Restricted

代表的な ExecutionPolicy をまとめると次の通りです。

ポリシー内容使いどころ
RestrictedPowerShellスクリプトはすべて禁止デフォルト
AllSignedすべてのPowerShellスクリプトに署名が必要厳格な企業環境
RemoteSignedローカルは OK、ダウンロードは署名必須個人開発では現実的な設定
Unrestrictedほぼ無制限検証用のみ
Bypass制限を完全に無視CI・自動化

Vsコードでターミナルを起動(Anacondaをインストールしてる場合)

エラーメッセージ:
このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\user\Documents\WindowsPowerShe
ll\profile.ps1 を読み込むことができません。

原因:
ExecutionPolicyを確認
get-ExecutionPolicy   
Restricted

Restrictedに設定されているとps1スクリプトが一切実行できないためC:\Users\user\Documents\WindowsPowerShe
ll\profile.ps1 が読み込めない(実行できない。)

🔍 このコードがやっていること

If (Test-Path "C:\Users\user\anaconda3\Scripts\conda.exe") {
    (& "C:\Users\user\anaconda3\Scripts\conda.exe" "shell.powershell" "hook") | Out-String | ?{$_} | Invoke-Expression
}

🧩 1. Test-Path で conda.exe が存在するか確認

Test-Path "C:\Users\user\anaconda3\Scripts\conda.exe"
  • 指定したパスに conda.exe が存在するか をチェックします。
  • 存在すれば True、なければ False

つまり:

Anaconda がこの場所にインストールされているか確認している


🧩 2. 存在した場合だけ、conda の PowerShell 初期化コードを実行

(& "C:\Users\user\anaconda3\Scripts\conda.exe" "shell.powershell" "hook")

これは conda に対して:

「PowerShell 用の初期化コード(hook)を出力して」

と指示しています。

conda はこのコマンドを受け取ると、PowerShell で conda を使うための設定(環境変数の設定など)を スクリプトとして出力 します。


🧩 3. 出力されたスクリプトを PowerShell に実行させる

| Out-String | ?{$_} | Invoke-Expression

ここがポイント。

  1. Out-String
    → conda が出力した内容を 文字列として扱う
  2. ?{$_}
    → 空行を除外する(フィルタリング)
  3. Invoke-Expression
    → その文字列を PowerShell コードとして実行

つまり:

conda が出力した初期化スクリプトを、そのまま PowerShell に実行させる


🎯 このコードの目的(まとめ)

  • Anaconda が特定の場所にあるか確認し
  • あれば conda の PowerShell 初期化スクリプトを生成し
  • それを PowerShell に実行させて
  • conda コマンドを PowerShell で使えるようにする

💡 なぜこうするのか?

PowerShell では、conda を使うために 環境変数や PATH の設定が必要 です。

通常は:

conda init powershell

で設定されますが、
このスニペットは 手動で同じことを実現している 形です。

特に:

  • スクリプト実行ポリシーが Restricted の環境
  • プロファイルに直接書きたくない場合
  • conda の場所を明示的に指定したい場合

などに便利です。


Anaconda PowerShellをツールから実行した場合

Anaconda PowerShell Promptのショートカットのリンク先を見ると以下のようになっている。

%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -NoExit -Command "& 'C:\Users\user\anaconda3\shell\condabin\conda-hook.ps1' ; conda activate 'C:\Users\user\anaconda3' "

PowerShell を “ByPass モードで起動する”(powershell.exe -ExecutionPolicy ByPass -) ことで、conda-hook.ps1がps1ファイルなのに強制的に実行できる。
現状のExecutionPolicyを確認。
 get-ExecutionPolicy
Bypass
Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined → Bypassに変わってる。
  CurrentUser      Restricted
 LocalMachine      Restricted
このリストは、上から順番に優先される。scoopがProcessの意味は、今コマンドを打ったプロセスだけ有効、つまりAnaconda PowerShell Promptのウィンドウだけは、ExecutionPolicyがBypassになっているのでps1を無条件実行できる状態。

Jupiterlabはどうなっているのか

あくまで 「JupyterLab を起動する(activate.bat を叩く)という行為そのもの」 に対してはExecutionPolicy(Restrictedのまま)は変更していないようです。しかし、「JupyterLab をプラットフォームとして PowerShell スクリプトも管理・実行したい」という用途であれば、RemoteSigned への変更は必須のステップになります。(Gemini談)

Jupiterlabのセルで以下はRestrictedでは、実行できない。
!powershell ./myscript.ps1

この記事を書いたイチゲを応援する(質問でもokです)
Vプリカでのお支払いがおすすめです。

MENTAやってます(ichige)

タイトルとURLをコピーしました