PS2EXE 是一个 PowerShell 脚本编译工具,它可以将 PowerShell 脚本(.ps1 文件)转换为 Windows 可执行文件(.exe)。该工具的基础是 Ingo Karstein 的脚本,经过扩展以支持图形用户界面(GUI)。通过一个简单的开关,用户可以选择启用图形界面的输入输出功能,并生成真正的 Windows 可执行文件。

PowerShell Gallery | ps2exe 1.0.15

GitHub - MScholtes/PS2EXE: Module to compile powershell scripts to executables

 

PS2EXE

在 Ingo Karstein 的优秀脚本基础上进行扩展,支持图形用户界面(GUI)。通过一个开关激活 GUI 的输入输出,生成真实的 Windows 可执行文件。仅支持编译与 PowerShell 5.x 兼容的脚本。还可选择使用图形前端 Win-PS2EXE。

Ingo Karstein 脚本是一个用于将 PowerShell 脚本转换为独立的可执行文件(EXE)工具的脚本。这种脚本工具可以通过 PowerShell 将 PowerShell 脚本编译成 Windows 可执行文件,允许用户将脚本以应用程序的形式运行,而无需依赖于 PowerShell 环境。

特点和功能:

  • 转换功能:它能够将 PowerShell 脚本转化为独立的 EXE 文件,方便用户在没有安装 PowerShell 的环境中运行。
  • GUI 支持:该脚本提供了对图形界面(GUI)的支持,可以创建带有图形界面的应用程序,而不仅限于控制台模式。
  • 多种参数选项:如 -DPIAware-winFormsDPIAware 等,用于改善用户界面的显示,尤其是在不同的 Windows 版本和设备上。
  • 进度条和提示:它支持在脚本中添加动画进度条,并且能够处理嵌套的进度条,提升用户体验。
  • 安全性和编码支持:该脚本支持 Unicode 编码输出,并修复了多个安全性和稳定性问题,提升了用户体验。

为什么使用:

  • 独立运行:对于没有 PowerShell 环境的用户,可以将 PowerShell 脚本转化为 EXE 格式,使其无需依赖 PowerShell 环境。
  • 用户界面:允许开发者为 PowerShell 脚本创建更友好的图形界面,提供更直观的用户体验。
  • 进度和反馈:支持实时反馈进度,尤其适用于需要长时间运行的脚本任务,如批量处理等。

该脚本提供了许多灵活的参数,使得 PowerShell 脚本的功能可以通过图形界面或命令行执行,尤其适合需要在 Windows 系统中分发和运行脚本的开发者。

Ingo Karstein 脚本的底层原理涉及将 PowerShell 脚本编译成独立的可执行文件(EXE),这是通过将 PowerShell 代码打包成 .NET 程序来实现的。具体的工作原理包括以下几个方面:

1. 使用 .NET 打包 PowerShell 脚本

Ingo Karstein 脚本利用了 .NET 编译器技术,将 PowerShell 脚本嵌入到一个 .NET 应用程序中,从而将 PowerShell 代码打包成一个独立的可执行文件(EXE)。这使得原本需要在 PowerShell 环境中运行的脚本可以在没有 PowerShell 安装的机器上运行。底层是通过以下几个步骤来实现的:

  • 嵌入 PowerShell 代码:PowerShell 脚本的内容被嵌入到 C# 或其他 .NET 语言的程序中,这个程序负责加载和执行 PowerShell 脚本。
  • 封装为 EXE:通过使用 .NET 编译器(如 Visual Studio)或其他工具,代码被打包成 EXE 文件。EXE 文件内部包含了 PowerShell 脚本和必要的运行时组件,使得它能够独立运行。

2. 集成 PowerShell 环境

为了使脚本能够在没有 PowerShell 环境的机器上运行,Karstein 脚本在 EXE 文件中集成了一个嵌入式 PowerShell 运行时。这意味着:

  • PowerShell 引擎的集成:它通过内嵌一个 PowerShell 引擎实例,来解析和执行脚本。这个引擎通常是通过 .NET API (System.Management.Automation) 来调用 PowerShell 的核心功能。
  • 嵌入 PowerShell 执行模型:EXE 文件内部的 PowerShell 脚本通过 API 调用的方式启动和执行。通过这种方式,脚本的行为和 PowerShell 中的执行模型基本一致。

