WindowsScript

本文介绍了Windows脚本编程,包括Windows Script Host、VBScript和JScript。内容涵盖对象、属性和方法、常用组件如HTTP、图像处理和文件操作,以及Shell的使用,如模拟按键、执行命令和操作环境变量。此外,还涉及WMI和如何利用它们进行系统管理。

WindowsScript

更多请见个人主页https://www.bajins.com

flag

  • JScriptVBScript同属于官方支持的Windows Script,这俩脚本都需要依赖于特定的宿主(Host)才能执行,
    JavaScript浏览器环境之外,还可以运行在Windows Script Host中。
  • Windows Script Host是一个language-independent的脚本宿主环境,主要用于执行Windows管理任务
  • Windows脚本宿主有两个版本:
    • 一个基于Windows的版本(WScript.exe
      ,它提供用于设置脚本属性的属性表;运行以vbs为后缀的文件
    • 一个基于命令提示符的版本(CScript.exe
      直接执行可查看帮助),它提供命令行。用于设置脚本属性的开关。
      • //E:engine 使用执行脚本的引擎有:VBScriptJScript

WScript对象

所有的Wscript对象都存放在WSHOM.ocx文件中

WScript对象的属性

属性返回值类型说明
ApplicationObject返回 IHost_Class 对象(Wscript 对象)。
ArgumentsIArguments_Class返回 WshArguments 对象(参数集)。
BuildVersionLong返回 Windows 脚本宿主的内部版本。
FullNameString返回宿主可执行文件(CScript.exe 或 WScript.exe)的全路径。
InteractiveBoolean设置或确定脚本模式。
NameStringWScript 对象(宿主可执行文件)的名称。
PathString返回包含宿主可执行文件(CScript.exe 或 WScript.exe)的路径名称。
ScriptFullNameString返回当前运行脚本的完整路径。
ScriptNameString返回当前运行脚本的文件名。
StdInTextStream显示当前脚本的输入流。
StdErrTextStream显示当前脚本的错误输出流。Write输出,WriteLine换行输出
StdOutTextStream显示当前脚本的输出流。Write输出,WriteLine换行输出
TimeoutLong超时设定秒:允许脚本运行的最长时间。
VersionString返回 Windows 脚本宿主的版本。

WScript对象的方法

方法参数返回值说明
ConnectObject(Object As Object, Prefix As String)将对象的事件源连接到具有给定前缀的函数。
CreateObject(ProgID As String, [Prefix As String])Object创建对象。
DisconnectObject(Object As Object)断开已连接对象的事件源的连接。
Echo(ParamArray pArgs() As Variant)将文本输出到消息框中或命令控制台窗口。
GetObject(Pathname As String, [ProgID As String], [Prefix As String])Object检索现有的对象或从文件中创建新对象。
Quit([ExitCode As Long])强制脚本停止执行。
Sleep(Time As Long)在指定的时间长度内将脚本执行挂起,然后继续执行。

常用组件对象

所有对象都可通过Power Shell命令查看属性和方法New-Object -ComObject "对象名称" | Get-Member
获取本机所有COM组件对象脚本 Get-COM-Objects.bat

都在注册表HKEY_CLASSES_ROOT注册表项中,正常情况下项中带有CLSID键的是脚本可创建的

对象说明
WScript.Shell脚本外壳
Wscript.NetWork提供网络连接和远程打印机管理的函数。
ADODB对象说明
ADODB.Command
ADODB.Connection提供数据库连接对象
ADODB.Error
ADODB.Parameter
ADODB.Record
ADODB.Recordset提供数据库返回结果集对象
ADODB.Stream
ADOMD.Catalog
ADOMD.Cellset
ADOX.Catalog包含描述数据源模式目录的集合
ADOX.Column表示表、索引或关键字的列
ADOX.Group表示在安全数据库内有访问权限的组帐号
ADOX.Index表示数据库表中的索引
ADOX.Key表示数据库表中的主关键字、外部关键字或唯一关键字
ADOX.Procedure表示存储的过程
ADOX.Table表示数据库表,包括列、索引和关键字
ADOX.User表示在安全数据库内具有访问权限的用户帐号
ADOX.View表示记录或虚拟表的过滤集
office对象说明
Word.Applicationoffice
Word.Document
Excel.Application提供EXCEL操作对象
Excel.Chart
Excel.Sheet
Outlook.Applicationoffice
PowerPoint.Applicationoffice
MSGraph.Applicationoffice
WIA对象说明
WIA.ImageFile图像处理组件:加载图片
WIA.ImageProcess图像处理组件:转换图片格式
WIA.Rational
WIA.Vector

所有Scripting对象都存放在SCRRUN.DLL文件中

Scripting对象说明
Scripting.Dictionary用来返回存放键值对的字典对象,读取DOS环境变量,读取链接中的设置
Scripting.Encoder编码
Scripting.FileSystemObject提供一整套文件系统操作函数
Scripting.Signer签名
对象说明
AspSmartUpload.SmartUpload
CDO.Configuration
CDONTS.NewMail邮件发送的组件
Huang.UploadFile
InternetExplorer.application
JMail.message邮件发送的组件
MSWC.AdRotator
MSWC.BrowserType
MSWC.NextLink
Shell.ApplicationWindows外壳
SQLOLE.SQLServer
WSHController
System.IO.StringWriter
Collections对象说明
System.Collections.ArrayList包含动态数组的添加元素、删除元素、遍历、统计元素个数、清空
System.Collections.Hashtable
System.Collections.Queue包含队列的添加元素(入队)、删除元素(出队)、遍历、统计元素个数、清空
System.Collections.SortedList
System.Collections.Stack包含堆栈的添加元素(压栈)、删除元素(出栈)、遍历、统计元素个数、清空

HTTP

微软提供了二套API:WinINet, WinHTTP(分别封装于system32目录下的wininet.dllwinhttp.dll内)
二者主要区别在于后者更为安全和稳定,可以说WinHTTPWinINet的升级版

XMLHttpRequest是基于WinInet封装的,而WinHttpRequestServerXMLHTTPRequest则是基于WinHTTP封装的
稳定性属XMLHttpRequest为最差,封装成COM形式主要是为了方便jsvbs等脚本的调用

XMLRequest成员参考缺点:和浏览器挂钩,大多情况下会共享cookiessession、不支持单独设置代理。
优点:和浏览器挂钩,大多情况下会共享cookiessession

ServerXMLHTTP成员参考缺点:系统没有对应dll的情况下程序需要外挂一个dll文件。优点:脱离浏览器,使用代理方便

WinHttpRequest成员参考缺点:暂无。优点:脱离浏览器,使用代理方便,
WinHttp.WinHttpRequest.5.1msxml4.0的底层对象,也就是说XMLHTTPServerXMLHTTP也是在它的基础上封装而来

图像处理

WIA全称:WindowsImageAcquisition,自动化层是一个功能齐全的图像处理组件,可提供端到端的图像处理功能。
WIA自动化层可以轻松地从数码相机,扫描仪或网络摄像头获取图像,以及旋转,缩放和注释图像文件。
WIA Automation Layer取代了Windows Image Acquisition(WIA)1.0提供的WIA脚本模型。

New-Object -ComObject "WIA.ImageFile" | Get-Member

New-Object -ComObject "WIA.ImageProcess" | Get-Member

操作文件

Scripting.FileSystemObject对象提供的功能:New-Object -ComObject "Scripting.FileSystemObject" | Get-Member

对象和集合

对象/集合描述
Drive包含储存设备的信息,包括硬盘、光驱、ram盘、网络驱动器
Drives提供一个物理和逻辑驱动器的列表
File检查和处理文件
Files提供包含在文件夹内的所有文件的列表
Folder检查和处理文件夹
Folders提供在 Folder 内的所有文件夹的列表
TextStream对象。用来读写文本文件。

注意:TextStream对文件只可以从上往下读取,指针无法任意定位,也无法往回走。

方法和属性

方法和属性说明
fso.BuildPath(path,name)将名称附加到现有路径。
fso.CopyFile(src,dst,[overwrite])复制文件,其中overwrite表示文件存在时是否替换,默认为true
fso.CopyFolder用法同CopyFile
fso.CreateFolder(path)创建一个文件夹
fso.CreateTextFile(path)创建一个文件
fso.CreateTextFile(path,[overrwite,unicode])创建一个文本文件
fso.DeleteFile(path,[force])删除文件,其中force表示是否删除只读文件,默认为false
fso.DeleteFolder(path,[force])用法同DeleteFile
fso.DriveExists(drivespec)检查指定的驱动器是否存在。
fso.FileExists(path)判断文件是否存在,返回结果为真或假
fso.FolderExists(path)判断文件夹是否存在,返回结果为真或假
fso.GetAbsolutePathname(path)得到文件的绝对路径
fso.GetBaseName(path)得到文件的不带扩展名的那个文件名
fso.GetDrive(drivespec)返回对应于指定路径中的驱动器的 Drive 对象。
fso.GetDriveName(path)返回指定路径的驱动器名称。
fso.GetExtensionName(path)得到文件的扩展名
fso.GetFile(path)获得指定路径下文件的File对象
fso.GetFileName(path)得到文件的文件名
fso.GetFolder(path)获得指定路径下目录的Folder对象
fso.GetParentFolderName(path)得到文件的父目录
fso.GetSpecialFolder(folderspec)返回某些 Windows 特殊文件夹的路径。
fso.GetTempName()返回随机生成的临时文件或文件夹。
fso.MoveFile(src,dst)移动文件,如果目标有同名文件则会有报错提示文件已存在,可以通过该方法给文件改名
fso.MoveFolder(src,dst)用法同MoveFile
fso.OpenTextFile(path,[mode,create,encoding])打开一个文本文件
object.Attributes表示文件的属性,用各个二制位置位组合表示。1标识只读,2标识隐藏,4标识系统。该属性部分位可读写
object.Close关闭文件
object.Copy(dst,[overwrite])复制文件,overwrite表示目标文件存在时是否覆盖,默认为true
object.Count目录下的项目数,该属性只读
object.DateCreated文件创建时间,该属性只读
object.DateLastAccessed最近访问时间,该属性只读
object.DateLastModified最后修改时间,该属性只读
object.Delete([force])删除文件,force表示是否删除只读文件,默认为false
object.Files得到目录下的所有文件对象集合
object.Move(dst)移动文件,如果目标有同名文件则会有报错提示文件已存在
object.Name文件名称,该属性可读写
object.OpenAsTextStream([ iomode, [ format ]])打开指定文件并返回可用于从该文件读取、写入该文件或追加到该文件的 TextStream 对象。
object.ParentFolder父文件夹,该属性只读
object.Path文件路径
object.Read(个数)读取指定个数的字符
object.ReadAll读取文件中所有内容
object.ReadLine读取一行内容
object.Size文件大小,以字节计
object.Skip(个数)跳过指定个数的字符SkipLine方法
object.SkipLine跳过文件中一行
object.SubFolders得到目录下的所有文件夹对象集合
object.Write(文本内容)写入指定的字符串
object.WriteLine写一行内容
  • fso.OpenTextFile(path,[mode,create,encoding])

mode 模式,缺省为只读方式打开

ForReading=1 以只读方式打开

ForWriting=2 以读写方式打开

ForAppending=8 以附加方式打开

create 不存在时是否创建缺省为否,即不创建文件

encoding 何种方式打开,缺省以ASCII方式

TristateUseDefault=-2 以系统默认方式打开

TristateTrue=-1Unicode方式打开

TristateFalse=0ASCII方式打开

  • fso.CreateTextFile(path,[overrwite,unicode])

overrwite 是否覆盖,缺省为是

unicode 是否以Unicode方式创建,缺省为false,即以ASCII方式创建

Shell

Wscript.Shell对象提供的功能:New-Object -ComObject "Wscript.Shell" | Get-Member

  • Run Exec 执行cmd命令
  • CreateShortcut 创建快捷方式
  • SpecialFolders 访问Windowsshell文件夹
  • Environment 操作环境变量
  • RegRead 从注册表中返回指定的键或值
  • RegWrite 在注册表中设置指定的键或值
  • RegDelete 从注册表中删除指定的键或值
  • SendKeys 模拟按键
  • Popup 显示包含指定消息的消息窗口
  • ExpandEnvironmentStrings 返回环境变量的扩展值
    • ExpandEnvironmentStrings("%USERNAME%") 获取用户名
    • ExpandEnvironmentStrings("%ComputerName%") 获取计算机名
变量名说明
NUMBER_OF_PROCESSORS计算机上运行的处理器数目。
PROCESSOR_ARCHITECTURE用户工作站使用的处理器类型。
PROCESSOR_IDENTIFIER用户工作站的处理器 ID。
PROCESSOR_LEVEL用户工作站的处理器级。
PROCESSOR_REVISION用户工作站的处理器版本。
OS用户工作站所用的操作系统。
COMSPEC用于运行“命令提示”窗口的命令(通常为 cmd.exe)。
HOMEDRIVE本地主驱动器(通常为 C 驱动器)。
HOMEPATH用户的默认路径(在 Windows NT 上通常为 usersdefault)。
PATH路径环境变量。
PATHEXT可执行文件的扩展名(通常为 .com、 .exe、.bat 或 .cmd)。
PROMPT命令提示符(通常为 $P$G)。
SYSTEMDRIVE系统所在的本地驱动器(例如,c:)。
SYSTEMROOT系统目录(例如,c:winnt)。和 WINDIR 相同。
WINDIR系统目录(例如 c:winnt)。和 SYSTEMROOT 相同。
TEMP存储临时文件的目录(例如,c:temp)。用户可更改。
TMP存储临时文件的目录(例如,c:temp)。用户可更改。

执行命令

Run

执行命令完成后返回值是一个整数,就是0成功或1失败两个状态。

int Run(string, Variant, Variant)第二个是cmd窗口的风格,第三个是否等待执行完成。

窗口风格说明
0隐藏一个窗口并激活另一个窗口。
1如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。第一次显示该窗口时,应用程序应指定此标志。
2激活窗口并将其显示为最小化窗口。
3激活窗口并将其显示为最大化窗口。
4按最近的窗口大小和位置显示窗口。活动窗口保持活动状态。
5激活窗口并按当前的大小和位置显示它。
6最小化指定的窗口,并按照Z顺序激活下一个顶部窗口。
7将窗口显示为最小化窗口。活动窗口保持活动状态。
8将窗口显示为当前状态。活动窗口保持活动状态。
9如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。还原最小化窗口时,应用程序应指定此标志。
10根据启动应用程序的程序状态来设置显示状态

Exec

返回值是一个对象,从返回对象中可以获得控制台输出信息和控制台错误信息,即StdOutStdErr 属性等。

Exec类具有属性ExitCodeProcessIDStatusStdErrStdInStdOut以及一个函数Terminate

Status属性具有三个值:0为正在执行,1为完成,2为失败

获取输出信息:StdOut.ReadAll()

特殊文件夹

SpecialFolders属性提供WshSpecialFolders对象以便访问Windowsshell文件夹

使用:WshShell.SpecialFolders("strFolderName"),如果没有查询的目录则返回NULL

变量名说明
AllUsersDesktop公共桌面
AllUsersStartMenu公共程式
AllUsersPrograms公共程序
AllUsersStartup公共启动
Desktop桌面
Favorites收藏
Fonts字体
MyDocuments我的文档
NetHood网络
PrintHood打印机
Programs程序
Recent最近
SendTo发给
StartMenu开始菜单
Startup启动
Templates模板
AppData应用程序数据

模拟按键

  • SendKeys键击参数说明

Enter回车建表示{Enter}、字母A表示{A}、数字2表示{2}

示例Wshshell.SendKeys("{Enter}")Wshshell.SendKeys("{A}")Wshshell.SendKeys("{2}")

组合键Shift+代替、Ctrl^代替、Alt%代替

示例Wshshell.SendKeys("+%{DELETE}")Wshshell.SendKeys("^{C}")Wshshell.SendKeys("^{V}")

模拟快捷键Ctrl + S保存内容:Wshshell.SendKeys("^{s}")

VMI

SWBEM脚本是可以用来访问和控制WMI内部对象的一系列可用在脚本中的对象,
脚本通过访问wbemdisp.dll这个library来访问VMI对象,这个仅被设计用来为脚本工作。

WbemScripting.SWbemLocator对象提供的功能:New-Object -ComObject "WbemScripting.SWbemLocator" | Get-Member

查询方式类似sql语句(其实系统信息也是存储在计算中一个类似数据库的文件中)获取我们需要的对象的记录集

WbemScripting对象说明
WbemScripting
WbemScripting.SWbemDateTime
WbemScripting.SWbemLastError
WbemScripting.SWbemLocatorVMIAPI对象
WbemScripting.SWbemObjectPath
WbemScripting.SWbemRefresher
WebPlatStorage.WebPlatStorage
表名说明
Win32_BaseBoard主板
Win32_BIOSBIOS芯片
Win32_BootConfiguration系统启动配置
Win32_CDROMDrive光盘驱动器
Win32_ComputerSystem操作系统信息,系统位数
Win32_DesktopMonitor显示器
Win32_DiskDrive硬盘驱动器
Win32_DiskPartition磁盘分区
Win32_Group系统管理组
Win32_GroupUser系统组帐号
Win32_Keyboard键盘
Win32_LogicalDisk逻辑磁盘
Win32_LogicalMemoryConfiguration逻辑内存配置
Win32_NetworkAdapter网络适配器
Win32_NetworkAdapterConfiguration网络适配器设置
Win32_NetworkClient已安装的网络客户端
Win32_NetworkProtocol已安装的网络协议
Win32_OperatingSystem操作系统信息,系统版本
Win32_PageFile系统页文件信息
Win32_PageFileSetting页文件设置
Win32_ParallelPort并口
Win32_PhysicalMemory物理内存
Win32_PointingDevice点输入设备,如鼠标
Win32_POTSModemMODEM
Win32_POTSModemToSerialPortMODEM端口
Win32_Printer打印机
Win32_PrinterConfiguration打印机设置
Win32_PrintJob打印机任务
Win32_Process系统进程
Win32_ProcessorCPU处理器
Win32_SerialPort串口
Win32_Service系统安装的服务
Win32_Share共享
Win32_SoundDevice多媒体设置
Win32_StartupCommand系统自动启动程序
Win32_SystemDriver驱动程序
Win32_TCPIPPrinterPort打印机端口
Win32_Thread系统线程
Win32_TimeZone时区
Win32_USBControllerUSB控制器
Win32_UserAccount用户帐号
Win32_VideoController显卡细节。
Win32_VideoSettings显卡支持的显示模式。

VBScript

vbs特殊符号

常数描述
vbCrChr(13)回车符。
vbCrLfChr(13)&Chr(10)回车符与换行符。
vbFormFeedChr(12)换页符;在MicrosoftWindows中不适用。
vbLfChr(10)换行符。
vbNewLineChr(13)&Chr(10)或Chr(10)平台指定的新行字符;适用于任何平台。
vbNullCharChr(0)值为0的字符。
vbNullString值为0的字符串与零长度字符串("")不同;用于调用外部过程。
vbTabChr(9)水平附签。
vbVerticalTabChr(11)垂直附签;在MicrosoftWindows中不用

vbs函数封装

数组转换为字符串

'数组转换为字符串
'Writer         Bajins
'Create Date    2019-10-22
'arrayName      数组
'separator      separator
'Example        ConvertArrayToString(array, ",")
Public Function ConvertArrayToString(array, separator)
    Dim elementString

    For Each element In array
        elementString = elementString + Cstr(element) + separator
    Next

    elementString = StrReverse(elementString)
    elementString = Replace(elementString, separator,"",1,1)
    elementString = StrReverse(elementString)
    ' 设置返回值
    ConvertArrayToString = elementString
End Function

获取对象的属性和值

' 获取对象的属性和值
'Writer         Bajins
'Create Date    2019-10-22
'obj            对象
'Example        GetObjectPropertieValue(obj)
Public Function GetObjectPropertieValue(obj)
    IF Not IsObject(obj) Then
        'Exit Function
        Err.Raise Err.Number
    END IF
    
    Dim kv
    
    For Each Propertie in obj.Properties_
       kv = kv & Propertie.name & " : " & Propertie.value & vbCrLf
    Next
    
    kv = "属性数量:" & obj.Properties_.count & vbCrLf & kv
    
    ' 设置返回值
    GetObjectPropertieValue = kv
End Function

获取系统信息

此方式完全不会显示CMD窗口(包括闪现)

' 获取系统位数
'Writer         Bajins
'Create Date    2019-10-22
'Example        GetSystemBit()
Public Function GetSystemBit()
    ' 查找进程,方式一
    'Set WMIService = GetObject("winmgmts:\\.\root\cimv2")
    'Set ComputerSystem = WMIService.ExecQuery("select * from Win32_ComputerSystem")
    ' 查找进程,方式二
    'Set locator = CreateObject("WbemScripting.SWbemLocator")
    'Set WMIService = locator.ConnectServer(, "root\cimv2")
    'Set ComputerSystem = WMIService.ExecQuery("select * from Win32_ComputerSystem")
    ' 查找进程,方式三
    Set WMIService = GetObject("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2")
    Set ComputerSystem = WMIService.InstancesOf("Win32_ComputerSystem")

    For Each System in ComputerSystem
        IF InStr(System.SystemType,"86") > 0 Then
            GetSystemBit = "i386"
            Exit For
        End IF
        
        IF InStr(System.SystemType,"64") > 0 Then
            GetSystemBit = "amd64"
            Exit For
        End IF
    Next

End Function

隐藏窗口运行

' 创建运行命令数组
commands = Array("D:\frp内网穿透工具\frpc.exe -c D:\frp内网穿透工具\frpc.ini")

' 创建运行命令动态数组
'Set commands = CreateObject("System.Collections.ArrayList")
'commands.Add "D:\frp内网穿透工具\frpc.exe -c D:\frp内网穿透工具\frpc.ini"

' 启动项键名称
keyName = "frp"

Set shell = WScript.CreateObject("WScript.Shell")

For Each command In commands
    ' cmd /c运行之后关闭窗口,0隐藏运行,false不同步运行
    shell.Run "cmd /c " & command, 0, false
Next

' 注册表项
item = "HKCU\Software\Microsoft\Windows\CurrentVersion\Run\"

' 设置开机启动
shell.RegWrite item & keyName, WScript.ScriptFullName

查看进程是否存在

ProcesseName="rclone.exe"

' 查找进程
Set WMIService = GetObject("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2")
Set Processes = WMIService.ExecQuery("select * from win32_process where name='" & ProcesseName & "'")

For Each Process In Processes
    ' 比较两个字符串
    If InStr(UCase(Process.name), UCase(ProcesseName)) = 0 Then
        ' 如果进程存在就不重复执行后面的代码
        Exit for
    End If
    ' 运行程序
    Set WS = Wscript.CreateObject("Wscript.Shell")
    WS.Run "rclone mount GDrive:/ x: --cache-dir F:\Temp --vfs-cache-mode writes", 0
Next
System Administration Scripting Guide Script Repository Version 1.0, May 2002 The scripts included in this help file are likely to appear in the forthcoming System Administration Scripting Guide, which will ship as part of the Windows .NET Server Resource Kit. In the Scripting Guide itself, each script will be explained in step-by-step fashion, and instructional material will help you learn how to modify these scripts to suit your unique individual needs. In addition, the book will also teach you how to write your own scripts using VBScript, WMI, ADSI, and other Microsoft Scripting technologies. Most of the scripts are designed to run with either Windows 2000, Windows XP, or Windows .NET Server. Scripts that are not designed to run on all these platforms include a brief note indicating which versions of Windows are required. To use the scripts, copy the appropriate script code, paste it into Notepad or another text editor, and save the file with a .vbs file extension. For more information about these scripts or about the book, contact the Scripting Guide team at scripter@microsoft.com A Note About the WMI Scripts Most of the WMI scripts in this repository create a variable named strComputer, and then set the value of that variable to "." Thus, the scripts generally include this line: strComputer = "." This causes the script to run against the local computer. This is due to the way that the script has been composed, and the fact that WMI views a computer named "." as being the local computer. If you want to run the script against a remote computer, simply replace the "." with the name of the remote computer, surrounded by double quotation marks. For example, this line of code runs the script against a remote computer named PrintServer1: strComputer = "PrintServer1" This is the only change you need to make in order to run the WMI scripts against a remote computer. Bear in mind, however, that you will need to have administrative rights on the remote computer in order for the script to succeed. In addition, WMI must be installed both on the local computer and on the remote computer.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值