powershell@管道符过滤的顺序问题@powershell管道符如何工作
文章目录
- select 和 where谁先执行
- powershell管道符
- stop-service 为例查看文档中的典型参数介绍
- stop-process为例介绍管道符传参是怎么工作的
- Id参数
- InputObject 参数
- Name参数
- 额外的试验
- 反面例子
- 应用:get-process 和stop-process配合
select 和 where谁先执行
-
在执行筛选时,指定命令的顺序确实很重要。
-
例如,考虑这样一种情况:使用 Select-Object 只选择几个属性(比如Name,Date),而使用 Where-Object 过滤的属性是(size)不在选择范围内的属性。在这种情况下,必须先进行过滤,否则在尝试执行过滤时,管道中将不存在该属性。
-
下面的例子返回的内容会是空的
Get-Service -ErrorAction Ignore | Select-Object -Property DisplayName, Running, Status | Where-Object CanPauseAndContinue -
更改select和where的顺序,就是正确的用法
PS>Get-Service -ErrorAction Ignore | >> Where-Object CanPauseAndContinue | >> Select-Object -Property DisplayName, StatusDisplayName Status ----------- ------ Control Center Hotkey Service Running Intel(R) Dynamic Tuning Technology Telemetry Service Running Intel(R) Graphics Command Center Service Running Intel(R) Innovation Platform Framework Service Running Workstation Running Web Threat Defense Service Running Web Threat Defense User Service_1bd31e Running Windows Management Instrumentation Running
powershell管道符
-
这里解释powershell管道符是如何工作的,编写支持管道符的函数另见它文(阅读本文有助于理解和编写这类支持管道符函数)
-
One-liners and the pipeline - PowerShell | Microsoft Learn ~ 单行代码和管道 - PowerShell | Microsoft Learn
-
我们知道,有些命令可以接受管道符传递过来的参数,例如
Stop-Service,简写别名为spsvStop-process,简写为spps
-
下面介绍它们怎么处理管道符输入
stop-service 为例查看文档中的典型参数介绍
-
为了说明问题,这里截取了
stop-service的部分参数的文档-
这里截取的是三个典型的参数
... -DisplayName <String[]>Specifies the display names of the services to stop. Wildcard characters arepermitted.Required? truePosition? namedDefault value NoneAccept pipeline input? FalseAccept wildcard characters? false-InputObject <ServiceController[]>Specifies ServiceController objects that represent the services to stop. Enter avariable that contains the objects, or type a command or expression that gets theobjects.Required? truePosition? 0Default value NoneAccept pipeline input? True (ByValue)Accept wildcard characters? false-Name <String[]>Specifies the service names of the services to stop. Wildcard characters arepermitted.Required? truePosition? 0Default value NoneAccept pipeline input? True (ByPropertyName, ByValue)Accept wildcard characters? false ... -
当一个参数同时接受按属性名和值输入的管道输入时,它总是先尝试按值输入。
-
如果按值输入失败,它就会尝试按属性名输入。
-
按值输入有点误导。我更喜欢称之为按类型。这意味着如果你将产生 ServiceController 对象类型的命令结果导入 Stop-Service,它会将该输入绑定到 InputObject 参数。
-
但如果将产生字符串输出的命令结果导入 Stop-Service,则会将其绑定到 Name 参数。
-
如果将一条不产生 ServiceController 或 String 对象的命令的结果导入 Stop-Service,不意味着绑定一定失败
-
如果它产生(返回)的某个对象的属性包含了Name,那么它会将输出中的 Name 属性绑定到 Stop-Service 的 Name 参数。
-
stop-process为例介绍管道符传参是怎么工作的
-
经典命令
stop-process,结束进程的cmdlet-
-Id <System.Int32[]>Specifies the process IDs of the processes to stop. To specify multiple IDs, use commas to separate the IDs. Tofind the PID of a process, type `Get-Process`.Required? truePosition? 0Default value NoneAccept pipeline input? True (ByPropertyName)Accept wildcard characters? false-InputObject <System.Diagnostics.Process[]>Specifies the process objects to stop. Enter a variable that contains the objects, or type a command or expression that gets the objects.Required? truePosition? 0Default value NoneAccept pipeline input? True (ByValue)Accept wildcard characters? false-Name <System.String[]>Specifies the process names of the processes to stop. You can type multiple process names, separated by commas,or use wildcard characters.Required? truePosition? namedDefault value NoneAccept pipeline input? True (ByPropertyName)Accept wildcard characters? true
-
-
为了便于介绍,这里创建两个notepad进程
-
PS C:\Users\cxxu\Desktop> $pss=ps Notepad PS C:\Users\cxxu\Desktop> $pssNPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName------ ----- ----- ------ -- -- -----------44 74.81 123.38 0.58 440 1 Notepad12 2.70 13.02 0.02 21176 1 Notepad
-
Id参数
- 可以看到,
Id参数接受管道符的输入,并且是管道符前的表达式输出的对象包含名为Id的属性(而且属性值类型兼容<System.Int32[]>时才会被绑定到这个参数上
InputObject 参数
-
然而
stop-process还有其他参数支持管道符的形式输入,例如InputObject,并且通常具有更高的优先级,因为powershell管道符传参时,优先检查ByValue的参数,然后才是ByPropertyName的参数 -
正如前面所讲的那样,文档里面
InputObject是带有类型的,类型为<System.Diagnostics.Process[]>,当管道符前面的表达式产生的刚好是这个类型的对象,那么就会被InputObject所捕获绑定 -
执行
$pss|stop-Process仿佛执行的是以下遍历语句foreach ($p in $pss){stop-process -InputObject $p } -
在PowerShell中,
-InputObject参数通常用于指定直接传递给 cmdlet 的输入对象。 -
例如参数声明
-InputObject <System.Diagnostics.Process[]>,其中<System.Diagnostics.Process[]>表示InputObject参数应该是System.Diagnostics.Process类型的对象数组,这个类型代表系统中的进程。 -
这种参数类型经常用于那些接收进程作为输入的cmdlet,比如
Stop-Process。 -
例如,如果你有一个
System.Diagnostics.Process对象的数组,你可以使用Stop-Processcmdlet 来结束这些进程:# 获取所有名为 "notepad" 的进程对象的数组 $processes = Get-Process -Name "notepad"# 将进程对象数组传递给 Stop-Process cmdlet 来结束这些进程 Stop-Process -InputObject $processes-
在这个例子中,
-InputObject参数接收了一个Process对象的数组,然后Stop-Processcmdlet 将结束数组中的每一个进程。 -
当你直接使用
-InputObject参数时,通常不需要通过管道传递对象,因为你已经直接提供了要处理的对象数组。
-
Name参数
- 和
Id参数类似,当管道符传入的对象包含了Id属性,并且类型为<System.String[]>时,有机会绑定到这个参数上
额外的试验
-
我们提到说管道符输入时,会分别检查byValue和byPropertyName类型的参数
-
下面自定义一个类型,然后看看通过管道符传递能否按照预期工作
-
自定义一个类型,包含一个字段
Name,值为notepad$custObj = [PSCustomObject]@{Name = 'notepad' } -
检查
$custObj对象的成员PS C:\repos\scripts> $custObj = [PSCustomObject]@{ >> Name = 'notepad' >> } PS C:\repos\scripts> $custObj | Get-MemberTypeName: System.Management.Automation.PSCustomObjectName MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() Name NoteProperty string Name=notepad- 可以发现powershell会自定让其继承一些必要的成员方法和特殊属性
-
使用这个对象传递给
Stop-Service-
#启动一个notepad进程,用来试验杀死 PS C:\repos\scripts> notepad #将$custObj传递给Stop-Process,检验其是否能够解析出$custObj对象中有Name属性,从而杀死所有Name为notepad的进程 PS C:\repos\scripts> $custObj | Stop-Process -
经过检验,上述语句顺利执行
-
反面例子
-
PS> 'notepad'|Stop-Process Stop-Process: The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.-
输入对象无法绑定到该命令的任何参数,原因可能是该命令不接受管道输入,或者输入及其属性与接受管道输入的任何参数都不匹配。
-
在这个例子中,语句尝试传递一个字符串
notepad给stop-process,我们可以猜测其意图是杀死所有名为notepad的进程,然而stop-process不支持这种用法,不会达到以下语句的效果-
stop-process -name 'notepad'
-
-
在
stop-process的所有参数中,有3个参数会尝试绑定来自管道符的输入,正如文档指出的,Id,InputObject,Name三个参数,并且都有各自的类型要求,注明在了文档中- 其中
Id和Name都是ByPropertyName类型的,而InputObject优先级高,是ByValue型的 - 上述反面例子中,管道符前的字符串
notepad不是InputObject要求的类型,因此不会被绑定到InputObject - 而
notepad作为字符串对象,没有Id和Name属性,自然也不会绑定到Id和Name参数
- 其中
-
综上,字符串作为管道符传递给
stop-process必然报错
-
-
事实上,
stop-process第一个默认的位置参数是Id,也就是进程号,而不是进程对应的程序名字- 这是合理的,因为一个程序可能有多个运行示例,例如notepad被打开多个进程,而我们要关闭notepad时可能要保留其中的一个或者只想关闭其中的具体某一个,为了防止轻易关闭所有进程造成误杀,因此要显式使用
-Name参数指出您确实想要关闭所有具有指定程序名字的进程 - 否则您应该通过
get-process来查看相关进程,然后记住或者复制Id号,执行stop-process <Id>
- 这是合理的,因为一个程序可能有多个运行示例,例如notepad被打开多个进程,而我们要关闭notepad时可能要保留其中的一个或者只想关闭其中的具体某一个,为了防止轻易关闭所有进程造成误杀,因此要显式使用
应用:get-process 和stop-process配合
-
假设有以下对象
-
PS> $pss=get-process notepad PS>$pssNPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName------ ----- ----- ------ -- -- -----------47 73.11 117.62 0.17 12772 1 Notepad13 2.83 12.51 0.00 13768 1 Notepad
-
-
我们看看
$pss对象能否传递给stop-process这个cmdlet呢?-
利用
Get-Member(alias:gm)来检查$pss对象的成员(属性,成员函数等),这个输出通常是比较长的-
事实上,传递给
gm的如果是一个容器类型(比如数组),那么gm返回的是容器保存的对象的类型 -
例如某个变量是包含2个字符串的数组,那么传给
gm返回的是字符串类型的成员列表 -
我们检查以下
$pss是什么类型,调用对象的.GetType()方法即可PS> $pss.GetType()IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array- 可以看到,
$pss的类型是一个数组(可迭代对象)
- 可以看到,
-
-
这里看看
$pss数组中的对象有哪些成员,以便于我们对$pss进一步处理,比如便利迭代等操作PS C:\Users\cxxu\Desktop> $pss|gmTypeName: System.Diagnostics.ProcessName MemberType Definition ---- ---------- ---------- Handles AliasProperty Handles = Handlecount Name AliasProperty Name = ProcessName NPM AliasProperty NPM = NonpagedSystemMemorySize64 PM AliasProperty PM = PagedMemorySize64 SI AliasProperty SI = SessionId VM AliasProperty VM = VirtualMemorySize64 WS AliasProperty WS = WorkingSet64 Parent CodeProperty System.Object Parent{get=GetParentProcess;} Disposed Event System.EventHandler Disposed(System.Object… ErrorDataReceived Event System.Diagnostics.DataReceivedEventHandle… Exited Event System.EventHandler Exited(System.Object, … OutputDataReceived Event System.Diagnostics.DataReceivedEventHandle… BeginErrorReadLine Method void BeginErrorReadLine() BeginOutputReadLine Method void BeginOutputReadLine() CancelErrorRead Method void CancelErrorRead() ... Id Property int Id {get;} MachineName Property string MachineName {get;} MainModule Property System.Diagnostics.ProcessModule MainModul… MainWindowHandle Property System.IntPtr MainWindowHandle {get;} ... -
我们可以利用
group来统计一下结果,比如我们gm返回的结果,按照对象的成员的各种类型来统计-
PS> $pss|gm |group -Property MemberTypeCount Name Group ----- ---- -----7 AliasProperty {Handles = Handlecount, Name = ProcessName, NPM = No…1 CodeProperty {System.Object Parent{get=GetParentProcess;}}52 Property {int BasePriority {get;}, System.ComponentModel.ICon…1 NoteProperty {string __NounName=Process}8 ScriptProperty {System.Object CommandLine {get=…2 PropertySet {PSConfiguration {Name, Id, PriorityClass, FileVersi…19 Method {void BeginErrorReadLine(), void BeginOutputReadLine…4 Event {System.EventHandler Disposed(System.Object, System.… -
可以看到,
$pss中的对象包含的成员的类型有8种,最重要的两类是Property,Method
-
-
PS C:\Users\cxxu\Desktop> $pss|gm |?{$_.Name -eq 'Id'}TypeName: System.Diagnostics.ProcessName MemberType Definition ---- ---------- ---------- Id Property int Id {get;} -
回到
stop-process,经过上面的操作可知,get-process返回的对象(如果是数组,自动迭代其中的元素)包含了名为Id的属性,那么可以通过管道接受Get-Process的输出-
PS> $pss|Stop-Process -
上述命令会杀死所有
$pss中列出的进程,仿佛执行的是-
foreach ($p in $pss){stop-process -id $p.Id }
-
-
-
-
处理上面的
$pss是一个包含多个进程对象的数组情况以外,也可以处理单个进程的情况-
例如
PS[BAT:84%][MEM:37.91% (12.02/31.70)GB][21:36:45] # [~\Desktop] PS> ps gopeedNPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName------ ----- ----- ------ -- -- -----------51 147.82 155.86 223.50 16432 1 gopeedPS[BAT:84%][MEM:37.91% (12.02/31.70)GB][21:36:47] # [~\Desktop] PS> $p=ps gopeedPS[BAT:84%][MEM:37.91% (12.02/31.70)GB][21:37:03] # [~\Desktop] PS> $pNPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName------ ----- ----- ------ -- -- -----------52 148.82 157.17 223.62 16432 1 gopeedPS[BAT:84%][MEM:37.91% (12.02/31.70)GB][21:37:04] # [~\Desktop] PS> $p.GetType()IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False Process System.ComponentModel.Com…PS[BAT:84%][MEM:37.90% (12.02/31.70)GB][21:37:10] # [~\Desktop] PS> $p|gmTypeName: System.Diagnostics.ProcessName MemberType Definition ---- ---------- ---------- Handles AliasProperty Handles = Handlecount Name AliasProperty Name = ProcessName NPM AliasProperty NPM = NonpagedSystemMemorySize64 PM AliasProperty PM = PagedMemorySize64...
-
相关文章:
powershell@管道符过滤的顺序问题@powershell管道符如何工作
文章目录 select 和 where谁先执行powershell管道符stop-service 为例查看文档中的典型参数介绍stop-process为例介绍管道符传参是怎么工作的Id参数InputObject 参数Name参数额外的试验反面例子应用:get-process 和stop-process配合 select 和 where谁先执行 在执行筛选时&…...
SMI接口
目录 SMI 接口帧格式读时序写时序 IP 设计IP 例化界面IP 接口IP 验证 SMI 接口 SMI(Serial Management Interface)串行管理接口,也被称作 MII 管理接口(MII Management Interface),包括 MDC 和 MDIO 两条信…...
【C++】转换构造函数和类型转换函数
目录 转换构造函数转换构造函数调用 类型转换函数类型转换函数定义形式应用 转换构造函数 转换构造函数就是一种构造函数,将一个其他类型的数据转换成一个类的对象的构造函数。 类型->类对象 转换构造函数调用 (1)显式强制类型转换&…...
全栈开发之路——前端篇(5)组件间通讯和接口等知识补充
全栈开发一条龙——前端篇 第一篇:框架确定、ide设置与项目创建 第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇:setup语法,设置响应式数据。 第四篇:数据绑定、计算属性和watch监视 辅助文档&…...
4.【Orangepi Zero2】Linux定时器(signal、setitimer),软件PWM驱动舵机(SG90)
Linux定时器(signal、setitimer),软件PWM驱动舵机(SG90) signalsetitimer示例 软件PWM驱动舵机(SG90) signal 详情请看Linux 3.进程间通信(shmget shmat shmdt shmctl 共享内存、si…...
K8S哲学 - 资源调度 HPA (horizontal pod autoScaler-sync-period)
kubectl exec: kubectl exec -it pod-name -c container-name -- /bin/sh kubectl run 通过一个 deployment来 演示 apiVersion: apps/v1 kind: Deployment metadata:name: deploylabels: app: deploy spec: replicas: 1selector: matchLabels:app: deploy-podt…...
uniapp/微信小程序实现加入购物车点击添加飞到购物车动画
1、预期效果 2、实现思路 每次点击添加按钮时,往该按钮上方添加一个悬浮元素,通过位移动画将元素移到目标位置。 1. 为每个点击元素设置不同的class,才能通过uni.createSelectorQuery来获取每个元素的节点信息; 2. 添加一个与…...
电商大数据的采集||电商大数据关键技术【基于Python】
.电商大数据采集API 什么是大数据? 1.大数据的概念 大数据即字面意思,大量数据。那么这个数据量大到多少才算大数据喃?通常,当数据量达到TB乃至PB级别时,传统的关系型数据库在处理能力、存储效率或查询性能上可能会遇…...
H264 SP帧等知识笔记
H.264是一种广泛使用的视频编码标准,它使用多种类型的帧来实现高效的视频压缩。在H.264中,参考帧和重建帧是两个重要的概念,它们之间既有区别又有联系。 参考帧: 参考帧是用于预测其他帧的帧。在H.264中,编码器会利用…...
流量印钞机:每日稳定收入1500+
标题:“流量印钞机:每日稳定收入1500” 随着互联网的迅速发展,越来越多的人开始利用网络平台来赚取稳定的收入。在这个信息爆炸的时代,拥有了一定的流量就意味着拥有了一台“印钞机”,可以每日稳定地创造超过1500元的…...
Tomcat中服务启动失败,如何查看启动失败日志?
1. 查看 localhost.log 这个日志文件通常包含有关特定 web 应用的详细错误信息。运行以下命令查看 localhost.log 中的错误: sudo tail -n 100 /opt/tomcat/latest/logs/localhost.YYYY-MM-DD.log请替换 YYYY-MM-DD 为当前日期,或选择最近的日志文件日…...
React19学习-初体验
升级react19版本 安装 npm install reactbeta react-dombeta如果使用ts则需要在package.json中添加。等正式版发布直接可以使用types/react了 "overrides": {"types/react": "npm:types-reactbeta","types/react-dom": "npm:ty…...
【UE5】数字人基础
这里主要记录一下自己在实现数字人得过程中涉及导XSens惯性动捕,视频动捕,LiveLinkFace表捕,GRoom物理头发等。 一、导入骨骼网格体 骨骼网格体即模型要在模型雕刻阶段就要雕刻好表捕所需的表情体(blendshape),后面表捕的效果直…...
OSTEP Projects:KV
本文将介绍操作系统导论(Operating Systems: Three Easy Pieces)作者所开源的操作系统相关课程项目 的 KV 部分,包含个人的代码实现和设计思路。 思路 题目要求实现一个最简单的数据库,以支持数据的持久化。 每个操作由格式为 o…...
JAVA学习笔记(第三周)
文章目录 继承概述使用场景继承的特点子类继承的内容成员变量访问特点成员方法访问特点方法的重写构造方法this super 多态多态的表现形式多态的前提成员变量和方法调用instanceof优势弊端 包包名的规则全类名final常量 权限修饰符代码块 继承 概述 继承就是子类继承父类的特征…...
linux 内核驱动 -- reboot -f 导致内核死机 而 reboot则不会引起问题
问题描述,定于与解决:...
【vue-echarts】 报错问题解决 “Error: Component series.pie not exists. Load it first.“
目录 问题描述解决【解决1】【解决2】 问题描述 使用 vue-echarts 时导入的文件 import VChart from vue-echarts/components/ECharts import echarts/lib/chart/line import echarts/lib/chart/bar import echarts/lib/chart/pie import echarts/lib/component/legend impor…...
MySQL慢查询SQL优化
一、慢查询日志 描述:通过慢查询日志等定位那些执行效率较低的SQL语句 查看 # 慢查询是否开启 show variables like slow_query_log%; # 慢查询超时时间 show variables like long_query_time%;执行SQL 开启慢查询日志 set global slow_query_log ON;设置慢查…...
【嵌入式DIY实例】-DDS信号生成器
DDS信号生成器 文章目录 DDS信号生成器1、AD9805介绍2、硬件准备与接线3、代码实现在本文中,将详细介绍如何使用AD9850来搭建一个简易的DDS(Direct Digital signal )信号生成器。 1、AD9805介绍 AD9850是一款高度集成的器件,采用先进的DDS技术,内置一个高速、高性能数模转…...
java设计模式四 桥接模式
桥接模式关注于将抽象部分与实现部分分离,使它们可以独立变化。它通过在抽象和实现之间建立一个桥梁来实现这一目的。这种设计模式属于结构型模式。 假设我们要设计一个图形编辑器,其中图形(如圆形、正方形)可以有不同的颜色填充…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...
6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...