3. 图形界面和 Windows 窗体支持

Ingo Karstein 脚本还允许用户通过 Windows 窗体(WinForms)为 PowerShell 脚本创建图形用户界面(GUI)。底层原理是:

  • WinForms 集成:在打包过程时,Karstein 脚本支持通过 .NET Framework 来构建 Windows 应用程序的用户界面。使用 WinForms,可以让开发者创建按钮、文本框、进度条等控件,从而将 PowerShell 脚本包装成具有交互界面的应用程序。
  • DPI 支持:为了确保 GUI 在不同分辨率的设备上能够正常显示,Ingo Karstein 脚本提供了 -winFormsDPIAware 参数,允许用户根据屏幕的 DPI 设置自动缩放界面元素,增强跨设备的兼容性。

4. 进度条和用户交互

脚本支持多种类型的用户交互,包括命令行和图形界面的进度条。这些功能的实现依赖于:

  • 进度条和事件驱动编程:通过在脚本中使用 .NET 的进度条控件或 PowerShell 的进度显示函数,可以在程序执行时实时反馈进度状态。比如在批处理操作中,脚本可以动态显示当前处理进度。
  • 输入框和消息框:通过 WinForms 控件(如文本框和按钮),脚本可以获取用户输入或向用户显示提示信息。

5. 转换工具与编译器

Ingo Karstein 脚本本身也提供了编译功能,这使得它能够将 PowerShell 脚本转换为 EXE 文件。它主要利用了以下技术:

  • PS2EXE 工具:这是一款 PowerShell 脚本转换工具,它允许将 PowerShell 脚本封装成独立的可执行文件。Karstein 脚本基于此工具的原理,进行定制化扩展,以支持更多高级功能(如 GUI 支持、DPI 感知等)。
  • PowerShell 运行时:内置的 PowerShell 运行时使得 EXE 文件能够在没有 PowerShell 安装的机器上运行,完全依赖于 EXE 文件内嵌的 PowerShell 引擎。

总结

Ingo Karstein 脚本的底层原理基于将 PowerShell 脚本与 .NET 技术结合,通过嵌入 PowerShell 引擎和 GUI 支持库,将脚本转换为独立的可执行文件。它不仅支持命令行模式,还能够创建图形界面,增强了脚本的可用性和跨平台兼容性。通过这种方式,用户可以在没有 PowerShell 环境的计算机上执行脚本,同时还可以提供丰富的用户交互和界面设计功能。

模块版本

脚本版本请参考 GitHub 页面

作者:Markus Scholtes

版本:1.0.15

发布日期:2025年1月5日


PS2EXE 是一个 PowerShell 脚本编译工具,它可以将 PowerShell 脚本(.ps1 文件)转换为 Windows 可执行文件(.exe)。该工具的基础是 Ingo Karstein 的脚本,经过扩展以支持图形用户界面(GUI)。通过一个简单的开关,用户可以选择启用图形界面的输入输出功能,并生成真正的 Windows 可执行文件。

主要特点:

  1. GUI 支持:PS2EXE 允许在生成的可执行文件中启用图形用户界面,这对于需要用户交互的程序来说非常有用。
  2. PowerShell 5.x 兼容:它只支持将与 PowerShell 5.x 兼容的脚本编译为可执行文件。
  3. 简单的命令行操作:只需使用一个命令,便可以将 PowerShell 脚本转化为独立的可执行文件。
  4. 可选的图形前端:提供了一个图形界面工具 Win-PS2EXE,方便那些不熟悉命令行的用户操作。

使用场景:

  • 将 PowerShell 脚本转化为可执行文件后,可以在没有 PowerShell 环境的机器上运行。
  • 对于需要图形界面的 PowerShell 脚本,可以通过 PS2EXE 转换并启用 GUI,使其更加易用。

安装与使用:

  • 通过 PowerShell 命令 Install-Module ps2exe 安装。
  • 使用命令 Invoke-ps2exe .\source.ps1 .\target.exe 将 PowerShell 脚本编译为可执行文件。

PS2EXE 适用于需要将 PowerShell 脚本转化为可执行文件,并希望为最终用户提供简单图形界面交互的情况。


