维护版,核对于 2026-09-01。 2019 年原文通过把当前用户的执行策略设为
Unrestricted修好了一台机器,但这通常比问题所需的范围更宽。下面先在不加载配置文件的情况下恢复 shell,再确认生效策略与准确配置文件,审查 Conda 准备写入的内容,最后选择授权范围内最窄的修复。文末完整保存 2019 年导出,仅规范化不可见的行尾空格。
PowerShell 启动时点执行 profile.ps1 并抛出 PSSecurityException,表示 PowerShell 启动策略层失败;它本身不能证明 Conda、Python 或某个环境已损坏。应把被阻止的配置文件、Conda 安装和目标环境分层处理。
Table of Contents
1. 改策略前先读清报错路径
历史报错指向:
C:UsersuserDocumentsWindowsPowerShellprofile.ps1
这是 Windows PowerShell 的配置文件路径。PowerShell 7(pwsh.exe)、Windows PowerShell(powershell.exe)、Visual Studio Code 和其他宿主可能使用不同路径。Microsoft 建议在实际报错的宿主中读取 $PROFILE 自动变量,而不是假定一个固定文件。
执行策略是 Windows 针对配置文件与脚本的安全功能,但不是完整的安全边界。正确问题不是“怎样禁用它”,而是“哪个作用域正在生效、哪个文件被阻止、该文件是否可信”。
2. 不加载配置文件,先恢复干净 shell
从“命令提示符”、“运行”窗口或可信的 Conda prompt 启动同一类 PowerShell,并禁用配置文件:
powershell.exe -NoProfile
pwsh.exe -NoProfile
只运行与你所用宿主对应的命令。-NoProfile 是恢复模式:它不加载故障启动文件,但不会修改该文件或执行策略。若两个命令都找不到 conda,后续 Conda 命令应在该发行版安装的 Anaconda/Miniconda/Miniforge prompt 中执行。
不要只为消除报错就删除配置文件。它可能还包含无关的自定义内容,而且失败的宿主和路径本身就是重要证据。
3. 盘点宿主、配置文件、命令与策略
在干净的 PowerShell 会话中记录:
$PSVersionTable.PSVersion
$PSHOME
$PROFILE | Select-Object *
Get-ExecutionPolicy
Get-ExecutionPolicy -List
Get-Command conda -All -ErrorAction SilentlyContinue
不带作用域的 Get-ExecutionPolicy 显示实际生效策略;-List 列出 MachinePolicy、UserPolicy、Process、CurrentUser 与 LocalMachine。组策略作用域优先于本地可配置作用域,因此 Set-ExecutionPolicy 即使执行成功,也可能没有改变实际策略。
应保存输出,而不是凭记忆中的默认值判断。Microsoft 记录了多种默认与生效组合,企业策略也可能有意禁止配置文件。
4. 检查准确配置文件和 Conda 改动
执行配置文件前,先把当前宿主的文件当作文本读取:
if (Test-Path -LiteralPath $PROFILE -PathType Leaf) {
Get-Item -LiteralPath $PROFILE
Get-Content -LiteralPath $PROFILE
}
Conda 初始化块应指向你预期的安装位置。块外的命令也必须审查;修复 Conda 不能顺带授权一个无关的配置文件载荷。
在能找到预期 conda 命令的 prompt 中预览当前版本准备进行的修改:
conda --version
conda init powershell --dry-run --verbose
Conda 文档说明 --dry-run 只显示而不写入。把预览与现有配置文件比较,并核对安装路径。不要粘贴从其他用户、机器或 Conda 版本复制来的初始化块。
5. 选择授权范围内最窄的修复
| 情况 | 修复 | 边界 |
|---|---|---|
MachinePolicy 或 UserPolicy 已定义 | 遵循组织策略或联系管理员 | 不要用 CurrentUser、Process、Bypass 或复制来的代码试图绕过组策略。 |
个人非托管 Windows;已审查本地配置;策略为 Restricted | 可考虑将 CurrentUser 设为 RemoteSigned | 对当前用户持久生效,不影响整机;运行脚本前仍需审查。 |
RemoteSigned 阻止一个已审查且带下载标记的文件 | 验证准确文件,只移除它的 Internet 区域标记 | 不要递归解锁目录,也不要把“有签名”等同于“无恶意”。 |
| 策略必须保持不变 | 使用可信 Conda prompt 与 conda run | PowerShell 不自动激活;每条命令明确选择环境。 |
| 配置文件含有过时或不需要的 Conda 块 | 预览并运行 conda init --reverse powershell | 只移除 Conda 初始化,不修复其他配置代码。 |
在个人非托管机器上且已审查配置文件后,下面的限定作用域命令通常可替代存档中的 Unrestricted:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Get-ExecutionPolicy
Get-ExecutionPolicy -List
RemoteSigned 允许运行本地创建的脚本;下载脚本必须签名,除非用户明确解除阻止。不要仅为初始化 Conda 就持久设置 Unrestricted 或 Bypass。组织也可能正确要求 AllSigned,本文不会削弱它。
6. 只解锁一个已验证的下载文件
只有在生效策略已是 RemoteSigned,且报错明确指出一个可信文件带有 Internet 区域标记时才使用此路径。把占位符换成 PowerShell 报告的准确路径:
$blockedPath = 'C:pathreportedbytheerror.ps1'
Get-AuthenticodeSignature -LiteralPath $blockedPath |
Format-List Status, StatusMessage, SignerCertificate
Get-Item -LiteralPath $blockedPath -Stream *
Unblock-File -LiteralPath $blockedPath -WhatIf
验证发布者与来源,检查文件内容,并确认路径位于预期安装中。仅当这些检查都通过时才运行:
Unblock-File -LiteralPath $blockedPath
Microsoft 说明 Unblock-File 会删除 Zone.Identifier 数据流。这是一次信任决定,不是通用的“清除报错”命令。不要递归解锁 Downloads、整个 Conda 安装或配置文件树。
7. 备份、初始化、重启并验证
让 Conda 修改非空配置文件前,先在旁边建立带时间戳的备份:
if (Test-Path -LiteralPath $PROFILE -PathType Leaf) {
$stamp = Get-Date -Format 'yyyyMMdd-HHmmss'
Copy-Item -LiteralPath $PROFILE -Destination "$PROFILE.$stamp.bak"
}
conda init powershell --dry-run --verbose
conda init powershell
关闭该 PowerShell 宿主的所有窗口,再启动一个新窗口;Conda 文档说明 conda init 后多数 shell 需要重启。随后验证命令、环境选择与解释器身份:
conda --version
conda info --envs
conda activate PROJECT_ENV
python -c "import sys; print(sys.executable); print(sys.version)"
conda deactivate
把 PROJECT_ENV 替换为目标环境。仅看到 prompt 前缀还不算验收;sys.executable 必须位于预期前缀中。
8. 不做持久 PowerShell 初始化也能运行任务
自动激活不是必需条件。在可信 Conda prompt 中,conda run 可以不加载 PowerShell 配置文件,直接在指定环境运行一条命令:
conda run --name PROJECT_ENV --no-capture-output -- python .script.py
Conda 为这条边界记录了 --name/--prefix、--cwd 和 --no-capture-output。对于计划任务和可复现自动化,显式执行往往比依赖交互式配置文件更清晰。进程仍继承调用者的文件、网络权限与凭据;Conda 环境用于依赖隔离,不是安全沙箱。
9. 回滚 Conda 配置文件改动
先预览受支持的逆操作:
conda init --reverse powershell --dry-run --verbose
conda init --reverse powershell
重启 shell 后再次检查 $PROFILE。若无关内容被改动,或逆操作结果与记录的预览不符,应停止并比较时间戳备份,不要盲目覆盖配置文件。
若本文修改了 CurrentUser 策略且现在不再需要,先记录当前列表,再只删除这一作用域的设置:
Get-ExecutionPolicy -List
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser
Get-ExecutionPolicy -List
Undefined 表示删除该作用域的设置;之后的生效策略来自下一个适用作用域,并不保证一定是 Restricted 或任何特定值。
10. 按观察到的层次排错
| 观察 | 可能原因 | 下一步证据 |
|---|---|---|
启动时 PSSecurityException 指向 profile.ps1 | 生效策略阻止该宿主的配置文件 | $PROFILE、Get-ExecutionPolicy -List、文件内容 |
设置 CurrentUser 成功但生效策略不变 | 更高优先级组策略 | MachinePolicy、UserPolicy 与管理员指引 |
只有使用 -NoProfile 时找不到 conda | 配置文件提供了 shell 函数或 PATH | 使用可信 Conda prompt;检查 Get-Command conda -All |
conda activate 提示 shell 未配置 | 初始化缺失、已逆转或应用到了另一宿主/配置文件 | 宿主程序、$PROFILE、conda init ... --dry-run --verbose |
| 初始化路径指向旧安装 | 重装或移动后残留旧配置块 | 比较 Get-Command conda、预览与配置备份 |
| Conda 已激活但 Python 不对 | 环境选错或可执行文件被遮蔽 | conda info --envs、Get-Command python -All、sys.executable |
RemoteSigned 下只有一个下载模块被拒绝 | Internet 区域标记或无效签名 | 准确报错路径、签名、备用数据流、来源 |
在表中没有找到相应证据前,不要重装 Anaconda、编辑注册表、删除所有配置文件或放宽策略。
11. 安全与自动化说明
- 把 PowerShell 配置文件视为可执行代码;安装程序修改后应审查 diff。
- 不要把秘密放入配置文件或命令历史;激活环境不会保护秘密。
- 在托管环境中保留组策略,使用获批签名配置或显式命令。
- 自动化应固定环境、打印
sys.executable、记录退出状态,并避免依赖用户的交互配置文件。 - 只有项目确实支持两者时才同时测试 Windows PowerShell 与 PowerShell 7;二者的配置路径和模块环境可能不同。
- 执行策略可减少意外运行脚本,但 Microsoft 明确说明它不是阻止有意运行代码的安全系统。
12. 完整的 2019 年导出存档
下面是完整的 2019 WordPress 导出。原来的 Unrestricted 修复仅作为历史来源保存,不是当前建议。只为仓库格式规范化了不可见的行尾空格。
---
id: 1982
title: 'Run Anaconda Script in Powershell to Error'
slug: 'run-anaconda-script-in-powershell-to-error'
date: '2019-07-05T06:56:14'
modified: '2019-07-05T06:56:17'
status: 'publish'
link: 'https://blog.lazying.art/en/html/computer_internet/software/1982/run-anaconda-script-in-powershell-to-error.html'
author: 'Lachlan Chen'
categories:
- 'Software'
---
I met this error when open Powershell
+ . <<<< 'C:UsersuserDocumentsWindowsPowerShellprofile.ps1'
+ CategoryInfo : NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId : RuntimeException
after running
conda init powershell
It get solved by execute this in Powershell
Set-ExecutionPolicy Unrestricted -Scope CurrentUser
