学习黑客PowerShell的历史、架构与工作原理深度解析
PowerShell的历史、架构与工作原理深度解析 🔍
作者: 海尔辛 | 发布时间: 2025-05-19 12:28:44 UTC
1. PowerShell的历史演变 📜
🔹 诞生背景与起源
PowerShell的诞生源于微软解决Windows管理工具碎片化问题的需求。在PowerShell出现之前,Windows管理员主要依赖:
- 命令提示符(CMD) - 功能有限的命令行界面
- VBScript - 功能更强但语法复杂且不一致
- 各种GUI管理工具 - 难以实现自动化
2002年,微软工程师Jeffrey Snover构思了一个名为Monad的新命令行环境,其设计目标是创建一个全新的自动化框架和脚本语言,以统一Windows的管理体验。
🔹 PowerShell版本演进里程碑
版本 | 发布年份 | 操作系统 | 主要特性与改进 |
---|---|---|---|
v1.0 | 2006 | Windows XP SP2+/Server 2003 SP1+ | 首次发布,命令行Shell、基本脚本能力、管道、提供程序模型 |
v2.0 | 2009 | Windows 7/Server 2008 R2 | 远程处理、后台作业、脚本调试、模块系统、ISE图形化开发环境 |
v3.0 | 2012 | Windows 8/Server 2012 | 工作流功能、改进的帮助系统、计划任务、CIM会话 |
v4.0 | 2013 | Windows 8.1/Server 2012 R2 | Desired State Configuration(DSC)、改进的调试功能、新cmdlet |
v5.0/5.1 | 2016 | Windows 10/Server 2016 | 类支持、包管理(PackageManagement/PowerShellGet)、新的安全功能 |
v6.0 (Core) | 2018 | 跨平台 | 基于.NET Core的开源跨平台版本、舍弃部分Windows特定功能 |
v7.0+ | 2020-2022 | 跨平台 | 统一Windows PowerShell和Core、并行ForEach-Object、错误视图增强 |
🔹 开源转型与跨平台支持
PowerShell最重要的转折点发生在2016年,微软决定将PowerShell开源并支持跨平台。这一决定带来了几个关键变化:
- 重构为.NET Core: PowerShell Core基于跨平台的.NET Core框架重建
- GitHub托管: 完整源代码在GitHub上开放,接受社区贡献
- 跨平台支持: 正式支持Linux和macOS系统
- 双轨发展: Windows PowerShell 5.1继续维护,同时开发PowerShell Core和后续的PowerShell 7
PowerShell 7代表了微软统一PowerShell体验的努力,旨在成为所有平台的单一PowerShell版本,同时尽可能保持与Windows PowerShell 5.1的兼容性。
2. PowerShell架构解析 🏗️
🔹 核心架构组件
PowerShell的架构由多个层次和组件构成:
┌─────────────────────────────────────────────────────┐
│ PowerShell应用程序 │
│ (控制台宿主、ISE、VS Code插件等用户界面) │
└───────────────────────┬─────────────────────────────┘│
┌───────────────────────▼─────────────────────────────┐
│ PowerShell引擎 │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ 脚本解析器 │ │ 解析器 │ │ 格式化系统 │ │
│ └────────────┘ └────────────┘ └────────────┘ │
│ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ 命令发现 │ │ 命令处理器 │ │ 管道处理器 │ │
│ └────────────┘ └────────────┘ └────────────┘ │
└───────────────────────┬─────────────────────────────┘│
┌───────────────────────▼─────────────────────────────┐
│ 命令提供者 │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ Cmdlet │ │ 函数 │ │ 脚本 │ │
│ └────────────┘ └────────────┘ └────────────┘ │
│ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ 别名 │ │ 提供程序 │ │ CIM/WMI命令 │ │
│ └────────────┘ └────────────┘ └────────────┘ │
└───────────────────────┬─────────────────────────────┘│
┌───────────────────────▼─────────────────────────────┐
│ .NET框架/Core运行时 │
└─────────────────────────────────────────────────────┘
🔹 与.NET框架的深度集成
PowerShell与.NET框架的集成是其最重要的架构特性之一:
- 完全访问.NET类库: PowerShell脚本可以直接实例化和使用.NET类
- 对象流管道: PowerShell管道传输的是完整.NET对象,而非纯文本
- 类型系统继承: PowerShell使用.NET类型系统,包括类型转换机制
- 性能优势: 通过调用编译过的.NET方法获得更高执行效率
示例: 在PowerShell中直接使用.NET类
# 创建.NET对象
$list = New-Object System.Collections.ArrayList# 使用.NET方法
$list.Add("Item1")
$list.Add("Item2")# 获取.NET属性
$list.Count# 使用静态方法
[System.Math]::Sqrt(16)
🔹 提供程序(Provider)架构
PowerShell提供程序架构允许以统一方式访问不同数据存储:
┌─────────────────────────────────────────────────────┐
│ PowerShell命令界面 │
│ (Get-Item, Set-Content, Get-ChildItem等通用命令) │
└───────────────┬───────────────┬───────────────┬─────┘│ │ │
┌───────────────▼────┐ ┌────────▼────────┐ ┌────▼─────────────┐
│ FileSystem提供程序 │ │ Registry提供程序 │ │ Certificate提供程序│
│ (访问文件和文件夹) │ │ (访问注册表) │ │ (访问证书存储) │
└────────────────────┘ └─────────────────┘ └──────────────────┘
这种架构使管理员可以使用相同的语法和命令操作不同类型的数据,减少学习曲线:
# 文件系统导航
Get-ChildItem C:\Windows# 注册表导航(使用相同命令)
Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows# 证书导航(仍然使用相同命令)
Get-ChildItem Cert:\LocalMachine\Root
🔹 命令类型层次结构
PowerShell支持多种命令类型,它们形成了一个层次结构:
- Cmdlet: 编译的.NET类,性能最高,通常遵循"动词-名词"命名约定
- 函数: PowerShell脚本代码块,可以接受参数并返回值
- 脚本: 保存在.ps1文件中的PowerShell命令集合
- 别名: 命令的替代名称,增强兼容性和输入效率
- 应用程序: 外部可执行文件(如.exe程序)
- 工作流: PowerShell工作流,支持长时间运行的任务(仅限Windows PowerShell)
PowerShell按特定顺序搜索这些类型的命令:
别名 → 函数 → Cmdlet → 脚本 → 应用程序
3. PowerShell工作原理剖析 ⚙️
🔹 命令发现与执行机制
当你在PowerShell中输入命令时,会发生以下流程:
-
解析阶段:
- 将输入拆分为语言元素(tokens)
- 分析命令语法和参数
- 检查语法错误
-
命令发现:
- 根据命令名在命令查找路径中搜索命令
- 解析别名到实际命令
- 根据命令类型优先级确定要执行的命令
-
参数绑定:
- 将提供的参数值绑定到命令参数
- 应用默认参数值
- 处理参数集选择和验证
-
执行命令:
- 根据命令类型执行相应操作
- 处理返回值或异常
输入 → 解析 → 命令发现 → 参数绑定 → 执行 → 输出
🔹 管道实现原理
PowerShell管道的核心功能是传递完整对象而非文本:
- 对象传递: 上一命令输出的对象集合会传递给下一命令
- 延迟执行: 管道通常采用流处理模式而非一次性处理所有对象
- 参数绑定机制: PowerShell使用两种方法将上一命令的输出绑定到下一命令的参数:
- ByValue绑定: 根据对象类型自动选择合适的参数
- ByPropertyName绑定: 根据对象属性名与参数名匹配进行绑定
# 示例1: ByValue绑定(将Process对象传递给接受此类型的参数)
Get-Process | Stop-Process# 示例2: ByPropertyName绑定(根据属性和参数名匹配)
Get-Service | Select-Object Name, @{Name="ComputerName"; Expression={"localhost"}} | Get-Process
🔹 参数绑定详解
PowerShell如何将命令行参数与命令的声明参数关联起来:
-
位置参数绑定: 根据参数位置进行匹配
Get-Process notepad # "notepad"绑定到-Name参数
-
命名参数绑定: 明确指定参数名称
Get-Process -Name notepad
-
参数别名绑定: 使用参数别名
Get-Process -ProcessName notepad # ProcessName是Name的别名
-
开关参数绑定: 无需值的布尔参数
Get-Process -FileVersionInfo # 仅指定参数名即可激活
-
管道参数绑定:
- ByValue: 基于对象类型匹配参数
- ByPropertyName: 基于对象属性名匹配参数名
🔹 类型系统与转换机制
PowerShell具有强大的类型转换系统:
-
隐式类型转换: PowerShell尝试自动将一种类型转换为另一种类型
$number = "42" # 字符串 $number + 8 # 输出50 (将字符串自动转换为数字)
-
显式类型转换: 使用强制类型转换或类型加速器明确转换类型
[int]"42" # 强制转换为整数 [datetime]"2025-05-19" # 转换为日期
-
类型加速器: PowerShell提供内置的.NET类型快捷方式
# 常用类型加速器 [string] - System.String [int] - System.Int32 [pscustomobject] - System.Management.Automation.PSObject [regex] - System.Text.RegularExpressions.Regex
-
类型验证和失败处理:
# 类型转换失败示例 [int]"cannot convert this" # 产生错误# 使用-as运算符安全转换 "42" -as [int] # 返回42 "cannot convert this" -as [int] # 返回null而不是错误
4. PowerShell工作流程 🔄
🔹 PowerShell会话生命周期
从启动到退出,PowerShell会话经历以下阶段:
-
初始化阶段:
- 加载核心运行时组件
- 初始化内置变量和环境
- 加载配置文件(profiles)
-
配置文件加载顺序:
1. $PSHOME\profile.ps1 (所有用户,所有宿主) 2. $PSHOME\Microsoft.PowerShell_profile.ps1 (所有用户,当前宿主) 3. $HOME\Documents\profile.ps1 (当前用户,所有宿主) 4. $HOME\Documents\Microsoft.PowerShell_profile.ps1 (当前用户,当前宿主)
-
命令执行阶段:
- 接收并处理用户输入
- 执行预定义或交互式脚本
-
结束阶段:
- 释放资源
- 执行终止处理器(如有)
🔹 脚本执行流程
当执行PowerShell脚本(.ps1文件)时,会发生以下流程:
-
脚本载入:
- 检查执行策略
- 读取脚本文件内容
- 解析脚本语法
-
变量作用域处理:
- 创建新的脚本作用域
- 初始化参数变量
- 传播全局变量
-
逐行执行:
- 根据脚本逻辑执行命令
- 处理控制流语句(条件、循环等)
- 捕获和处理错误
-
输出收集:
- 将命令输出传递到输出流
- 收集返回值或输出对象
-
清理和退出:
- 释放脚本作用域
- 返回最终结果或退出代码
🔹 模块加载机制
PowerShell模块是组织和共享代码的主要方式,其加载过程包括:
-
模块发现:
- 按PSModulePath环境变量定义的路径搜索
- 支持多种模块格式(.psm1, .dll, .cdxml)
-
模块导入阶段:
- 读取模块清单(.psd1)获取元数据
- 验证模块兼容性和依赖关系
- 创建模块专用会话状态
-
导出处理:
- 根据模块清单或Export-*声明确定导出内容
- 向当前会话公开命令、变量、类型等
-
访问控制:
- 应用模块内部封装
- 处理可见性控制(公共vs私有函数)
默认的模块自动加载由以下机制处理:
# 首次引用未加载模块中的命令时自动加载
Get-AzureRmVM # 首次使用时自动导入AzureRM.Compute模块# 查看PSModulePath定义的模块搜索路径
$env:PSModulePath -split ';'# 查看已加载的模块
Get-Module# 查看可用模块
Get-Module -ListAvailable
🔹 远程处理工作流
PowerShell远程处理(Remoting)通过Windows远程管理(WinRM)服务实现:
-
连接建立:
- 客户端创建远程会话请求
- 目标服务器通过WinRM接收并验证请求
- 创建远程会话环境
-
命令执行:
- 客户端将命令序列化并发送到远程机器
- 远程机器在隔离环境中执行命令
- 结果序列化并返回客户端
-
数据处理:
- 结果反序列化为本地对象
- 错误和警告保留原始上下文
- 支持进度、调试等流
-
会话管理:
- 支持持久和临时会话
- 会话配置控制用户权限范围
- 断开连接/重新连接能力
# 创建远程会话
$session = New-PSSession -ComputerName "Server01"# 在远程会话中执行命令
Invoke-Command -Session $session -ScriptBlock { Get-Process }# 交互式进入远程会话
Enter-PSSession -ComputerName "Server01"# 断开并稍后重新连接
Disconnect-PSSession -Session $session
Connect-PSSession -Session $session
5. PowerShell内部机制与扩展性 🔌
🔹 内置运行空间(Runspace)架构
PowerShell的每个会话都在一个运行空间中运行,这是执行环境的核心容器:
┌─────────────────────────────────────────────────────┐
│ Runspace │
│ ┌────────────────┐ ┌───────────────────────────┐ │
│ │ Session State │ │ Pipeline │ │
│ │ (变量、函数、别名) │ │ (命令处理和执行通道) │ │
│ └────────────────┘ └───────────────────────────┘ │
│ │
│ ┌────────────────┐ ┌───────────────────────────┐ │
│ │ Provider集合 │ │ Host Interface │ │
│ │ (数据访问抽象层) │ │ (与用户界面的交互接口) │ │
│ └────────────────┘ └───────────────────────────┘ │
└─────────────────────────────────────────────────────┘
PowerShell支持多个并行运行空间,这是并行处理和后台作业的基础:
# 创建新的运行空间
$runspace = [runspacefactory]::CreateRunspace()
$runspace.Open()# 创建PowerShell实例并关联运行空间
$ps = [powershell]::Create()
$ps.Runspace = $runspace# 添加命令并异步执行
[void]$ps.AddScript("Get-Process")
$asyncResult = $ps.BeginInvoke()# 获取结果并清理
$results = $ps.EndInvoke($asyncResult)
$ps.Dispose()
$runspace.Close()
$runspace.Dispose()
🔹 类型扩展机制(ETS/Types.ps1xml)
PowerShell通过类型系统扩展(ETS)允许向任何.NET类型添加自定义属性和方法:
# 显示Process对象的默认属性
Get-Process | Get-Member# 为所有Process对象添加自定义属性
Update-TypeData -TypeName System.Diagnostics.Process -MemberName "MemoryGB" -MemberType ScriptProperty -Value {$this.WorkingSet64 / 1GB
}# 使用新属性
Get-Process | Sort-Object MemoryGB -Descending | Select-Object Name, MemoryGB -First 5
此功能通过两种方式实现:
- 静态定义: 在Types.ps1xml文件中预定义
- 动态扩展: 通过Update-TypeData在运行时添加
🔹 格式化系统(Format.ps1xml)
PowerShell的格式化系统控制对象如何显示在控制台中:
# 检查Process对象的默认格式定义
Get-FormatData -TypeName System.Diagnostics.Process# 创建自定义格式视图
$formatData = @"
<Configuration><ViewDefinitions><View><Name>CustomProcessView</Name><ViewSelectedBy><TypeName>System.Diagnostics.Process</TypeName></ViewSelectedBy><TableView><TableColumnItems><TableColumnItem><PropertyName>Name</PropertyName></TableColumnItem><TableColumnItem><PropertyName>Id</PropertyName></TableColumnItem><TableColumnItem><ScriptBlock>[math]::Round((`$_.WorkingSet/1MB),2)</ScriptBlock><Label>Memory(MB)</Label></TableColumnItem></TableColumnItems></TableView></View></ViewDefinitions>
</Configuration>
"@# 加载自定义格式
$formatData | Out-File -FilePath "$env:TEMP\CustomProcess.format.ps1xml"
Update-FormatData -AppendPath "$env:TEMP\CustomProcess.format.ps1xml"# 查看格式化后的输出
Get-Process
🔹 PowerShell与.NET的集成策略
PowerShell的设计意图是成为.NET的"命令行Shell层":
-
直接.NET互操作:
# 使用.NET类 [System.Diagnostics.Process]::GetProcesses()# 创建和使用.NET对象 $webClient = New-Object System.Net.WebClient $webClient.DownloadString("https://example.com")
-
编程语言设计决策:
- 采用.NET类型系统但增加动态特性
- 简化语法以适应Shell环境
- 添加管道和命令发现等Shell特性
-
扩展模型设计:
- Cmdlet基于.NET类(继承自Cmdlet基类)
- 提供程序基于特定接口实现
- 格式化和类型系统扩展混合使用XML和.NET
-
PowerShell与C#的关系:
┌────────────────────┐ ┌────────────────────┐ │ PowerShell │ │ C# │ │ (脚本语言和Shell) │←───→│ (编译编程语言) │ └────────────────────┘ └────────────────────┘│ │└─────────┬──────────────┘▼┌────────────────────┐│ .NET 框架 │└────────────────────┘
PowerShell和C#优势互补:
- PowerShell优势: 快速原型开发、交互式执行、简化语法、内置命令集
- C#优势: 性能高、强类型检查、支持复杂结构、更丰富的面向对象特性
总结 📝
PowerShell代表了微软对命令行和自动化的现代化愿景,通过将传统Shell的交互性与.NET的强大对象模型相结合,创造了一个独特的自动化平台。
从历史上看,PowerShell的演变反映了IT行业从纯Windows环境向混合和跨平台环境的转变。PowerShell开源和跨平台的支持是微软更广泛的开源战略的一部分。
从架构角度看,PowerShell的核心优势在于:
- 面向对象的管道
- 与.NET的无缝集成
- 统一的数据访问模型(Provider)
- 强大的类型系统和格式化引擎
- 可扩展性和模块化设计
理解PowerShell的内部工作原理和架构设计不仅有助于更有效地使用它,也为创建高级自动化解决方案和自定义工具提供了坚实基础。
PowerShell旅程从这里开始,但探索永无止境。作为一个同时服务于系统管理员、开发人员和安全专业人员的工具,PowerShell的真正潜力只有在不断学习和实践中才能充分发挥。
祝你PowerShell之旅愉快! 🚀
相关文章:
学习黑客PowerShell的历史、架构与工作原理深度解析
PowerShell的历史、架构与工作原理深度解析 🔍 作者: 海尔辛 | 发布时间: 2025-05-19 12:28:44 UTC 1. PowerShell的历史演变 📜 🔹 诞生背景与起源 PowerShell的诞生源于微软解决Windows管理工具碎片化问题的需求。在PowerShell出现之前…...
视觉-和-语言导航的综述:任务、方法和未来方向
22年6月来自UC Santa Cruz、澳大利亚的阿德莱德大学和 USC 的论文“Vision-and-Language Navigation: A Survey of Tasks, Methods, and Future Directions”。 人工智能研究的一个长期目标是构建能够用自然语言与人类交流、感知环境并执行现实世界任务的智体。视觉与语言导航…...
JUC入门(四)
ReadWriteLock 代码示例: package com.yw.rw;import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteDemo {public static void main(String[] args) {MyCache myCache new MyCache…...
day 21 常见降维算法
一、无监督降维 定义:这类算法在降维过程中不使用任何关于数据样本的标签信息(比如类别标签、目标值等)。它们仅仅根据数据点本身的分布、方差、相关性、局部结构等特性来寻找低维表示。 输入:只有特征矩阵 X。 目标:…...
代理IP高可用性与稳定性方案:负载均衡、节点健康监测与智能切换策略
一、负载均衡策略:动态分配与场景适配 多算法协同调度 轮询与加权轮询:适用于定时数据采集等低频任务,通过静态IP池按顺序分配请求,避免单一节点过载。例如,静态IP池可支持电商商品价格监控,按固定周期切换…...
C语言:在操作系统中,链表有什么应用?
在操作系统中,链表是一种重要的数据结构,凭借其灵活的内存管理和高效的插入/删除特性,被广泛应用于多个核心模块。以下是其主要应用场景及详细说明: 1. 内存管理:空闲内存块管理 应用场景:操作系统需要管…...
RocketMQ
一、引言 Message Queue(消息 队列),从字⾯上理解:⾸先它是⼀个队列。FIFO先进先出的数据结构——队列。消息队列就是所谓的存放消息的队列。 消息队列解决的不是存放消息的队列的⽬的,解决的是通信问题。 …...
学习BI---QuickBI介绍
BI是什么 BI 数据仓库(存数据) OLAP(多维分析) 数据挖掘(找规律) 可视化(图表/看板) 人话解释就是把企业里乱七八糟的数据变成老板能看懂的报告,帮他们做更聪明的决…...
【数据结构】AVL树的实现
文章目录 1. AVL 的概念2. AVL 树的实现2.1 AVL 树的结构2.2 AVL 树的插入2.2.1 AVL 树插入一个值的大致过程2.2.2 平衡因子更新 2.3 旋转2.3.1 旋转的原则2.3.2 右单旋2.3.3 左单旋2.3.4 左右双旋2.3.5 右左双选 2.4 AVL 树的查找2.5 AVL 树平衡检测 1. AVL 的概念 AVL树是最…...
基于Zynq SDK的LWIP UDP组播开发实战指南
一、为什么选择LWIP组播? 在工业控制、智能安防、物联网等领域,一对多的高效数据传输需求日益增长。Zynq-7000系列SoC凭借其ARM+FPGA的独特架构,结合LWIP轻量级网络协议栈,成为嵌入式网络开发的理想选择。本文将带您实现: LWIP组播配置全流程动态组播组切换技术零拷贝数据…...
【esp32 控制台】-命令
文章目录 1 esp32控制台简介2 控制台命令编程2.1 控制台配置交互设备初始化控制台初始化等待命令输入 2.2 命令实现2.2.1 命令注册 踩坑记录 1 esp32控制台简介 可以通过idf.py monitor调出idf的控制台,结束控制台用ctrl ]。 esp32的控制台就像linux中的shell一样…...
DApp开发全流程解析:模式设计、功能参考与合约管理实践
DApp开发全流程解析:模式设计、功能参考与合约管理实践 引言:Web3.0时代的DApp开发范式 随着区块链技术的成熟,DApp(去中心化应用)已成为Web3.0生态的核心载体。截至2025年,全球DApp数量突破10万…...
I/O多路复用:poll与epoll
一、select/poll与epoll对比 核心区别 特性select/pollepoll内核数据结构数组(线性结构)红黑树(存储监听的fd)内存拷贝每次调用需将fd列表从用户态拷贝到内核态仅在注册fd时拷贝一次(epoll_ctl)内核事件检…...
【调制识别】PGD攻击中参数的含义
在PGD(Projected Gradient Descent)对抗攻击中,代码如下: # 定义PGD对抗样本生成类 class AttackPGD(nn.Module): def __init__(self, model, config):super(AttackPGD, self).__init__()self.model model …...
设备数据看板助力自动化工厂实现生产智能精细化管理
工厂数字化转型需要实现自动化设备生产现场可视化、设备系统间的互联互通,以及数据的智能决策。然而,当前许多制造企业仍面临着传统单机设备同质化严重、数字化服务能力不足、售后成本高企、系统集成效率低下等挑战。企业如何通过自动化装备看板和实时数…...
单点登录是是什么?具体流程是什么?
SSO⼀般都需要⼀个独⽴的认证中⼼(passport),⼦系统的登录均得通过passport,⼦系统本⾝将不参与登录操作,当⼀个系统成功登录以后,passport将会颁发⼀个令牌给各个⼦系统,⼦系统可以拿着令牌会获…...
什么业务需要用到waf
Web应用防火墙(Web Application Firewall,简称WAF)主要用于保护Web应用程序免受各种网络攻击,以下是需要用到WAF的业务类型及具体场景: 一、电子商务业务 业务特点:涉及用户注册、登录、支付等敏感操作&a…...
java中的Servlet4.x详解
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 Servlet 4.x 是 Java EE 8(现 Jakarta EE)规范的一部分,于 2017 年正式发布。作为 Servlet 技术的重大更…...
## Docker 中 Elasticsearch 启动失败:日志文件权限问题排查与解决
好的,这是一份关于你遇到的 Docker Elasticsearch 启动报错问题的笔记,包含问题描述、我的分析判断以及最终的解决方案,适合用于整理成文章。 Docker 中 Elasticsearch 启动失败:日志文件权限问题排查与解决 在使用 Docker部署 E…...
JavaScript:PC端特效--缓动动画
一、缓动效果原理 缓动动画就是让元素运动速度有所变化,最常见的就是让元素慢慢停下来 思路: 让盒子每次移动的距离慢慢变小,速度就会慢慢降下来核心算法:(目标值-现在位置)/10作为每次移动距离的步长停…...
【深度学习新浪潮】什么是多模态大模型?
多模态大模型是人工智能领域的前沿技术方向,它融合了多种数据模态(如文本、图像、语音、视频、传感器数据等),并通过大规模参数模型实现跨模态的联合理解与生成。简单来说,这类模型就像人类一样,能同时“看”“听”“读”“说”,并将不同信息关联起来,完成复杂任务。 …...
C++23 std::mdspan:多维数组处理新利器
文章目录 引言C23简介std::mdspan的定义与特点定义特点 std::mdspan的优势零成本抽象的多维数据访问减少内存开销提高代码灵活性 std::mdspan的应用场景科学计算图形学 相关提案示例代码使用动态扩展使用静态和动态扩展 总结 引言 在C的发展历程中,每一个新版本都带…...
09、底层注解-@Import导入组件
09、底层注解-Import导入组件 Import是Spring框架中的一个注解,用于将组件导入到Spring的应用上下文中。以下是Import注解的详细介绍: #### 基本用法 - **导入配置类** java Configuration public class MainConfig { // 配置内容 } Configuration Impo…...
码蹄集——N是什么、棋盘
MT1223 N是什么 给定一系列数字3、10、21、36…,输入正整数N,输出上述序列的第N个值。从N1开始计数。 格式 输入格式:输入正整数N 输出格式:输出整型 样例 1 输入:5 输出:55 备注:N小于…...
C++中聚合类(Aggregate Class)知识详解和注意事项
一、聚合类(Aggregate Class)概念 聚合(Aggregate) 是 C 中一类特殊的类类型,无用户自定义构造函数、无私有或受保护非静态数据成员、无虚函数、无基类(C11 起基类必须也是聚合且无私有/受保护成员&#x…...
python打卡day30
模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 python的学习就像…...
PostGIS实现栅格数据导出图片标准格式【ST_AsGDALRaster】
ST_AsGDALRaster 函数应用详解:将栅格数据导出为标准图片格式 [文章目录] 一、函数概述 二、函数参数详解 三、关键功能示例 四、GDAL 选项配置指南 五、性能优化建议 六、注意事项与限制 七、应用场景 八、总结 一、函数概述 ST_AsGDALRaster是PostGIS中…...
4.6 sys模块
sys --- 仅作了解 面试之前冲击一下 python的垃圾回收机制 import sys # 1. api_version : 获取python的内部版本号 print(sys.api_version) #1013 # 2. copyright: 获取cpython的版本 print(sys.copyright) #3.getfilesystemencoding() getdefaultencoding():获…...
「HHT(希尔伯特黄变换)——ECG信号处理-第十三课」2025年5月19日
一、引言 心电信号(ECG)是反映心脏电活动的重要生理信号,其特征提取对于心脏疾病的诊断和监测具有关键意义。Hilbert - Huang Transform(HHT)作为一种强大的信号处理工具,在心电信号特征提取领域得到了广泛…...
枪机定焦系统的自动控制装置
枪机定焦系统,作为一种监控设备,通常被广泛应用于各种需要高清、远距离监控的场合。该系统的主要特点是其镜头焦距固定,不能手动或自动调节,从而确保了监控画面的稳定性和清晰度。当提到枪机定焦系统采用自动功能时,可…...
【Unity】Unity中将字典序列化
Unity中将字典序列化,在预制体上能够看到字典的内容,也可以直接在预制体上拖拽给字典赋值 直接上代码 using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine;public class SerializableD…...
VTK|箱体切割器
文章目录 效果实现类头文件实现类源文件如何调用项目git链接 效果 实现类头文件 /*** file BoxClipperController.h* brief 该头文件定义了 BoxClipperController 类,用于管理基于盒子的网格数据裁剪操作。* details 该类提供了使用 vtkBoxWidget 对网格数据进行裁…...
CS50x 01 c
1 getchar() 在 C 语言里,getchar()是一个十分常用的函数,其功能是从标准输入(一般指键盘)读取单个字符。下面为你详细介绍它的用法。 基本语法 getchar()函数的原型定义在<stdio.h>头文件中,语法形式如下&am…...
确保高质量的音视频通话,如何最大化利用视频带宽
在当今数字时代,音视频内容随处可见,对于开发者来说,理解互联网带宽变得至关重要。我们的在线体验质量,无论是观看高清电影还是演唱会直播,都严重依赖于互联网带宽的概念。在本文中,我们将揭示视频带宽的复…...
@RequestParam 和 @RequestBody、HttpServletrequest 与HttpServletResponse
在Java Web开发中,RequestParam、RequestBody、HttpServletRequest 和 HttpServletResponse 是常用的组件,它们用于处理HTTP请求和响应。下面分别介绍它们的使用场景和使用方法: 1. RequestParam RequestParam 是Spring MVC框架中的注解&am…...
HashMap 的特点及应用场景
一、HashMap 核心特点 1. 基本特性 键值对存储:基于 Map 接口实现,存储 Key-Value 对 允许 null 键/值:可以有一个 null 键和多个 null 值 非线程安全:多线程环境下需要额外的同步措施 无序存储:不保证元素的插入顺…...
day30 python 模块、包与库的高效使用指南
目录 一、Python库的分类与适用场景 表格 1.1 基础工具库 1.2 科学计算库 1.3 数据分析库 1.4 Web开发库 1.5 机器学习库 1.6 自动化脚本库 1.7 网络爬虫库 二、模块与包的导入方式 2.1 标准导入 2.2 从模块中导入特定项 2.3 非标准导入(不推荐&#x…...
JVM核心配置参数详解与调优指南
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 引言 Java虚拟机(JVM)的配置参数直接影响应用程序的性能、稳定性和资源利用率。合理配置参数能够显著提升吞吐量、降低延迟并避免内存…...
python打卡第30天
知识点回顾: 一,导入官方库的三种手段。 使用 import 直接导入整个模块 import module_name 使用 from ... import ... 导入特定功能 from module_name import function_name 使用 as 关键字重命名模块或功能 import module_name as alias # 或 from mod…...
数据要素及征信公司数据要素实践
数据要素及征信公司数据要素实践 1.数据要素的定义与核心特征2.征信公司应用数据要素的实践路径3.总结1.数据要素的定义与核心特征 数据要素是数字经济时代的新型生产要素,指以电子形式存在、通过计算方式参与生产经营活动并创造价值的数据资源。 其核心特征包括: 新型生产…...
耗时十分钟,做了一个 uniapp 灵感泡泡机
最近,我用 UniApp 搭配 CodeBuddy 实现了一个充满童话感的小应用,名叫 IdeaBubbles(灵感泡泡机)。它是一个单页 WebApp,用来记录那些转瞬即逝的灵感时刻。整个界面以梦幻气泡和彩虹玻璃拟态为主题,视觉效果…...
《Head First 设计模式》第二章 - 笔记
本书是本人写的设计模式的笔记,写下核心要点,如果你掌握过设计模式,想快速阅读本书内容,这个笔记适合你阅读。如果你是新手,有 java 基础和 oo 设计原则基础,你适合跟我一样从零阅读本书。 第一章 观察者模…...
matlab绘制光学传递函数mtf曲线
在 MATLAB 中绘制光学系统的光学传递函数(Modulation Transfer Function,MTF)曲线可以通过以下步骤实现。MTF 是描述光学系统对物体细节的传递能力的函数,通常用于分析成像系统的性能。 假设我们有一个理想的光学系统,…...
贵州某建筑物挡墙自动化监测
1. 项目简介 某建筑物位于贵州省某县城区内,靠近县城主干道,周边配套学校、医院、商贸城。建筑物临近凤凰湖、芙蓉江等水系,主打“湖景生态宜居”。改建筑物总占地面积:约5.3万平方米;总建筑面积:约15万平…...
自定义协议与序列化
前言 书接上回,我们上一篇提到了协议并且我们草率的写了一个协议,然后又对TCP的R和W留了一个伏笔,我们今天彻底做个了断。 UDP是面向数据报的,它要么不读,要么就是一次读完的,所以不存在数据断断续续的问…...
MySQL中的Change Buffer是什么,它有什么作用?
MySQL 中的 Change Buffer(更改缓冲区)是 InnoDB 存储引擎使用的一种特殊数据结构,主要用于优化对二级索引(secondary indexes)的写操作性能。 它的核心作用是: 当对表进行 INSERT、UPDATE 或 DELETE 操作…...
Ubuntu 20.04之Docker安装ES7.17.14和Kibana7.17.14
你需要已经安装如下运行环境: Ubuntu 20.04 docker 28 docker-compose 1.25 一、手动拉取镜像 docker pull docker.elastic.co/kibana/kibana:7.17.14docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.14 或者手动导入镜像 docker load -i es7.17.14.ta…...
ThreadLocal作一个缓存工具类
1、工具类 import java.util.HashMap; import java.util.Map;public class ThreadLocalUtil {// 使用Map存储多类型数据private static final ThreadLocal<Map<String, Object>> CONTEXT_HOLDER new ThreadLocal<>();// 存储数据public static void set(Str…...
DeepSeek在旅游行业的智能化革命
2025年,从贵州全域智慧旅游平台的行程规划革命,到黄山景区"AI旅行助手"的实时服务升级,再到宁夏"游宁AI"的全域智能导览,DeepSeek通过技术创新与行业场景的深度融合,正在重新定义"智慧旅游"的内涵。这场变革不仅体现在效率提升层面,更通过…...
说一下响应状态码有哪些?
HTTP响应状态码分类(RFC 7231标准) 1. 1xx(信息类) 临时响应,表示请求已被接收,需要继续处理 100 Continue:客户端应继续发送请求体 101 Switching Protocols:服务器同意升级协议(如WebSocket) 102 Processing(WebDAV):服务器正在处理但未完成 2. 2xx(成功类)…...