PS2EXE 的底层原理主要是基于 PowerShell 脚本与 Windows 可执行文件(.exe)的转换机制,利用了 PowerShell 的一些特性以及特定工具和框架来实现这一过程。以下是 PS2EXE 转换原理的核心组成部分:

1. 脚本嵌入机制

  • 嵌入 PowerShell 脚本:PS2EXE 将 PowerShell 脚本文件(.ps1)嵌入到生成的可执行文件(.exe)中。这个过程类似于将脚本内容编码成一种特定的格式并包含在 .exe 文件内部。
  • 数据资源嵌入:在可执行文件中,脚本通常作为二进制资源(例如,通过 .rsrc 部分)嵌入,而不是直接在可执行文件的代码中。因此,生成的 .exe 文件内部包含了整个 PowerShell 脚本,但它是隐藏在可执行文件中的,无法直接查看或修改。

2. 使用 PowerShell Host 环境

  • PowerShell Host:PS2EXE 通过使用 Windows 中的 PowerShell 主机(Host)来加载并执行嵌入的 PowerShell 脚本。简单来说,它通过加载一个自定义的 PowerShell 环境,并运行嵌入的脚本。这使得脚本在没有 PowerShell 环境的情况下也能独立执行。
  • 启动脚本:当执行编译后的 .exe 文件时,文件首先启动一个 PowerShell 主机,然后通过该主机解释和执行嵌入的 PowerShell 脚本。

3. 利用 C# 编写启动器

  • C# 启动器代码:PS2EXE 工具本质上会生成一个 C# 编写的启动器,该启动器负责加载嵌入的 PowerShell 脚本并在 PowerShell 主机环境中运行它。C# 启动器是生成的 .exe 文件的“核心”,它会通过 Windows API 将 PowerShell 环境引入并初始化脚本执行过程。
  • 无外部依赖:编译后的 .exe 文件不需要外部 PowerShell 依赖环境,因此它通过 C# 代码动态加载 PowerShell 脚本,使得其能够在没有 PowerShell 环境的系统中运行。

4. 可执行文件封装

  • 打包为单一文件:在转换过程中,PS2EXE 将整个 PowerShell 脚本与启动代码打包成一个单一的可执行文件。这意味着,用户可以通过双击 .exe 文件,直接运行 PowerShell 脚本,而无需任何额外的配置。
  • 文件大小增加:由于 PowerShell 脚本和启动器代码都被嵌入到可执行文件中,因此生成的 .exe 文件会比原始的 PowerShell 脚本文件要大。文件大小的增加与脚本复杂度和依赖项相关。

5. 图形界面支持

  • 图形界面实现:当 PS2EXE 生成的可执行文件需要图形用户界面(GUI)时,工具会通过一个简单的 Windows Forms 应用程序框架,使用 C# 来创建窗口界面。这种方式使得用户可以在运行脚本时与之进行交互,而不是仅依赖命令行输入输出。
  • GUI 调用:如果启用了图形界面选项,PS2EXE 会在 C# 启动器中集成一个基本的 GUI 组件(例如窗口、按钮等),并通过事件驱动机制(如点击按钮、文本框输入等)来触发 PowerShell 脚本中的功能。

6. 错误处理与调试机制

  • 错误捕捉和日志记录:PS2EXE 在生成的 .exe 文件中集成了基本的错误捕捉和日志记录机制。当执行的 PowerShell 脚本遇到错误时,工具能够捕捉到这些错误并通过 C# 启动器进行处理。错误信息通常会输出到日志文件,或者通过图形界面显示给用户。
  • 调试支持:由于生成的可执行文件是经过编译的,它不支持直接调试 PowerShell 脚本。但在开发过程中,开发者可以通过命令行工具或 GUI 工具调试脚本,确保无误后再进行编译。

7. 脚本加密与保护

  • 脚本加密:通过将 PowerShell 脚本嵌入可执行文件,PS2EXE 提供了一定程度的脚本保护。尽管嵌入的脚本不是完全加密的,但它会隐藏在可执行文件中,增加了对脚本内容的访问难度。
  • 安全性限制:虽然 PS2EXE 不对脚本进行加密,但嵌入式脚本的方式能有效防止普通用户查看和修改脚本内容,尤其是在分发给客户时,提供了一定的安全性。

总结

