---
# System prepended metadata

title: scoop
tags: [CLI]

---

# scoop

## References
+ 📑 [**Documentation - scoop**](https://scoop.sh/)
+ 📑 [**Scoop Apps**](https://bjansen.github.io/scoop-apps/) (尋找套件是否存在於 scoop)
+ 🔗 [**Windows 套件管理工具 - Scoop**](https://www.gss.com.tw/blog/windows-%E5%A5%97%E4%BB%B6%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7-scoop)

## Installation

1. 開放有數位簽章的網路腳本執行
    > 因為要執行網路下載的 scoop 安裝腳本，所以必須開啟這個選項。\
    > scoop 安裝腳本有數位簽章，數位簽章內包含 CA 憑證，CA 憑證只核發給認證的機構，\
    > 而要通過認證，需要開發者檢附相關文件，比如身份資料、聯絡方式、公司註冊資料等。\
    > 所以不用擔心，即便腳本是從網路來的，你也可以信任它。\
    > 預設的 ExecutionPolicy 是 Restricted，完全禁止執行任何腳本，非常嚴格。\
    > 因此這裡要放寬限制。
    ```ps1
    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
    ```
2. 從指定 domain 抓 scoop 安裝腳本，執行 scoop 安裝腳本
    ```ps1
    Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
    ```

## Commands

|🚨 <span class="caution">CAUTION</span>|
|:---|
|若遇到下載錯誤，可以先檢查 Windows Defender，很高機率是它攔住你。<br />(選擇 Allow 再回來通常就可以下載了)|

### 📦 App

| 指令 | 說明 |
| ---- | ---- |
| `scoop list` | 列出所有已安裝 app |
| `scoop status` | 檢查可更新的 app |
| `scoop install <app>` | 安裝 app |
| `scoop install <app>@<version>` | 安裝指定版本 app |
| `scoop install -g <app>` | 為所有使用者安裝 app |
| `scoop uninstall <app>` | 解除安裝 app |
| `scoop uninstall <app> --purge` | 解除安裝 app、完全移除 app 的 [persist](#persist) 設定 |
| `scoop update <app>` | 更新 app |
| `scoop update *` | 更新所有 app |
| `scoop hold <app>` | 鎖定 app 更新 |
| `scoop unhold <app>` | 解鎖 app 更新 |
| `scoop reset <app>` | 重新掛載該 app 提供的所有執行檔和 [shim](#shim) |
| `scoop reset <app>@<version>` | 重新掛載該 app (指定版本) 提供的所有執行檔和 [shim](#shim) |
| `scoop info <app>` | 顯示 app 詳細資訊 |
| `scoop prefix <app>` | 顯示 app 安裝路徑 |
| `scoop which <command>` | 顯示命令實際對應的執行檔 |
| `scoop search <keyword>` | 搜尋可安裝的 app |
| `scoop home <app>` | 開啟 app 的官方網頁 |

### 🧰 Bucket

| 指令 | 說明 |
| ---- | ---- |
| `scoop bucket list` | 列出本地 bucket |
| `scoop bucket known` | 列出官方 bucket |
| `scoop bucket add <name>` | 新增 bucket |
| `scoop bucket rm <name>` | 移除 bucket |
| `scoop bucket update <name>` | 更新指定 bucket |
| `scoop bucket update *` | 更新本地所有 bucket |

### 🧹 Clean

| 指令 | 說明 |
| ---- | ---- |
| `scoop cleanup *` | <mark>清理所有 app 的舊版本</mark> |
| `scoop cleanup <app>` | 清理指定 app 的舊版本|
| `scoop cache show` | 查看目前快取狀態 |
| `scoop cache rm *` | <mark>清除所有安裝快取</mark> |
| `scoop cache rm <app>` | 清除指定 app 快取 |

### 🧭 Import

| 指令 | 說明 |
| ---- | ---- |
| `scoop export` | 匯出已安裝 app 記錄檔（JSON） |
| `scoop import <file>` | 匯入 app 記錄檔，批次安裝 |

### 🧪 Test

| 指令 | 說明 |
| ---- | ---- |
| `scoop checkup` | 偵測 Scoop 問題 |

## Directory

### apps
> 存放 app 的目錄

### buckets
> 存放 [bucket](#bucket) 的目錄

### cache
> 快取

### modules
> PS 腳本型 app
+ app 以 JUNCTION 引用，集中在此目錄
+ 此目錄路徑，會加入環境變數 `PSModulePath` (Scoop 安裝時，會自動設定)
+ 此後 `Import-Module <app>` 時，就能找到 app 裡面的腳本執行
  + 先找「菜單」：`.psd1` (主程式在哪？執行前處理腳本？)
  + 再執行「主程式」：`.psd1` (核心)

### persist
> 持久化資料
+ 讓你在 update / uninstall app 時，有些資料 (比如：設定) 永不消失
+ 所以你要使用 `scoop uninstall <app> --purge`，才能讓持久化資料消失

### shims
> 執行檔
+ 此目錄路徑，會加入環境變數 `PATH`
+ shim 檔中紀錄執行檔的真正路徑
+ 所以 `scoop reset <app>` 的魔力在於
  + 你安裝了兩個 JDK：`openjdk21`、`openjdk25`
  + 你可以透過 `scoop reset openjdk21`、`scoop reset openjdk25` 來靈活切換 Java 版本
  + 實際上，就是 `java` 與一票工具執行檔，在 `shim` 目錄被重新掛載一遍


## Nouns

### bucket
+ 定義
  + <mark>存放 app 的安裝定義檔 (manifest)</mark>，通常是 JSON 檔
  + 一個 bucket 會有很多這樣的 manifest
  + 官方目前維護著許多 buckets，比如：main、extras、java...
  + 官方的這些 bucket 以 GitHub Repo 維護
+ 說明
  + manifest
    ```json
    {
        "version": "25.01",
        "description": "A multi-format file archiver with high compression ratios",
        "homepage": "https://www.7-zip.org/",
        "license": "LGPL-2.1-or-later",
        "notes": [
            "Add 7-Zip as a context menu option by running:",
            "reg import \"$dir\\install-context.reg\""
        ],
        "architecture": {
            "64bit": {
                "url": "https://www.7-zip.org/a/7z2501-x64.msi",
                "hash": "e7eb0b7ed5efa4e087b7b17f191797f7af5b7f442d1290c66f3a21777005ef57",
                "extract_dir": "Files\\7-Zip"
            },
            "32bit": {
                "url": "https://www.7-zip.org/a/7z2501.msi",
                "hash": "dce9e456ace76b969fe0fe4d228bf096662c11d2376d99a9210f6364428a94c4",
                "extract_dir": "Files\\7-Zip"
            },
            "arm64": {
                "url": "https://www.7-zip.org/a/7z2501-arm64.exe",
                "hash": "6365c7c44e217b9c1009e065daf9f9aa37454e64315b4aaa263f7f8f060755dc",
                "pre_install": [
                    "$7zr = Join-Path $env:TMP '7zr.exe'",
                    "Invoke-WebRequest https://www.7-zip.org/a/7zr.exe -OutFile $7zr",
                    "Invoke-ExternalCommand $7zr @('x', \"$dir\\$fname\", \"-o$dir\", '-y') | Out-Null",
                    "Remove-Item \"$dir\\Uninstall.exe\", \"$dir\\*-arm64.exe\", $7zr"
                ]
            }
        },
        "post_install": [
            "$7zip_root = \"$dir\".Replace('\\', '\\\\')",
            "'install-context.reg', 'uninstall-context.reg' | ForEach-Object {",
            "    $content = Get-Content \"$bucketsdir\\main\\scripts\\7-zip\\$_\"",
            "    $content = $content.Replace('$7zip_root', $7zip_root)",
            "    if ($global) {",
            "       $content = $content.Replace('HKEY_CURRENT_USER', 'HKEY_LOCAL_MACHINE')",
            "    }",
            "    Set-Content \"$dir\\$_\" $content -Encoding Ascii",
            "}"
        ],
        "bin": [
            "7z.exe",
            "7zFM.exe",
            "7zG.exe"
        ],
        "shortcuts": [
            [
                "7zFM.exe",
                "7-Zip"
            ]
        ],
        "persist": [
            "Codecs",
            "Formats"
        ],
        "checkver": {
            "url": "https://www.7-zip.org/download.html",
            "regex": "Download 7-Zip ([\\d.]+) \\(\\d{4}-\\d{2}-\\d{2}\\)"
        },
        "autoupdate": {
            "architecture": {
                "64bit": {
                    "url": "https://www.7-zip.org/a/7z$cleanVersion-x64.msi"
                },
                "32bit": {
                    "url": "https://www.7-zip.org/a/7z$cleanVersion.msi"
                },
                "arm64": {
                    "url": "https://www.7-zip.org/a/7z$cleanVersion-arm64.exe"
                }
            }
        }
    }
    ```