掌握PowerShell:基础语法与常用命令详解

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:PowerShell是一种集成在Windows系统中的强大脚本语言和命令行工具,主要用于自动化管理和系统任务。本文详细介绍了PowerShell的基本组件,包括命令提示符窗口、命令集 Cmdlets、管道操作、提供者、变量、数据类型和脚本执行。同时,文档列举了常用的PowerShell命令,如进程管理、目录操作、对象筛选等,并涵盖了一些高级特性如自定义函数和远程管理。通过掌握这些基础知识和命令,用户可以提升管理Windows系统和执行自动化任务的能力。
PowerShell基本语法及常用命令(中文)

1. PowerShell命令行接口概述

PowerShell 是一个强大的命令行接口和脚本环境,专为系统管理和自动化任务而设计。它提供了一种跨平台(Windows、Linux、macOS)的方法,允许用户以统一的方式处理数据。PowerShell 的命令行接口允许用户直接输入命令执行各种操作,而无需通过图形用户界面(GUI)。其核心是基于Cmdlets(读作“command-lets”),这些是一系列小型的、单一功能的命令,能够实现复杂任务的简单处理。

PowerShell 命令行接口的特性包括:
- 跨平台支持,能够运行在多种操作系统上。
- 强大的命令行处理能力,以及对数据流的强大处理。
- 与Windows操作系统的无缝集成,使得执行系统管理任务变得更加容易。

PowerShell 的语法清晰、简洁,便于学习和使用。在后续的章节中,我们将详细探索Cmdlets的使用、管道机制、PowerShell提供者、变量和数据类型、脚本执行方法以及高级特性与远程管理等内容。通过这些内容的学习,读者将能够充分掌握PowerShell这一强大的IT工具。

2. Cmdlets命令集使用

2.1 Cmdlets命令集基础

2.1.1 Cmdlets的命名规则和格式

Cmdlets(发音为 “command-lets”)是PowerShell中最基本的命令元素,它们是轻量级的命令,用于处理数据和执行任务。每个Cmdlet名称都遵循动词-名词的形式,例如 Get-Process ,其中动词(Get)表示要执行的操作,名词(Process)表示操作的对象。这种命名规则不仅帮助用户轻松记忆命令,还遵循一致的语法结构,使得编写PowerShell脚本更加直观。

Cmdlets设计为单功能命令,这意味着每个Cmdlet只做一件事,而且做得很好。这种设计哲学与Unix shell中的工具链方法类似,每个工具完成一个小的、明确定义的任务,然后这些工具可以通过管道组合来完成更复杂的任务。

2.1.2 常见的Cmdlets命令实例

在日常使用中,用户会经常遇到一些特定的Cmdlets,下面将列举一些常用的Cmdlets实例及其用途:

  • Get-ChildItem (别名 dir ls ):用于获取指定位置的文件和文件夹。
  • Get-Process (别名 ps ):列出当前系统中运行的进程。
  • Get-Service :列出系统服务并显示它们的状态。
  • Set-Location (别名 cd ):更改当前工作目录。
  • Write-Host :向控制台输出信息。
  • New-Item :创建新的文件、文件夹或注册表项等。

这些Cmdlets是日常管理和维护工作中最常用的命令,理解并熟练运用这些基础Cmdlets对于提高工作效率至关重要。

2.2 Cmdlets命令集的高级应用

2.2.1 参数和参数集的使用

Cmdlets的强大之处在于它们的参数和参数集,这些参数允许用户以不同的方式配置命令的行为。每个Cmdlet都可以有一组参数,其中一些是位置参数,而另一些则是可选参数。可选参数通常有一个名称,可以使用 -ParameterName 或简写为 -Para 的形式。

例如, Get-ChildItem 命令可以使用 -Recurse 参数递归地搜索文件夹,使用 -Filter 参数来过滤文件,如下所示:

Get-ChildItem -Path "C:\" -Filter "*.txt" -Recurse

此外,一个Cmdlet可能有多个参数集,每个参数集包含一组特定的参数,适用于不同的场景。用户可以通过 -ParameterSetName 参数或简写形式来指定使用哪个参数集。