PS2EXE 通过将 PowerShell 脚本嵌入到一个 C# 编写的 Windows 可执行文件中,并利用 PowerShell 主机环境来执行这些脚本,实现了 PowerShell 脚本的独立运行。它的底层原理包括 PowerShell 脚本的封装、C# 启动器的创建、图形界面支持、错误处理机制、以及一定程度的脚本保护。


PS2EXE 的功能可以根据其特性和用途进行以下几类分类:

1. PowerShell 脚本编译

  • 脚本编译为可执行文件:PS2EXE 的核心功能是将 PowerShell 脚本(.ps1 文件)转换为 Windows 可执行文件(.exe)。这一功能使得原本只能在 PowerShell 环境中运行的脚本,变得可以独立运行,无需依赖 PowerShell 环境。

2. 图形用户界面(GUI)支持

  • GUI 开关:PS2EXE 允许用户通过开关启用图形用户界面(GUI)。当启用时,生成的可执行文件可以拥有用户界面,支持与用户的交互。
  • 图形前端工具:提供 Win-PS2EXE 作为图形前端,便于用户通过简单的界面进行编译操作,而不需要使用命令行。

3. PowerShell 5.x 兼容性

  • 仅支持 PowerShell 5.x 兼容脚本:PS2EXE 仅支持将与 PowerShell 5.x 版本兼容的脚本编译成可执行文件。因此,使用该工具的前提是脚本必须符合 PowerShell 5.x 的规范和功能。

4. 增强的可执行文件功能

  • 包含脚本和依赖项:编译后的可执行文件将包含原始 PowerShell 脚本的所有内容,并且可能包括依赖项(如模块),使其能够在没有 PowerShell 环境的机器上正常运行。
  • 输出为标准 .exe 文件:编译过程生成的是标准的 Windows 可执行文件,用户可以像运行其他程序一样运行这些文件,而无需预先安装 PowerShell。

5. 命令行与图形界面结合使用

  • 命令行操作:PS2EXE 支持通过命令行工具进行操作,适合熟悉 PowerShell 的开发人员和系统管理员。
  • 图形界面(Win-PS2EXE):对于不熟悉命令行的用户,PS2EXE 提供了 Win-PS2EXE 作为图形界面工具,简化了操作流程。

6. 可定制性和灵活性

  • 参数和选项设置:PS2EXE 提供了多个参数和设置选项,允许用户根据需求自定义编译过程。例如,可以指定目标文件名、设置是否启用图形界面等。

总结:

PS2EXE 的功能涵盖了 PowerShell 脚本的编译、图形界面支持、PowerShell 5.x 的兼容性、可执行文件的生成,以及命令行和图形界面的结合使用。它为开发人员和管理员提供了便捷的工具,将 PowerShell 脚本转化为独立的可执行文件,使得脚本可以更广泛地分发和执行。


PS2EXE 的应用场景非常广泛,主要适用于以下几种情况:

1. 将 PowerShell 脚本转化为可执行文件

  • 简化分发与执行:当你编写了一个 PowerShell 脚本,并希望在没有 PowerShell 环境的机器上运行时,可以使用 PS2EXE 将其转化为可执行文件(.exe)。这样,接收方不需要事先安装 PowerShell 环境,能够轻松运行该程序。
  • 无需安装 PowerShell:某些企业环境可能不允许安装 PowerShell,或是 PowerShell 版本不兼容。通过将脚本转化为独立的可执行文件,解决了这些环境中的执行问题。

2. 创建带有图形界面的脚本应用

  • 图形界面支持:PS2EXE 提供图形用户界面(GUI)功能,让开发者可以创建拥有图形界面的脚本应用程序,而无需深入学习开发桌面应用程序的复杂技术。适用于需要用户交互的场景,比如表单输入、数据展示等。
  • 企业内部工具:对于内部使用的自动化工具或管理工具,开发者可以将 PowerShell 脚本转化为带 GUI 的可执行文件,使非技术人员也能够使用。

3. 自动化任务和批处理

  • 批量处理脚本:很多 IT 管理员使用 PowerShell 脚本来自动化服务器管理、系统监控、数据备份等任务。通过 PS2EXE 编译成 .exe 文件,可以方便地在没有 PowerShell 环境的机器上执行这些自动化任务。
  • 定期运行的脚本:如果需要将 PowerShell 脚本作为计划任务定期运行,使用 PS2EXE 可以将脚本编译成可执行文件,确保其能够独立运行,而不依赖于 PowerShell。