2.2.2 管道和过滤器的高级使用

PowerShell的另一个强大特性是管道( | ),它允许将一个Cmdlet的输出直接传递给另一个Cmdlet作为输入。这种机制极大地提高了命令的组合性和灵活性。

过滤器的使用可以进一步增强管道的功能。PowerShell提供了 Where-Object Cmdlet(简写为 ? where ),它可以根据指定的条件筛选对象。例如,筛选出特定CPU使用率的进程:

Get-Process | Where-Object { $_.CPU -gt 5 }

在这个例子中, Get-Process 命令的输出被传递到 Where-Object ,后者通过一个脚本块(大括号 {} )来评估每个对象。 $_ 是一个特殊的变量,表示当前正在处理的对象。

2.2.3 命令的组合和嵌套

在PowerShell中,命令可以被组合和嵌套,以创建复杂的任务自动化脚本。用户可以将多个Cmdlets链接在一起,构建一个强大的命令链,从而实现单个Cmdlet无法完成的功能。

例如,可以结合 Get-Service Where-Object 来查找并停止特定的服务:

Get-Service | Where-Object { $_.Status -eq "Running" -and $_.Name -like "wuauserv" } | Stop-Service

这个例子中, Get-Service 命令用于获取所有服务, Where-Object 用于筛选状态为运行且服务名为 wuauserv 的服务,最后 Stop-Service 命令用于停止这些服务。

命令的组合和嵌套使得PowerShell能够应对各种复杂场景,实现自动化管理和故障排除,这也是为什么PowerShell对于IT专业人员来说非常有价值的工具。

3. PowerShell管道机制

3.1 管道机制的基本原理

管道是PowerShell中一个核心的概念,它的作用是将一个命令的输出直接作为下一个命令的输入。这种机制极大地简化了命令行操作的复杂性,使得用户可以通过简单的命令组合,完成复杂的数据处理任务。

3.1.1 管道的数据流模型

管道的数据流模型可以类比于现实世界中工厂的装配线。在PowerShell中,每个命令都可以看作是一个加工站,它们接收输入数据,进行加工处理,然后输出结果,再由下一个命令接收继续处理。一个典型的管道命令可以表示为:

Command1 | Command2 | Command3 ...

在这里, | 符号就是管道操作符,它把左侧命令的输出直接传递给右侧的命令作为输入。

3.1.2 管道命令的构建和执行

构建和执行一个管道命令的过程实际上是一个数据流动的过程。用户首先发出一个命令,该命令生成输出,这些输出立即成为下一个命令的输入。这个过程会一直重复,直到管道中的命令全部执行完毕。

下面是一个简单的管道命令示例:

Get-Process | Where-Object { $_.CPU -gt 100 } | Sort-Object Handles -descending | Select-Object -first 5

这个命令链的作用是获取当前所有运行中的进程,筛选出CPU使用率大于100的进程,然后按句柄数量降序排序,并最终选择句柄数量最多的前5个进程显示出来。

3.2 管道机制的进阶应用

进阶应用是指超出基础数据流模型的管道操作,这包括了使用管道与脚本块的结合等。

3.2.1 高级管道操作符的使用

PowerShell除了基本的管道操作符 | 外,还提供了如 % (ForEach-Object的别名)、 ? (Where-Object的别名)等高级操作符。这些操作符能够在不增加额外命令的情况下,实现更复杂的数据处理功能。

例如, ForEach-Object 可以对每个管道中的对象进行自定义操作,下面代码展示了如何使用 ForEach-Object 来列出当前目录下所有文件的详细信息:

Get-ChildItem | ForEach-Object { Get-Item $_.FullName }
3.2.2 管道与脚本块的结合使用

在PowerShell中,脚本块是一种特殊的代码块,它可以像对象一样被传递、调用和返回。管道与脚本块的结合使用为PowerShell带来了极为强大的灵活性。

脚本块通常使用 {} 来定义,下面是一个结合使用管道和脚本块的例子,该示例中脚本块通过 $_ 来引用当前管道对象:

Get-Process | ForEach-Object { if ($_.CPU -gt 100) { $_ } }

这段代码会筛选出当前所有CPU使用率超过100的进程。在这个例子中, $_ 代表了管道传递过来的当前进程对象。

通过以上章节的介绍,我们已经了解到PowerShell管道机制的内在原理及其在日常使用中的进阶技巧。管道机制不仅简化了数据处理的复杂度,也极大地提高了PowerShell命令行的灵活性和效率。在下一章节中,我们将深入探讨PowerShell提供者功能,了解如何通过提供者访问和管理不同类型的系统资源。

4. PowerShell提供者功能

4.1 PowerShell提供者的基本概念

4.1.1 提供者的定义和功能

PowerShell提供者(Providers)是PowerShell的一个重要特性,它允许用户像操作文件系统一样操作各种数据存储,比如注册表、环境变量、证书存储和ADSI等。提供者将这些数据存储抽象为类似于文件系统的层级结构,使得通过统一的方式访问和管理这些数据变得更加容易。

提供者使用驱动程序的概念,每个驱动程序对应一种类型的数据存储。驱动程序通常用冒号(:)作为前缀,例如 HKCU: 表示当前用户的注册表项, HKLM: 表示本地机器的注册表项。

4.1.2 常用的PowerShell提供者

  • FileSystem Provider ( FileSystem: ) : 用于访问和操作文件系统,是默认提供者,支持路径和文件操作。
  • Registry Provider ( Registry: ) : 允许用户浏览和修改Windows注册表。
  • Certificate Provider ( Cert: ) : 管理计算机和用户的证书存储。
  • Variable Provider ( Variable: ) : 列出和操作PowerShell中的变量。
  • Function Provider ( Function: ) : 列出和操作PowerShell函数。
  • Environment Provider ( Env: ) : 显示和操作系统环境变量。

4.2 PowerShell提供者的高级使用

4.2.1 提供者的定制和扩展

PowerShell允许用户定制和扩展提供者,以适应特定的需求。这可能包括注册新的提供者,或者对现有提供者进行自定义视图的创建。例如,可以创建一个提供者来访问企业内部的某个特定服务或应用的数据。

示例:创建一个自定义的提供者

这里展示如何创建一个简单的自定义提供者,此示例仅用于说明概念,并不是真实可用的代码。

# 假设需要创建一个名为“MyCustomProvider”的提供者
# 在实际开发中,这会涉及到更复杂的步骤

# 注册提供者
Register-PSProvider -Name "MyCustomProvider" -AssemblyName "MyCustomProviderAssembly"

# 现在"MyCustomProvider"可以在PowerShell中使用

4.2.2 提供者在数据管理中的应用

PowerShell提供者在数据管理任务中非常有用,它们提供了一个单一的、统一的接口来访问各种不同类型的数据源。使用提供者,可以对不同数据源执行搜索、排序、选择等操作。

示例:使用Registry Provider来查询特定的注册表项
# 列出HKLM:\SOFTWARE下所有的项
Get-ChildItem -Path "HKLM:\SOFTWARE"

# 查询HKLM:\SOFTWARE\Microsoft下名为PowerShell的项
Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\PowerShell" -Name Version
功能 命令示例
列出项 Get-ChildItem -Path HKLM:\SOFTWARE
查询项属性 Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell -Name Version

通过提供者,可以像操作本地文件系统一样管理注册表项。在进行复杂的管理任务时,了解和利用提供者,可以大大提高效率。

综上所述,PowerShell提供者是操作和管理多种数据源的强大工具,可以极大地简化在PowerShell环境中进行复杂数据操作的任务。通过掌握提供者的使用,你可以更加灵活和高效地控制和自动化数据管理过程。

5. PowerShell变量和数据类型

5.1 PowerShell变量的声明和使用

5.1.1 变量的命名规则和作用域

在PowerShell中,变量的命名非常灵活,可以包含字母、数字和特殊字符,但必须以字母或下划线开头。变量名区分大小写,且不能与PowerShell中的Cmdlets名冲突。变量命名通常采用小驼峰命名法以提高可读性。