4. 分发 PowerShell 脚本的解决方案

  • 保护脚本源码:通过将 PowerShell 脚本转换为可执行文件,能够减少源代码的暴露风险,尤其是当需要发布或分发脚本给客户或第三方时,编译后的可执行文件可以隐藏脚本的具体实现。
  • 简化终端用户体验:如果你为客户或其他非技术人员开发了一个 PowerShell 脚本,通过将其转化为可执行文件,可以大大简化用户操作,只需运行 .exe 文件即可,无需了解 PowerShell 命令行的使用。

5. 开发独立的应用程序

  • 轻量级应用程序开发:开发人员可以使用 PowerShell 来构建一些轻量级的桌面应用程序,尤其是在不需要完整桌面应用程序框架的情况下。例如,创建一些数据采集、日志分析、报告生成等小工具,通过 PS2EXE 转换为可执行文件后,成为一个完整的独立应用程序。
  • 软件原型开发:PS2EXE 适合开发软件原型或小型工具,快速将 PowerShell 脚本转化为 Windows 可执行文件,快速展示一个概念或模型。

6. IT 运维和系统管理

  • 系统配置与管理:IT 运维人员常常使用 PowerShell 脚本进行服务器管理、网络配置、自动化部署等。通过 PS2EXE,运维人员可以将这些脚本转化为可执行文件,方便在不同环境下执行,特别是在不同版本的 PowerShell 环境下执行。
  • 无 PowerShell 环境的远程执行:如果远程系统没有安装 PowerShell 或者使用的是不同版本,PS2EXE 可以确保脚本可以独立执行,无需担心 PowerShell 环境的差异。

7. 安全性与合规性

  • 封装与加密:通过将 PowerShell 脚本转化为 .exe 文件,可以减少脚本代码的暴露,有时也可以利用可执行文件的加密机制来保护脚本内容。这在一些对安全性要求较高的应用场景中尤为重要。
  • 简化合规性管理:某些企业或组织要求所有内部工具都以可执行文件的形式运行,PS2EXE 可以帮助将 PowerShell 脚本转换为符合这些要求的格式。

总结:

PS2EXE 适用于任何需要将 PowerShell 脚本转化为独立可执行文件的场景,尤其是在需要避免依赖 PowerShell 环境、希望提供简洁用户体验或保护脚本源码的情况下。此外,它还非常适合开发带图形界面的桌面应用程序或工具,进一步拓宽了 PowerShell 脚本的使用场景。


Win-PS2EXE 参数的中文翻译和表格化:

参数 说明
-inputFile <file_name> 要转换为可执行文件的 PowerShell 脚本(文件必须为 UTF8 或 UTF16 编码)
-outputFile <file_name> 目标可执行文件名称或文件夹,默认为输入文件名,扩展名为 .exe
-prepareDebug 创建有助于调试的信息
-x86 或 -x64 仅为 32 位或 64 位运行时编译
-lcid <id> 编译后的可执行文件的地区 ID,未指定时使用当前用户的文化设置
-STA 或 -MTA 单线程公寓(STA) 或 多线程公寓(MTA) 模式
-noConsole 生成的可执行文件将是一个没有控制台窗口的 Windows 窗体应用程序
-UNICODEEncoding 在控制台模式下以 UNICODE 编码输出
-credentialGUI 在控制台模式下使用 GUI 提示输入凭据
-iconFile <filename> 编译后可执行文件的图标文件
-title <title> 标题信息(显示在 Windows 资源管理器属性对话框的详细信息选项卡中)
-description <description> 描述信息(不显示,但嵌入在可执行文件中)
-company <company> 公司信息(不显示,但嵌入在可执行文件中)
-product <product> 产品信息(显示在 Windows 资源管理器属性对话框的详细信息选项卡中)
-copyright <copyright> 版权信息(显示在 Windows 资源管理器属性对话框的详细信息选项卡中)
-trademark <trademark> 商标信息(显示在 Windows 资源管理器属性对话框的详细信息选项卡中)
-version <version> 版本信息(显示在 Windows 资源管理器属性对话框的详细信息选项卡中)
-configFile 写入配置文件(<outputfile>.exe.config
-noOutput 生成的可执行文件将不生成标准输出(包括详细信息和信息通道)
-noError 生成的可执行文件将不生成错误输出(包括警告和调试通道)
-noVisualStyles 禁用为生成的 Windows GUI 应用程序启用的视觉样式(仅与 -noConsole 一起使用)
-exitOnCancel 在 Read-Host 输入框中选择“取消”或“X”时退出程序(仅与 -noConsole 一起使用)
-DPIAware 如果启用了显示缩放,则 GUI 控件将根据需要进行缩放(仅与 -noConsole 一起使用)
-requireAdmin 如果启用了 UAC,则编译后的可执行文件仅在提升的上下文中运行(如果需要,将出现 UAC 对话框)
-supportOS 使用最新 Windows 版本的功能(执行 [Environment]::OSVersion 可查看差异)
-virtualize 启用应用程序虚拟化(强制使用 x86 运行时)
-longPaths 如果操作系统启用了长路径(> 260 个字符),则启用长路径(仅适用于 Windows 10)

生成的可执行文件有以下保留参数:

参数 说明
-? [<MODIFIER>] 获取嵌入在可执行文件中的 PowerShell 脚本帮助文本。可以使用可选的参数组合 -? -detailed-? -examples 或 -? -full 获取相应的帮助文本。
-debug 强制调试可执行文件。它会调用 System.Diagnostics.Debugger.Launch()
-extract:<FILENAME> 提取嵌入在可执行文件中的 PowerShell 脚本并将其保存为 FILENAME。脚本不会被执行。
-wait 在脚本执行完毕后,显示“按任意键退出...”并等待按键。
-end 所有后续选项将传递给可执行文件中的脚本。所有前面的选项将由可执行文件本身使用,并不会传递给脚本。

翻译成中文并表格化后的版本:

版本 日期 更新内容
1.0.15 2025-01-05 如果只在 PowerShell Core 中使用,则无需在 PowerShell 5.1 中安装该模块
1.0.14 2024-09-15 新增参数 -? 用于已编译的可执行文件,显示原始 PowerShell 脚本的帮助信息
    在 GUI 模式下,窗口标题为应用程序标题(如果在编译时设置了 -title 参数)
1.0.13 2023-09-26 现在支持脚本目录名中使用 [ 和 ]
    源文件可以大于 16 MB(适用于需要的用户)
    新增 Win-PS2EXE 中的额外参数文本字段
1.0.12 2022-11-22 新增参数 -winFormsDPIAware,在 noConsole 模式下支持 WinForms 缩放(仅适用于 Windows 10 或更高版本)
1.0.11 2021-11-21 修复密码超过 24 个字符的错误
    新增参数 -DPIAware,在 noConsole 模式下支持缩放
    新增参数 -exitOnCancel,在输入框中选择取消时停止程序执行(仅适用于 noConsole 模式)
1.0.10 2021-04-10 参数 outputFile 现在接受目标文件夹(不带文件名)
1.0.9 2021-02-28 新增参数 UNICODEEncoding,以 UNICODE 编码输出
    将参数 debug 更名为 prepareDebug
    最终敢于使用高级参数
1.0.8 2020-10-24 重构
1.0.7 2020-08-21 修复了一个管道中多个进度条同时显示的 bug
1.0.6 2020-08-10 选择提示现在像 PowerShell 一样工作(仅适用于控制台模式)
    支持 PowerShell Core(在后台启动 Windows PowerShell)
    修复了负参数值的处理
    支持动画进度条(仅适用于 noConsole 模式)
1.0.5 2020-07-11 支持嵌套进度条(仅适用于 noConsole 模式)
1.0.4 2020-04-19 默认启用 Application.EnableVisualStyles() 用于 GUI 应用程序,新增参数 -noVisualStyles 以防止启用
1.0.3 2020-02-15 将文件从 UTF-16 转换为 UTF-8,以允许使用 git diff
    忽略控制键的安全字符串请求(仅适用于控制台模式)
1.0.2 2020-01-08 将示例添加到 GitHub
1.0.1 2019-12-16 修复了 ps2exe.ps1 和 Win-PS2EXE 中的“GUI 窗口无限宽度”问题
1.0.0 2019-11-08 第一个稳定版模块版本
0.0.0 2019-09-15 实验版

 

posted @ 2025-06-25 22:21  suv789  阅读(580)  评论(0)    收藏  举报