PowerShell中的变量作用域决定了变量在不同代码块中的可见性。变量可以在全局、脚本、局部或私有作用域中声明,每个作用域中变量的可见性和生命周期有所不同:

  • Global作用域 :全局作用域中的变量在整个PowerShell会话中都可见和可用。
  • Script作用域 :脚本作用域中的变量只在定义它的脚本内部可见。
  • Local作用域 :局部作用域指的是当前的命令行界面或函数,变量在其中声明后仅限于当前作用域。
  • Private作用域 :私有作用域中的变量仅在声明它的函数或脚本块中可见。

5.1.2 变量值的赋值和修改

PowerShell中变量的赋值操作非常简单,只需要使用等号( = )。例如,声明一个变量并赋值:

$myVariable = "Hello World"

变量的值可以随时修改,只需再次赋值即可。PowerShell会自动处理数据类型和存储空间,无需声明类型。

$myVariable = "New Value"

如果想要删除变量,可以使用 Remove-Variable cmdlet,或者用 Remove-Item 来删除,因为PowerShell将变量当作项(item)看待。

5.2 PowerShell的数据类型

5.2.1 内置数据类型概览

PowerShell内置了多种数据类型,最常见的几种包括:

  • String :文本值,例如“Hello World”。
  • Int :整数,例如123。
  • Boolean :布尔值,例如$true或$false。
  • Array :数组,例如 1, 2, 3 @("a", "b", "c")
  • Hash Table :哈希表,用于存储键值对,例如 @{Key1="Value1"; Key2="Value2"}
  • Object :对象,可以包含多种类型的集合。

PowerShell支持自动类型转换。当你将一个值赋给一个变量时,PowerShell会根据值的性质自动选择合适的数据类型。

5.2.2 数据类型的转换和处理

PowerShell提供了简单的方法来进行数据类型的转换。例如,要将字符串转换为整数,可以使用 [int] 类型转换操作符:

$stringValue = "123"
$intValue = [int]$stringValue

同样,可以将整数转换为字符串:

$stringValue = [string]$intValue

数组和哈希表的创建也非常直观:

$arrayValue = 1, 2, 3, 4, 5
$hashTableValue = @{Name="PowerShell"; Version="7.1"}

处理对象时,可以访问对象的属性和方法,也可以使用过滤器来选择特定的对象。例如,如果你有一个对象数组,可以使用 Where-Object 来过滤特定条件的对象:

$objects = Get-Process | Where-Object {$_.CPU -gt 100}

在上述示例中, Get-Process 是一个获取当前运行进程的cmdlet, Where-Object 用于筛选出CPU使用率超过100的进程。

PowerShell的数据处理能力非常强大,它允许管理员以非常灵活的方式操作数据类型,无论是在单个对象上还是在对象集合上。通过结合使用管道、过滤器和数据类型转换,管理员可以有效地管理复杂的数据结构和执行自动化任务。

6. PowerShell脚本执行方法

6.1 PowerShell脚本的编写和执行

6.1.1 脚本的基本结构和语法

PowerShell脚本文件通常以 .ps1 扩展名结尾,它们可以包含多个命令、函数、类和其他脚本元素。一个简单的PowerShell脚本可能如下所示:

# 获取当前目录
Get-Location

# 列出当前目录内容
Get-ChildItem

# 退出脚本
exit 0

脚本的第一行以 # 开头,表示这是一个注释行,不会被执行。 Get-Location 命令显示当前工作目录, Get-ChildItem 列出当前目录下的所有文件和文件夹,最后 exit 0 表示脚本成功执行并退出, 0 是退出状态码。

PowerShell脚本的语法遵循严格的大写敏感规则。在编写脚本时,应使用完整的Cmdlets名称,除非在脚本顶部使用了别名。此外,PowerShell默认不执行脚本文件,除非你明确更改了执行策略。脚本中可以使用变量、循环、条件语句、函数等元素。例如:

# 定义变量
$variable = "Hello, World!"

# 输出变量内容
Write-Host $variable

# 条件语句
if ($variable -eq "Hello, World!") {
    Write-Host "The variable has the correct value."
} else {
    Write-Host "The variable has an incorrect value."
}

# 循环
for ($i = 0; $i -lt 5; $i++) {
    Write-Host $i
}

6.1.2 脚本的调试和错误处理

PowerShell 提供了强大的调试功能,包括设置断点、单步执行、查看和修改变量值等。调试前,确保脚本具有调试信息:

# 启用调试信息
$DebugPreference = "Continue"

使用 Set-PSBreakpoint 命令可以设置断点:

# 在特定行设置断点
Set-PSBreakpoint -Script "C:\path\to\your\script.ps1" -Line 10

要调试脚本,请使用 Start-PSHostProcess 命令或从 PowerShell 控制台执行脚本。

在脚本中进行错误处理非常重要,以确保在出现意外情况时能够优雅地处理。PowerShell 提供了 try-catch-finally 块来处理错误:

try {
    # 尝试执行的代码
    Get-ChildItem -Path "C:\不存在的路径"
} catch {
    # 捕获错误时执行的代码
    Write-Warning "An error has occurred: $_"
} finally {
    # 无论是否出现错误都会执行的代码
    Write-Host "Execution complete."
}

6.2 PowerShell脚本的安全和管理

6.2.1 脚本执行策略的配置和应用

PowerShell 提供了执行策略来控制脚本的执行。默认情况下,PowerShell 不会执行任何脚本。你可以使用 Get-ExecutionPolicy 查看当前的执行策略:

Get-ExecutionPolicy

要更改执行策略,使用 Set-ExecutionPolicy

# 更改执行策略为 RemoteSigned
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

在这个命令中, RemoteSigned 策略要求所有从 Internet 下载的脚本必须由受信任的发布者签名。本地脚本可以无签名运行。

6.2.2 脚本的加密和数字签名

为了进一步提高脚本的安全性,你可以使用加密和数字签名。加密可以保护脚本内容不被未授权用户查看,而数字签名可以验证脚本的完整性和来源。

使用 Protect-CmsMessage 命令可以加密脚本内容:

# 加载要加密的脚本内容
$scriptContent = Get-Content .\script.ps1 -Raw

# 加密脚本内容
$encryptedContent = Protect-CmsMessage -To "recipient@example.com" -Content $scriptContent

# 将加密后的脚本内容保存到文件
$encryptedContent | Set-Content .\encrypted_script.ps1

要对脚本进行签名,可以使用 Set-AuthenticodeSignature

# 对脚本文件进行签名
Set-AuthenticodeSignature -FilePath .\script.ps1 -Certificate (Get-ChildItem Cert:\CurrentUser\My\1234567890)

在这个例子中, -Certificate 参数需要一个有效的数字证书。

通过这些安全措施,管理员可以确保脚本的机密性和完整性,防止未授权用户的篡改。

7. PowerShell高级特性与远程管理

7.1 PowerShell高级特性

7.1.1 PowerShell的模块化编程

PowerShell的模块化编程允许开发者和管理员创建可重用的代码块,这些代码块可以被组织成模块。模块化是通过 PowerShell 模块实现的,模块是一组相关的功能,如 Cmdlets、函数、变量和别名,它们被封装在一个或多个文件中。模块的引入极大地提高了代码的可维护性和可扩展性。

创建模块的一个简单示例,你可以创建一个名为 MyModule.psm1 的文件,内容如下:

# MyModule.psm1

Function SayHello {
    param ([string]$Name)
    "Hello, $Name!"
}

Export-ModuleMember -Function SayHello

在这个示例中, SayHello 函数被导出,意味着当模块被导入时,该函数可用。

然后,你可以通过以下方式将模块导入到 PowerShell 会话中:

Import-Module .\MyModule.psm1

现在, SayHello 函数可以在你的会话中使用。

模块化编程的高级特性还包括使用动态参数和执行环境感知的脚本。例如,你可以创建一个根据运行环境(如本地或远程服务器)加载不同配置的模块。

7.1.2 PowerShell的事件处理和日志记录

事件处理允许 PowerShell 脚本或命令响应系统事件,比如文件变化、系统消息或其他应用程序事件。事件可以是同步的,也可以是异步的,这对于创建复杂的自动化任务或监控环境非常有用。

下面的代码示例演示了如何注册并处理一个简单的事件:

Register-WmiEvent -Class Win32_ProcessStartTrace -SourceIdentifier ProcessStart -Action {
    Write-Host "A new process has started with name $EventArgs.ProcessName"
}

# 在不同的控制台执行
Start-Process notepad

# 清除事件注册
Unregister-Event -SourceIdentifier ProcessStart

在这个例子中,每当有新的进程启动时,就会触发一个事件,并执行指定的 Action 块。

日志记录是 PowerShell 的另一个高级特性,可以将脚本或命令的执行过程记录下来,以便事后分析和调试。你可以使用 Write-Log 函数将信息记录到日志文件中。

function Write-Log {
    param(
        [string]$Message,
        [ValidateSet('Error', 'Warn', 'Info')]
        [string]$Level = 'Info',
        [string]$LogPath = $env:TEMP
    )

    $LogMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - $Level - $Message"
    Add-Content -Path (Join-Path -Path $LogPath -ChildPath 'MyLog.log') -Value $LogMessage
}

Write-Log -Message "This is an informational message."

通过上述方法,你可以创建详细的日志条目,用于跟踪和记录重要事件或错误。

7.2 PowerShell远程管理

7.2.1 远程命令的执行和管理

PowerShell 提供了强大的远程管理能力,允许管理员从本地机器执行命令和脚本到远程机器。这通过使用 Invoke-Command 命令实现。远程命令执行是通过 PowerShell 的会话(Session)来管理的,会话是连接到远程计算机后形成的一个持久的连接。

以下是一个简单的例子,展示了如何在远程计算机上执行 Get-Process 命令:

Invoke-Command -ComputerName "RemoteComputer" -ScriptBlock { Get-Process }

在这个命令中, -ComputerName 参数指定要远程连接的计算机的名称, -ScriptBlock 参数包含了要在远程计算机上执行的脚本。

Invoke-Command 还允许你定义凭据,使用 -Credential 参数,这在需要管理员权限执行命令时非常有用:

$Credential = Get-Credential
Invoke-Command -ComputerName "RemoteComputer" -Credential $Credential -ScriptBlock { Get-Process }

为了提高效率,可以建立一个持久的远程会话,这样就不需要为每次命令重新建立连接:

$Session = New-PSSession -ComputerName "RemoteComputer"
Invoke-Command -Session $Session -ScriptBlock { Get-Process }

7.2.2 远程会话和作业的创建和管理

除了执行一次性的远程命令外,PowerShell 还允许管理员创建远程会话和作业。远程会话是一个持续的连接,允许管理员在远程计算机上运行一系列的命令或脚本。创建远程会话后,可以将数据返回到本地机器或留在远程会话中。

远程作业是可以在后台执行的命令,这对于需要较长时间运行的任务非常有用。管理员可以启动一个远程作业,并在完成后检索结果。

创建远程作业的代码示例如下:

Start-Job -ComputerName "RemoteComputer" -ScriptBlock { Start-Sleep 10; "Job completed" }

Start-Job 命令创建了一个作业,可以在远程机器上运行, -ComputerName 参数指定了运行作业的远程计算机的名称。执行完毕后,可以使用 Get-Job Receive-Job 命令来检查作业状态和获取结果。

Get-Job -ComputerName "RemoteComputer" | Wait-Job | Remove-Job

上述代码首先获取了远程计算机上的作业列表,使用 Wait-Job 命令等待所有作业完成,最后用 Remove-Job 命令删除这些作业。

通过这些高级特性,PowerShell 成为了一个功能全面且强大的远程管理工具,极大地扩展了管理员进行系统和网络管理的能力。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:PowerShell是一种集成在Windows系统中的强大脚本语言和命令行工具,主要用于自动化管理和系统任务。本文详细介绍了PowerShell的基本组件,包括命令提示符窗口、命令集 Cmdlets、管道操作、提供者、变量、数据类型和脚本执行。同时,文档列举了常用的PowerShell命令,如进程管理、目录操作、对象筛选等,并涵盖了一些高级特性如自定义函数和远程管理。通过掌握这些基础知识和命令,用户可以提升管理Windows系统和执行自动化任务的能力。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值