20230521-如何选择一个CPU

CPU 中央处理器

1. cpu 的系列,英特尔还是amd

cpu 除了酷睿系列和锐龙系列其他不建议购买

主流cpu 系列

intel 的core 系列 i3 5 7 9

amd的锐龙Ryzen 系列 r3 5 7 9线程撕裂者

为什么不建议购买其他系列

inter celeron pentium atom 都属于骗钱产品

amd 锐龙系列是amdcpu 起死回生的转折点,之前的cpu 可以用推土机架构形容

2. 怎么看cpu 的型号

cpu 系列型号是指cpu 厂商会根据cpu 产品的市场定位来给属于同一系列的cpu 产品确定一个系列型号以便于分类和管理,系列型号可以说是用于区分cpu 性能的重要标识

提醒:
同代的i3 i5 i7 i9其实性能跨度很大,就比如:i5 10500的跑分是396 482,i5 10600的跑分是421 584,i7 10700K的跑分是528 961,虽然是从500,600到700,但前两者的提升就明显没有后两者的提升幅度大,由此可见同代的i5和i7明显不是一个等级的。但一切前提是“同代”,就像4代的i7肯定比不过10代的i5,所以“i7永远比i5强”的言论是错误的。

英特尔的cpu 有两种命名方式

i7-11700K

i3 入门
i5 主流
i7 高端
i9 发烧

11 这是第11代处理器
700 性能指数:通常980 900为i9
700 为i7
600 400为i5

K 桌面端

F 不含核显 需要独显

K 支持超频

KF 不含核显+可超频
X XE 极致性能

移动端
K 支持超频
H 高电压
U 低电压
Y 超低电压
HK 高电压+支持超频

10nm core 处理器命名规则

i7-1065G7

i7 这是intel core i7处理器
10 这是10代ice Lake 架构

6 性能相对较高
5 这是15 W 低电压处理器
G
7

64EU 高性能核显

AMD cpu 的命令方式如下

R7-5800X

R3 底端入门
R5 普通
R7 高端
R9 发烧
线程撕裂者-超级发烧
5 这是第5代的cpu
800 性能指数

桌面端
X 自动超频 高性能
XT X 的小幅升级版
G 带有集显版
WX 定位工作站

移动端
U 低功耗
H 高功耗
HX H 的高性能版
HS H 的低功耗版

对于amd 的cpu 普通用户买R5 就可以,游戏剪辑党建议R7 或更高预算,目前最新一带为锐龙5000系列,性能指数越高越强,关于移动端的后缀还是要说一说的

Zen3 家族的重磅产品,锐龙系列移动处理器有针对高性能的H 及针对低功耗的U 两个系列,这里就来说说两个版本的区别

后缀与产品的定位息息相关,H 系列主要面向高性能笔记本,功耗当然也更高,主打游戏内容创作者,最低也是6核12线程
最多 8核16线程

U系列则是在确保性能的同时还要兼顾续航等问题,最低4核,最高8核,TDP功耗15W,该系列总计5款型号,但有2款是Zen3架构的,3款是Zen3架构的。偶数型号的都是Zen3架构的,5700/5500/5300这样的奇数型号则是Zen2架构。在这部分中,锐龙7 5800U、锐龙5 5600U是Zen3架构,L3缓存翻倍,锐龙3 5300U、锐龙5 5500U、锐龙7 5700U是Zen2架构的,L3缓存较小。

其中H系列还有更多细分型号,多了HX、HS两个版本,其中HS系列为35W TDP,不能超频,功耗要低点,性能要弱一点,但对于续航方面会比较有优势。 HX系列则是针对最顶级性能玩家,部分型号可超频,TDP 45W+,功耗大些,性能更强劲,提供更多的定制灵活性。

关于AMD 桌面端

图中已经说过,X 为自动超频高性能版本,那没有X 后缀的就是不能自动超频的普通版本,XT 版则是X 的小幅度升级版,boost 频率会比正常X 版高0.5GHz左右,但其他方面并无提升,可是价格要比X 高500-600,至于它们值不值得就两说了,对于不在乎性价比的发烧友或超频玩家来说,极致性能、体质更好的XT系列是最好的选择,游戏和消费级应用性能、超频潜力都比面向专业应用的3950x更靠谱。但对于普通的性价比玩家而言可能不是一个好的选择。

cpu主频,基础频率,cpu 主频指的是什么

主频越高,cpu 的运算速度就越快,一款cpu 主频越高,说明单核性能就强,游戏主要看单核性能

4. 睿频

睿频相当于cpu 加速时的频率

睿频是指当启动一个运行程序后,处理器会自动加速到合适的频率,而原来的运行速度会提升10%-20% 以保证程序流畅运行的一种技术

  1. 超频

超频相当于cpu 用尽全力时的频率

超频能带来一些性能上的提升,但所承载的是发热,功耗的增加,在一些时候甚至可能烧坏cpu ,此时需要十分注意cpu 的散热

简而言之 主频< 最高睿频< 超频

  1. 核心/线程数 电脑cpu 核心/线程数多有什么用

核心数是cpu 系列术语,指处理器主频提升上已力不从心,intel 和amd 在不用进行大规模开发的情况下,将现有产品发展称为理论性能更为强大的多核心处理器系统

对于剪辑、渲染、设计来说,核心数和线程数越多,多任务运行能力就越强

游戏,核心和线程过多则无法完全利用,造成资源浪费,频率对于游戏更加重要。目前主流核心为6核和8核,之前的4核心CPU也占有大量市场,所以游戏会优化4核 6核 8核的CPU。像16核那种超多核心的服务器机CPU,和1核2核那种超低性能的,在游戏中表现是很拉胯的。“多核无用论”是有问题的,真正应该说是“超多核无用论”才对。但是4核→6核→8核 提升还是比较明显的。

  1. 适用人群 我该选哪种类型的cpu

游戏,主频高的cpu 推荐 i5 r7
家用,办公 带核显的cpu 主打轻薄便携,i3 r5 6 主要是带核显

设计,渲染,剪辑,多核多线程的cpu i7 起步,这类工作更看重gpu 剪辑党更推荐苹果M 系列的处理器,苹果有做专门的优化

  1. 三级缓存

因为cpu 的运算速度很快,内存条和硬盘跟不上这个速度,所以要有中介来做缓冲,这个中介就是缓存,缓存容量越大,cpu 对数据的处理就更快,性能更高,cpu 通常比较第三级缓存

  1. cpu 的架构,第几代的cpu 性能强

不同代的cpu 对应着不同的架构,通常新款的架构都会比旧款的要强,所以cpu 最好选择新一代的

  1. 制程工艺

制程工艺是指制造cpu时的集成电路的精细度,常见的有7nm 10nm 12nm 14nm 该数值越小,功耗和发热越低,制程工艺越先进

  1. cpu 与主板搭配

cpu 需要通过接口安装在主板上才能工作,目前的cpu 接口都是针脚式接口,amd 恶化英特尔的cpu 在接口上有很大的差别,所以要正常工作,必须使用适配接口的主板

高端的cpu 为了充分发挥性能,如线程撕裂者,i9 需要搭配更好的高级主板,普通主板并不适用

intel 接口类型

十一代:LGA-1200,搭配主板:Z590(搭配i9 i7)、B560(搭配i5)

十代:LGA-1200,搭配主板:Z490(搭配i9 i7)、B460(搭配i5)、H410(搭配i3)

AMD锐龙系列接口类型:

AM4接口,搭配主板:X570、B450、B550

  1. 显卡与cpu 的搭配

cpu 和显卡之间是相互辅助工作得,只有合理搭配,才能发挥出两者最佳的性能

如果使用底端cpu 搭配 高端显卡,就会导致显卡无法100% 运行,反之,如果使用高端cpu 搭配底端显卡,就会出现显卡满载,cpu 无所事事的情况

  1. TDP 功耗

移动版本的处理器TDP 分为超低电压,低电压 和标准电压,还有28W的特殊型号

超低电压产品 TDP 多为 5-9W,多见于超轻薄笔记本电脑如 MacBook Air
低电压产品 TDP 多为 15W,常见于普通轻薄本。
标准电压产品 TDP 典型值为 45W,多见于在游戏本和全能本,发热量和耗电量较大,性能高。
除此以外还有 28W 低电压产品,和普通的 15W CPU 相比大幅提升了基础频率和核显性能。

20230521-AutoHotKey使用教程和脚本推荐

https://www.autohotkey.com/

windows自动化效率神奇,autohotkey 使用教程和脚本推荐

autohotkey 是一款windows 平台下的热键脚本语言程序,可以实现诸如窗口置顶,快速输入、快捷操作等丰富多彩的功能

能够通过自定义脚本实现很多快捷、自动化操作,乃至创建图形界面程序,而且占用资源极小,是一个能够高度自定义,可用性极高的工具

这里就介绍下如何通过autohotkey 来提高我的操作效率

autohotkey 使用方法

下载并解压 autohotkey 绿色版,绿色版,将脚本文本拖动到上面即可启用脚本

使用示例,新建文本文件,编写脚本如下

1
2
3
4
5
6
;这里的 “分号” 表示注释
;快捷键 alt + n 打开记事本
!n::Run notepad

;快捷键 alt + y 打开百度云管家
!y::Run H:\GanJingYunV2\BaiduYunGuanjia.exe

保存为test.ank 脚本后缀名都为 .ank

右键选择 打开方式,浏览计算机中的程序,定位到autohotkey 软件所在目录中,选择autohotkeyU64.exe 确定

以后双击脚本,即可运行,这时就可以通过快捷键 alt+n 启动记事本,通过 alt+y 启动百度云管家了

自制快捷启动器

下面带大家开始写一个快捷启动脚本,很简单,这里分成3部分来说

热键标记

! 是热键标记,这里的感叹号代表键盘上的alt 键
!n 即对应键盘热键alt+n

常用热键标记对应关系

1
2
3
4
# win 键
! alt
^ ctrl
+ shift

2. 连接

符号:: 意味着每次按下前面的热键时,随后的命令将会被执行,这里用来连接热键标记和run 命令

3. Run 命令

run 命令:用来启动一个程序,文档、url 网址或者快捷方式,如

1
2
3
4
Run Notepad
Run C:\My Documents\Address List.doc
Run www.yahoo.com
Run mailto:someone@somedomain.com

把上面3部分组合起来即可实现自定义快捷键

比如我想通过按Ctrl+q启动位于 D:\software\QQ.exe 的QQ程序,按alt+b打开百度,可以这样写

1
2
^q::Run D:\software\QQ.exe
!b::Run www.baidu.com

这样,大家就可以自定义自己的程序启动热键了

脚本推荐

  1. 快捷启动

即上面介绍的例子,自定义快捷键,快速打开程序、文件、网址等,这里给出一个模板,大家可以根据需要编辑修改

鼠标债见音量控制

把鼠标浮动在任务栏时,可以通过滚轮来调节音量,点击中键开启或关闭声音

屏幕键盘

在屏幕下方显示一个透明的模拟键盘,来实时显示我们按下的按键,也都来学习盲打时


创建脚本

每个脚本都是需由程序 autohotkey.exe 执行的包含命令的纯文本,脚本中还可以包含热键和热字串,或者甚至完全由它们组成,不过,在不包含热键和热字串时,脚本会在启动后从上往下顺序执行器中的命令

创建新脚本

输入文件名,确保以 .ahk 结尾,例如 test.ahk
右键点击此文件并选择edit script

在新的空行中,输入下列内容, #space::Run www.bing.com

在上面的语句行中,首个字符 # 表示windows 键,所以 #space 表示按住 windows 键然后按下空格键来激活热键,双冒号 :: 表示每次按下此热键时会执行其后续命令,这里是转到google 网站,要试用此脚本,请继续下列操作

保存并关闭此文件

双击此文件来运行,在任务栏通知区域会出现新的图标

按住windows 键并按下空格键,在默认浏览器中会打开网页

要退出或编辑此脚本,则在任务栏通知区域的绿色H 图标点击右键

注意

多个脚本可以同时运行,其中的每个脚本在任务栏通知区域使用自己的图标

每个脚本可以包含多个热键 和热字串

要让您的脚本在启动计算机时自动运行,请在开始菜单的启动文件夹中给您的脚本创建快捷方式

启动程序或文档

可以使用run 命令来打开其中程序,文档,url 或快捷方式,这里有一些常见示例

1
2
3
4
5
Run Notepad
Run C:\My Documents\Address List.doc
Run C:\My Documents\My Shortcut.lnk
Run www.yahoo.com
Run mailto:someone@somedomain.com

通过加上热键标签,可以把上面例子的任何一个设置为热键,在下面的首个例子中,设置的热键为win+n 而在第二个中为control+alt+c

1
2
#n::Run Notepad
^!c::Run calc.exe

上面的例子被称为单行热键,因为它们只包含单个命令,要在热键中执行多个命令,请把首行放在热键定义的下面,且在最后行命令的下一行添加return 例如

1
2
3
4
#n::
Run http://www.google.com
Run Notepad.exe
return

如要要运行的程序或文档没有在环境变量中,那么需要指定它的完整路径才能运行

1
Run %A_ProgramFiles%\Winamp\Winamp.exe

在上面的例子中,%A_ProgramFiles%是内置变量,使用它而不使用像 C:\Program Files 这样的脚本可以有更好的移植性,这表示它在其他电脑上能执行的可能性更大,注意命令和变量的名称是不区分大小写的,例如,Run 等同于 run
而 “A_ProgramFiles” 等同于 “a_programfiles”.

要让脚本等到程序或文档关闭后才继续执行,请使用RunWait 代替Run 在下面的例子中,一直到用户关闭记事本MsgBox 命令才会继续执行

1
2
RunWait Notepad
MsgBox The user has finished (Notepad has been closed).

要学习关于启动程序的更多能容,例如传递参数,指定工作目录和找到程序的退出代码,请点击此处

发送键击和鼠标点击

使用send 命令可以发送剪辑到活动的最前面的窗口,在下面的例子中,control+alt+s 被设置为输入签名的热键 在按下此热键前必须确保编辑器或电子邮件这样的窗口是活动的

1
2
3
^!s::
Send Sincerely,{Enter}John Smith
return

在上面的例子中,除enter 外的所有字符都按原义发送,而它则模拟按下了enter 键,下一个例子演示了其他一些常用的特殊字符

1
Send ^c!{tab}pasted:^v

上面这行发送 Control+C 跟着 Alt+Tab 跟着字符串 “pasted:” 和 Control+V. 要了解特殊字符和按键的完整列表, 请参阅 Send.

最后,可以用您输入的缩写来出发发送键击的动作,这被称为热字串,例如每当您输入btw 跟着空格或逗号时,下面折行会把它替换为by the way

1
::btw::by the way

鼠标点击

要发送鼠标点击到窗口,首先必须确定要点击的x 和y 坐标,这个可以用window spy 来完成,它包含在autohotkey 中,下列步骤说明了使用window spy 的方法

在脚本托盘图标菜单或开始菜单中运行 Window Spy.
通过点击感兴趣的标题栏, alt-tab 切换或其他方法激活窗口 (Window Spy 被设计为保持 “置顶”).
移动鼠标光标到目标窗口中想要的位置并记下 Window Spy 中显示的鼠标坐标 (或在 Windows XP 和早期版本中, 按下 Shift-Alt-Tab 来激活 Window Spy, 这样可以复制和粘贴 “冻结的” 坐标).
在 Click 命令中使用上面找到的坐标. 下面的例子点击鼠标左键:Click 112, 223。

要移动鼠标而不进行点击,请使用mousemove 要拖拉鼠标,请使用mouseclickdrag

激活和操作窗口

要激活窗口 使它最前面,请使用winactivate 要判断窗口是否存在,请使用ifwinexist 或winwait 下面的例子演示了这些命令

1
2
3
4
5
6
7
8
9
10
IfWinExist Untitled - Notepad
{
WinActivate
}
else
{
Run Notepad
WinWait Untitled - Notepad
WinActivate
}

上面的例子会首先搜索标题以 “无标题 - 记事本” (区分大小写) 开始的任何现有的窗口. 如果找到这样的窗口, 则激活它. 否则, 启动记事本并等待无标题窗口的出现, 出现后激活它. 上面的例子还利用了 最近找到的窗口, 这样可以不需要在每个 WinActivate 中指定窗口标题.

其他一些常用的窗口命令是

IfWinActive: 检查指定的窗口当前是否活动.
WinWaitActive: 等待指定窗口变为活动窗口 (通常用在激活窗口的键击后面, 例如按下 Control-F 来打开 “查找” 窗口).
WinClose: 关闭指定的窗口.
WinMove: 改变指定窗口的位置和/或大小.
WinMinimize, WinMaximize, WinRestore: 分别最小化, 最大化或还原指定窗口.

利用MsgBox InputBox 等从用户中获取输入

下面的例子显示带两个按钮的对话框

使用InputBox 命令来提示用户输入字符串,使用fileselectfile 或fileselectfolder 来让用户选择文件或文件夹,对于更高级的任务,请使用gui 命令来创建自定义数据输入窗体和用户界面

提示:您也许已经从其他例子中注意到任何命令中的首个逗号可以,除非首个参数为空或以 := 或 = 开始,或命令单独处于延续片段的顶部,例如

1
2
MsgBox This is ok.
MsgBox, This is ok too (it has an explicit comma).

使用变量和剪贴板

变量是脚本用来存储文本或数字的内存块,只包含数字的变量 (可以包含小数点在数学运算或比较时会被自动转换为数字)

除了函数中的局部变量外,所有的变量都是全局的,即可以在脚本的任意位置读取或改变它们的内容

此外,变量不需要声明,简单地使用它们就可以让它们存在 且每个变量都以空或空白开始

要把字符串赋值给变量,请参照这些例子

1
2
MyVar1 = 123
MyVar2 = my string

要把变量的内容和数字或字符串进行比较,请参照这些例子

1
2
3
4
5
6
7
8
if MyVar2 = my string
{
MsgBox MyVar2 contains the string "my string".
}
if MyVar1 >= 100
{
MsgBox MyVar1 contains %MyVar1%, which is a number greater than or equal to 100.
}

在上面的msgbox 行中, 注意第二个出现的myvar1 被括在百分号内,这样在那里显示了 Myvar1 的内容,使用相同的手法能用来复制一个变量的内容给另一个变量,例如

MyVarConcatenated = %MyVar1% %MyVar2%

上面折行吧字符串123 my string 保存到 MyVarConcatenated

要比较两个变量的内容,请参照此例

1
2
3
4
if (ItemCount > ItemLimit)
{
MsgBox The value in ItemCount, which is %ItemCount%, is greater than %ItemLimit%.
}

注意上面例子的首行包含小括号,小括号表示这个if 语句包含表达式,如果没有它们,那行将被视为 非表达式 if 语句,并且因此需要使用百分号括住 itemlimit 这样的if 语句被限制为只能包含简单的比较运算符,而不能包含数学运算符或像 and or 这样的联合运算符

数学,要执行数学运算,请使用冒号-等号运算符(:=)来把表达式的结果赋值给变量,例如

1
NetPrice := Price * (1 - Discount/100)

请参阅表达式来了解数学运算符的完整列表

剪贴板

clipboard 变量是特殊变量,因为它包含了windows剪贴板中当前的文本,即使如此,它的用法也和普通变量一样,例如,下面这行将显示剪贴板当前的内容

1
MsgBox %clipboard%

要改变剪贴板的内容,请参考下面的例子,它用新文本替换了剪贴板的当前内容

1
clipboard = A line of text.`r`nA second line of text.`r`n
1
2
3
在上面`r `n 用来表示两个特殊字符,回车和换行,这两个字符在文本中开始新行,就像用户按下了enter键


要追加文本到剪贴板 (或其他任何变量), 请参照此例:

1
2
clipboard = %clipboard% And here is the text to append.

请参阅剪贴板 和变量章节了解详情

反复重复–一系列动作

要多次连续地重复执行一些操作,请使用循环,下面的循环会显示三次 msgbox

1
2
3
4
Loop 3
{
MsgBox This window will be displayed three times.
}

您还可以再单词loop 后指定变量,这可以用于循环次数在脚本某个位置定义的时候

1
2
3
4
5
Loop %RunCount%
{
Run C:\Check Server Status.exe
Sleep 60000 ; 暂停 60 秒.
}

在上面的例子中,循环会执行指定的次数,但是如果runcount 的值为0 则会完全跳过循环

当一个或多个条件改变时循环还可以终止它自己,下面的例子中当用户按住F1 键时会重复点击鼠标左键

1
2
3
4
5
6
7
8
9
$F1::  ; 把 F1 键设置为热键 ($ 符号会有助于下面 GetKeyState 的 "P" 模式).
Loop ; 由于没有指定数字, 所以这是个无限循环, 直到遇到内部的 "break" 或 "return".
{
if not GetKeyState("F1", "P") ; 如果此状态为 true, 那么用户实际已经释放了 F1 键.
break ; 中断循环.
; 否则 (由于上面没有 "中断"), 继续点击鼠标.
Click ; 在当前指针位置点击鼠标左键.
}
return

在上面的例子中,当用户按下F1键时,循环会检测到并通过break 命令停止它自己,break 会执行行跳转到循环闭括号后的行

另一种实现此目的的方法是使用while 循环

1
2
3
4
5
6
$F1::
while GetKeyState("F1", "P") ; 当 F1 键实际被按住时.
{
Click
}
return

上面的示例演示了一般用途的循环,对于更多特殊的需要,请考虑下面这些循环

文件读取/写入循环,逐行读取文本文件的内容,每次一个,这可以用来对符合条件的文件或文件夹进行操作

解析循环,从一个字符串中获取子字符串,每次一个,这可以用来很容易的分解像 red green blue 这样的字符串为三个子片段

注册表循环 获取指定的注册表子键的内容,每次一个项目

操作文件和文件夹

要添加文本到文件的末尾,或创建新文件,请使用fileappend 如下面的例子所示,注意它使用n 换行符 来开始新的文本行

要覆盖现有的文件,请在fileappend 之前使用filedelete ,例如

FileDelete, C:\My Documents\My Text File.txt

其他一些常用的文件和文件夹命令是

FileRead: 读取整个文件的内容到变量.
文件读取循环: 逐行读取文本文件的内容.
IfExist: 检查文件或文件夹是否存在.
FileSelectFile 和 FileSelectFolder: 显示可以让用户选取文件或文件夹的对话框.
FileDelete/FileRecycle: 删除/回收一个或多个文件. 使用 FileRemoveDir 来删除整个文件夹.
FileCopy/FileMove: 复制/移动一个或多个文件. 使用 FileCopyDir/FileMoveDir 来复制/移动整个文件夹.
文件和文件夹循环: 获取文件夹中包含的子文件夹和文件, 每次一个.
FileSetAttrib 和 FileSetTime: 改变一个或多个文件的属性或时间戳.
IniRead, IniWrite 和 IniDelete: 创建, 访问和操作标准格式的 INI 文件.
RegRead, RegWrite, RegDelete 和 注册表循环: 操作 Windows 注册表.

命令和函数索引

{ ... } 一对大括号组成的区域表示一个区块,区块通常与函数 else loop while 循环和if 命令一起使用

{...} 创建脚本化关联数组

[...] 创建含整数键的脚本化关联数组

break 退出 终止循环,在各种循环中都是有效的

catch 指定在执行try 语句发生异常时执行的代码

click 在指定坐标处点击鼠标按钮,它还可以按下鼠标按钮,转动鼠标滚轮或移动鼠标

clipwait 等待,一直到剪贴板包含数据

comobjcreate 创建com 对象

dllcall 调用dll 文件中的函数,例如标准的windows api 函数

else 指定当if 语句计算结果为false 时执行的命令,包含多个命令时,需要把它们括在 区块中

envadd 设置变量的值为它自身加上给定的值的和,还可以从日期-时间值中增加或减去时间,同义 于 var+= value

ExitApp 无条件终止脚本

FileAppend 在文件末尾处追加文本 如果有必要,首先创建文本

FileDelete 删除一个或多个文件

FileOpen 提供面向对象的文件io

fileread 读取文件的内容到变量

fileselectfile 显示可以让用户打开或保存文件的标准对话框

Finally 确保 在try 语句结束后总是会执行的代码块

For 对对象中的每对键值对重复执行一系列命令

Gosub 跳转到指定的标签并继续执行

Gui 创建和管理窗口和控件,这种窗口可以用作数据输入窗体或自定义用户界面

if 指定在变量与值比较结果为true 时执行的命令,包含多个命令时,需要把它们括在区块 大括号中

ifwinExist 检查指定的窗口是否存在

inputbox 显示输入框让用户输入字符串

loop 普通 重复执行一系列命令:可以指定表示重复次数的数字或直到遇到break

loop 读物文件内容 逐行读取文本文件的内容,每次一行,比filereadline 执行的更好

MouseGetPos 获取鼠标光标的当前位置以及鼠标当前悬停的窗口和控件,可选的

MsgBox 在含有一个或个多按钮 的小窗口中显示指定的文本

RegExMatch 判断字符串是否包含某个匹配模式 正则表达式

RegExReplace 替换字符串中匹配模式 正则表达式 出现的地方

Return 从子程序返回到之前通过函数调用 gosub 激活 hotkey groupactivate 或其他方式执行跳转的地方

运行 运行外部程序

runwait 运行外部程序并等待期结束

Send SendRaw 发送模拟键击和鼠标点击到活动窗口

SetBatchLines 设置脚本的执行速度 影响CPU使用率

SetTimer 以指定的时间间隔自动并重复运行子程序

SetTitleMatchMode 设置在类似winwait 命令中wintitle 参数的匹配模式

setwindelay 设置在每次执行窗口命令 例如winactivate 后自动的延时

Sleep 在继续前等待指定的时间量

splitpath 把文件名或url 分解成它的名称,目录,扩展名和驱动器

StringGetPos instr 获取指定的子字符串在某个字符串中的位置

strlen 获取字符中包含的字符数量

substr从字符串的指定位置提取一个或多个字符

stringreplace 用新字符串替换执行的子字符串

Throw 发出错误发生的信号,此信号可以被try-catch 语句捕获

try 守护一个或多个语句 命令或表达式以防备由throw 命令抛出的运行时错误和异常

until 根据条件判断是否继续执行loop 或for 循环

var=value 把指定的值赋给变量

var:= expression 计算表法师并把结果保存在变量

varsetcapacity 增加或清空变量占用的内存,通常只有在特殊情况下才需要,例如 dllcall

while 循环 重复执行一系列命令,一直到指定的表达式计算结果为假

win activate 激活指定的窗口

winclose 关闭指定的窗口

win exist 返回首个匹配窗口的唯一id

wingettitle 获取指定窗口的标题

winhide 隐藏指定的窗口

winmaximize 最大化指定的窗口

winminimize 缩小指定窗口为任务栏上的按钮

winwait 等到指定的窗口出现

基本用法和语法

热键

热键有时也称为快捷键,因为它们能简便地出发动作,例如运行程序或键盘宏,

要在热键中使用多个修饰键,那么需要把它们连续地列出来,顺序无关紧要,下面的例子中使用^!s 来表示control+alt+s

1
2
3
^!s::
Send Sincerely,{enter}John Smith ; 此行发送键击到活动 (最前面的) 窗口.
return

在定义热键时您可以使用下列修饰符

# 对于 Windows Vista 及以上版本, 包含 Windows 键的热键 (例如 #a) 会等待 Windows 键被释放后才发送任何包含 “L” 键击的文本. 这样避免了这种热键中的 Send 锁定 PC。这种行为适用于除 SendPlay (这里不需要) 和 盲从模式 外的所有发送模式.

! alt

^ control

  • shift

& 和符号可以用来组合任意两个按键或鼠标按钮,让它们成为自定义热键,请参阅后面了解详情

< 使用成对按键中左边的那个 例如<!a 相当于!a 只是使用左边alt 键才可以触发

> 使用成对按键中右边的那个

<^>! altGr 如果您键盘布局中含altGr 键而非右alt 键,那么这一系列符号一般可用于表示altgr 例如

1
2
<^>!m::MsgBox You pressed AltGr+m.
<^<!m::MsgBox You pressed LeftControl+LeftAlt+m.

或者让altGr 自己成为热键,请使用下面的热键,不像上面出现的任何热键

1
LControl & RAlt::MsgBox You pressed AltGr itself.
  • 通配符,即使附加的休时间也被按住也能激发热键,这常与重映射按键或按钮组合使用,例如
1
2
*#c::Run Calc.exe  ; Win+C、Shift+Win+C、Ctrl+Win+C 等都会触发此热键。
*ScrollLock::Run Notepad ; 即使在按住其他修饰键时按下 ScrollLock 也会触发此热键。

~ 激发热键时,不会屏蔽,被操作系统隐藏,热键中按键原有的功能,在下面的两个例子中,用户的鼠标按钮点击会被发送到活动窗口

1
2
~RButton::MsgBox You clicked the right mouse button.
~RButton & C::MsgBox You pressed C while holding down the right mouse button.

注意, 与其他前缀符号不同,可以在某些热键的变体中使用颚化符前缀而其他的不使用

  1. 代替 alt-tab 的特殊热键总是忽略颚化符前缀。
    1
    [v1.1.14+]:如果把颚化符前缀用在自定义修饰键中且此修饰键自身也作为热键,则在按下此修饰键时会触发热键而不会被延迟到按键释放的时候。例如,上文中~RButton热键在按下此按键时就会触发。对于v1.1.14之前的版本(或未使用颚化符前缀), 则会在按键释放时触发其自身的热键,不过仅在未触发RButton & C组合键的时候。

$ 通常只在脚本使用send 命令发送包含了热键自身的按键时才需要使用此符号,此时可以避免触发它自己 $ 前缀强制使用键盘钩子,来实现此热键,作为一个副作用这样避免了send 命令触发它自己,$ 前缀相当于在此热键定义之前的某个位置指定的 #usehook

1
2
[v1.1.06+]: #InputLevel 和 SendLevel 对send 命令是否触发热键和热字符串提供了额外的控制功能

up

单词 UP 可以跟在热键名后面使得在释放按键时触发热键, 而不是按下时. 下面的例子把 LWin 重映射 为 LControl:

1
2
*LWin::Send {LControl Down}
*LWin Up::Send {LControl Up}

“Up”也可以用于普通热键中,例如:^!r Up::MsgBox You pressed and released Ctrl+Alt+R。它还可以用在组合键(例如 F1 & e Up::

限制:1) “Up”不能和游戏杆按钮一起使用;2) 在没有普通/按下热键副本的“Up”热键会完全接管那个按键以防被卡住。避免这种情况的一种方法是添加颚化符前缀(例如 **~**LControl up::

相关提示, 类似于上面的一种技术是让热键成为前缀键. 好处是尽管热键会在按键松开时激发, 但仅在您之前按住此前缀键时没有按其他任何键的情况下才会如此. 例如:

1
2
LControl & F1::return  ; 通过把左 control 键放在 "&" 前面至少一次来让它成为前缀键.
LControl::MsgBox You released LControl without having used it to modify any other key.

多个热键可以垂直地叠放来让它们执行相同的动作,例如

1
2
3
4
^Numpad0::
^Numpad1::
MsgBox Pressing either Control+Numpad0 or Control+Numpad1 will display this message.
return

通过不为热键或按键组合的热键指定任何操作可以在整个系统重完全禁用它们,下面的例子中禁用了右windows 键

RWin::return

上下文相关的热键

#IfWinActive/Exist 和 #If 指令可以用来让热键根据不同的条件执行不同的动作 (或什么都不做). 例如:

1
2
3
4
5
6
7
8
9
10
#IfWinActive, ahk_class Notepad
^a::MsgBox You pressed Ctrl-A while Notepad is active. Pressing Ctrl-A in any other window will pass the Ctrl-A keystroke to that window.
#c::MsgBox You pressed Win-C while Notepad is active.

#IfWinActive
#c::MsgBox You pressed Win-C while any window except Notepad is active.

#If MouseIsOver("ahk_class Shell_TrayWnd")
WheelUp::Send {Volume_Up} ; 在任务栏上滚动滚轮:增加/减小音量。
WheelDown::Send {Volume_Down} ;

自定义组合键及其他特性

通过在两个按键 不包括操纵杆按钮 间使用& 可以定义定制的组合键,在下面的例子中,您在按住numpad0 接着按下第二个按键时会触发此热键

1
2
Numpad0 & Numpad1::MsgBox You pressed Numpad1 while holding down Numpad0.
Numpad0 & Numpad2::Run Notepad

在上面的例子中,numpad0 成为前缀键,但是这也让numpad0 在被按下时失去了它原有的功能,为了避免此问题,脚本中可以配置numpad0 执行新的动作,例如下列热键的其中一个

1
2
Numpad0::WinMaximize A   ; 最大化活动/前端窗口.
Numpad0::Send {Numpad0} ; 让 Numpad0 释放 时产生 Numpad0 键击. 请参阅下面的注释.

使用上面的其中一个自定义组合热键可以在释放numpad0时执行指定的动作,但仅在您之前按住numpad0 时没有按其他任何按键的情况下,在 v1.1.14+ 中,可以在其中某个热键使用颚化符前缀来避免这种行为

Numlock, Capslock 和 Scrolllock: 这些键可以被强制设置为 “AlwaysOn” 或 “AlwaysOff”. 例如:SetNumlockState AlwaysOn。

覆盖资源管理器热键,在脚本中可以为windows 内置的热键例如Win-E和Win-R指定一个动作来个别的替换,请参阅覆盖页面了解详情

替换alt-tab 热键可以提供alt-tab切换窗口的可选方法,例如,下面的两个热键可以让您用右手进行alt-tab

1
2
RControl & RShift::AltTab  ; 按住右 control 后接着反复下右 shift 来向前移动.
RControl & Enter::ShiftAltTab ; 甚至不需要释放右 control, 直接按 Enter 来反向移动.

鼠标滚轮热键

通过键名 wheeldown 和wheelup 可以支持转动滚轮来激发热键,在 v1.0.48+ 中还支持 WheelLeft 和 WheelRight,但在早于 Windows Vista 的操作系统上没有效果。这里是一些鼠标滚轮热键的例子:

1
2
MButton & WheelDown::MsgBox You turned the mouse wheel down while holding down the middle button.
^!WheelUp::MsgBox You rotated the wheel up while holding down Control+Alt.

在 v1.0.43.03+, 内置变量 A_EventInfo 包含了滚轮转动的格数, 通常为 1. 然而在后面的情况中, A_EventInfo 可能大于或小于 1:

  • 如果鼠标硬件报告小于一格的距离, 那么 A_EventInfo 可能为 0;
  • 如果快速滚动滚轮 (取决于鼠标类型), 那么 A_EventInfo 可能大于 1. 像后面这样的热键可以帮助您分析鼠标:~WheelDown::ToolTip %A_EventInfo%

鼠标滚轮最有用的一些热键包括滚动窗口文本的可选方法. 例如, 使用下面的一对热键可以在您按住左 Control 键并转动滚轮时进行水平滚动而不是垂直滚动:

1
2
3
4
5
6
7
8
9
10
11
~LControl & WheelUp::  ; 向左滚动.
ControlGetFocus, fcontrol, A
Loop 2 ; <-- 增加这个值来加快滚动速度.
SendMessage, 0x114, 0, 0, %fcontrol%, A ; 0x114 是 WM_HSCROLL, 它后面的 0 是 SB_LINELEFT.
return

~LControl & WheelDown:: ; 向右滚动.
ControlGetFocus, fcontrol, A
Loop 2 ; <-- 增加这个值来加快滚动速度.
SendMessage, 0x114, 1, 0, %fcontrol%, A ; 0x114 是 WM_HSCROLL, 它后面的 1 是 SB_LINERIGHT.
return

最后, 由于鼠标滚轮热键只产生按下事件 (从没有弹起事件), 所以它们无法用作 弹起的按键热键.

热键技巧和备注

根据numlock 的状态,每个小键盘上的按键可以运行两个不同的热键子程序,可选的,可以让小键盘上的按键不论NumLock的状态如何都运行相同的子程序,例如

1
2
3
4
NumpadEnd::
Numpad1::
MsgBox, This hotkey is launched regardless of whether Numlock is on.
return

如果颚化符~ 和前缀键一起使用,即使只是一次,那么其中的前缀总是会被发送到活动窗口,例如,在下面的两个热键中,活动窗口都会收到右键点击,尽管只是其中一个热键使用了颚化符

1
2
~RButton & LButton::MsgBox You pressed the left mouse button while holding down the right.
RButton & WheelUp::MsgBox You turned the mouse wheel up while holding down the right button.

Suspend 命令可以临时禁用所有的热键 但不包括您要排除的那些,要得到更大的选择性,请使用 #IfWinActive/Exist.

通过使用hotkey 命令,可以在脚本运行时动态创建热键,hotkey 命令还能单独地修改,禁用或启用脚本现有的热键

操纵杆热键当前不支持修饰符前缀,例如 ^ (Control)# (Win). 不过, 您可以使用 GetKeyState 来模仿这种效果, 如下所示:

1
2
3
4
5
Joy2::
if not GetKeyState("Control") ; 左边和右边的 Control 键都没有按下.
return ; 即什么都不做.
MsgBox You pressed the first joystick's second button while holding down the Control key.
return

如果热键应该在继续执行前等待其修饰键释放,这可能需要一些时间,请参考下面的例子

1
^!s::Send {Delete}

按下 Control-Alt-S 会让系统以为您按下了 Control-Alt-Delete (由于系统对 Ctrl-Alt-Delete 的侵略性检测). 要变通解决此问题, 请使用 KeyWait 来等待按键释放; 例如:

1
2
3
4
5
^!s::
KeyWait Control
KeyWait Alt
Send {Delete}
return

如果像#z:: 这样的热键标签产生了乌龙茶无效热键的错误,那么您的系统键盘布局语言可能不包含特殊字符,尝试使用您键盘布局中您知道的其他字符

热键标签可以作为 gosub 或goto 的目标,例如 gosub ^!s

热键的一个常见用途是启动和停止重复的动作,例如一系列的键击或鼠标点击,关于这方面的例子,请参阅这个FAQ主题

最后,每个脚本都是准多线程的,这样可以在之前的热键子程序还在运行时启动新的热键,例如,即使在当前热键显示msgbox 时也能启动新热键

alt-tab 热键

每个alt-tab 热键必须是两个键的组合,通常通过和符号& 实现,在下面的例子中,按住右alt 键并按下J 或K 可以导航alt-tab 菜单

1
2
RAlt & j::AltTab
RAlt & k::ShiftAltTab

AltTab 和shiftAltTab 是两个特殊的命令,它们仅在与热键在同一行时才能被识别,这里是完整的列表

alttab 如果alttab 菜单可见,那么在菜单中前移,否则,显示菜单

shiftalttab 与上面相同,不过这里在菜单中后移

AltTabAndMenu:如果 alt-tab 菜单可见,那么在菜单中前移。否则, 显示菜单.

AltTabMenuDismiss: 关闭 Alt-tab 菜单.

为了举例说明上述命令,可以用鼠标滚轮完全代替alt-tab 当下面的热键生效时,点击鼠标中键显示菜单,转动滚轮在菜单中导航

1
2
3
MButton::AltTabMenu
WheelDown::AltTab
WheelUp::ShiftAltTab

要取消热键调用的alt-tab 菜单而不激活选择的窗口,请使用类似下面这样的热键,它可能需要根据后面的这些进行调整,最初显示alt-tab 菜单的方法,和2 脚本是否安装了键盘钩子

1
2
3
4
5
LCtrl & CapsLock::AltTab
!MButton:: ; 鼠标中键. ! 前缀让它在按住 Alt 键时激发 (当 alt-tab 菜单可见时, alt 键是按住的).
IfWinExist ahk_class #32771 ; 表示 alt-tab 菜单出现在屏幕上.
Send !{Escape}{Alt up}
return

当前,所有特殊的alt-tab 动作必须像上面的例子那样直接指定到热键上,
自定义的alt-tab 动作还可以通过热键创建,在下面的例子中,按下f1来显示菜单并预先向前移动,然后可以按下f2 来激活选择的窗口,或按下escape 取消

1
2
3
4
5
6
*F1::Send {Alt down}{tab} ; 这里需要星号.
!F2::Send {Alt up} ; 释放 Alt 键激活选择的窗口.
~*Escape::
IfWinExist ahk_class #32771
Send {Escape}{Alt up} ; 取消菜单而不激活选择的窗口.
return

热字串和自动替换

入门和简单示例

尽管热字串主要用于在您输入缩写时进行扩展,自动替换,但是它们也可以用来运行任何脚本动作,从这个角度看,它们类似于热键,只是它们通常由多个字符组成,即字符串

要定义热字串,请用两个冒号包围用来触发的缩写,例如

1
::btw::by the way

上面的 “by the way” 示例被称为自动替换热字串, 因为输入的文本被自动替换为第二个双冒号后指定的字符串. 与之相比, 热字串还可以定义用来执行任何自定义动作, 例如. 注意命令必须放在热字串的 下面.

1
2
3
4
5
6
7
8
::btw::
MsgBox You typed "btw".
return

:*:]d:: ; 此热字串通过后面的命令把 "]d" 替换成当前日期和时间.
FormatTime, CurrentDateTime,, M/d/yyyy h:mm tt ; 看起来会像 9/1/2005 3:53 PM 这样
SendInput %CurrentDateTime%
return

尽管上面的两个例子不是自动替换的热字串,但默认情况下您输入的缩写也会被擦除,这是通过自动退格来实现的,此特性可以通过b0 选项禁用

终止符

除非使用了星号选项,否则您必须在热字串的缩写后输入终止符才能触发它

开始时终止符包含下列字符
:-()[]{}’:;”/,.?!n t(注意 n 是回车,t 是 Tab,且在它们之间还有一个原义的空格)。通过编辑下列示例可以改变这个字符集合,这个例子中为 所有的 热字串设置新的终止符,而不仅是在它下面的那些。

1
#Hotstring EndChars -()[]{}:;'"/\,.?!`n `t

选项

可以使用下面的两种方式改变热字串的默认行为

#Hostring 指令,它会影响脚本中实际在它后面的所有热字串,下列示例会让C 和R 选项生效

下面列表中对每个选项进行说明,当使用上面的方法指定多个选项时,可以在选项间包含空格

  • 星号 不需要终止符,即空格,句点或回车来触发热字串
1
:*:j@::jsmith@somedomain.com

上面的示例会在您输入@字符时立即进行替换,如果在#hostring 指令中含有此选项,那么可以使用*0来关闭它

? 问号即使此热字串在另一个单词中也会被处罚,即,在字符串被混排前立即输入字符,例如,如果 :?:al::airline 为热字串,那么输入“practical ”会得到“practicairline ”。使用 ?0 来关闭此选项.

B0 (B 后跟着零): 不 进行自动退格来擦除您输入的缩写. 关闭此选项后可以使用 B 来启用. 脚本还可以通过 {bs 5} 实现自己的退格, 这里发送 5 次退格. 同样地, 可以通过 {left 5} 发送左方向键的键击. 例如,下面的热字串产生“<em></em>”并把光标向左移动 5 个位置(这样它就在标签之间了):

1
:*b0:<em>::</em>{left 5}

C 区分大小写,当您输入缩写时,它必须准确匹配脚本中定义的大小写形式,使用C0 可以关闭区分大小写的特性

C1 不遵循输入的大小写形式,使用此选项可以让 自动替换热字串 不区分大小写且阻止它们遵循您实际输入字符的大小写形式. 遵循大小写形式的热字串 (这是默认状态) 会在您输入的缩写都为大写时产生大写形式的的替换文本. 如果您的输入只有首字母为大写,那么替换的首字母也会为标题格式(如果首个字符是字母)。您按其他任何大小写形式输入时, 替换会准确按照定义进行发送. 如果在 #Hotstring 指令 中含有此选项, 那么可以使用 C0 来关闭它, 这样可以让热字串重新遵循大小写.

Kn 按键延迟,这个非常少用的选项设置在自动退格或自动替换产生的键击之间的延迟,给n指定新的延迟,例如,指定k10来设置10ms 的延迟而k-1 则取消延迟,此选项的实际效果取决于当前生效的发送模式

SI (SendInput): 由于此模式是没有延迟的, 所以按键延迟会被忽略. 例外是当 SendInput 不可用时, 此时热字串会恢复到下面的 SendPlay 模式 (它会遵循按键延迟).

SP (SendPlay): 默认延迟为零, 这对于 SendPlay 相当于 -1 (没有延迟). 此模式中, 这个延迟实际是 按住时长 而不是键击之间的延迟.

SE (SendEvent): 默认延迟为零. 在大多情况下建议使用零的延迟, 因为这样快速且与其他进程配合比较好 (由于会内部执行 Sleep 0). 指定 k-1 则不使用延迟, 这样可以在您 CPU 经常高负荷运行时让自动替换更快速地进行. 设置为 -1 时, 脚本的进程优先级会成为键击发送速度的重要因素. 要提升脚本的优先级,请使用 Process, Priority,, High。

O: 进行替换时忽略 自动替换热字串 的终止符. 它可以用于当您希望使用终止符让热字串保持清晰, 却不希望终止符显示在屏幕上的时候. 例如,如果 :o:ar::aristocrat 为热字串,那么输入“ar”后跟着空格键会产生不含尾随空格的“aristocrat”,这样可以让您在不需要退格的情况下补上单词的复数或所有格形式。使用 O0 (字母 O 后跟着零) 来关闭此选项.

Pn: 字符串的 优先级 (例如 P1). 这个非常少用的选项对 自动替换热字串 没有效果.

R: 发送原始的替换文本; 即准确地按照原样发送, 而不把 {Enter} 转换成 ENTER 键击, 把 ^c 转换成 Control-C, 等等. 此选项在含 延续片段 热字串中自动生效. 使用 R0 来关闭此选项.

SI、SP 或 SE [v1.0.43+]:设置自动替换热字串发送键击的方法。这些选项是互相排斥的: 每次只会有一个生效. 下面对每个选项进行说明:

SI 表示 SendInput, 它通常比其他模式拥有较好的速度和可靠性. 另一个好处是和下面的 SendPlay 一样, SendInput 会在热字串 自动替换文本 时会延迟您输入的内容. 这样避免了您的键击穿插到替换的内容中. 当 SendInput 不可用时, 热字串会自动使用 SendPlay.
SP 表示 SendPlay, 它可以让热字串运行在更大范围的游戏中.
SE 表示 SendEvent, 在比 1.0.43 早的版本中这是默认选项.

如果未使用上面的任何一个选项,则在v1.0.43及更高的版本中默认模式未sendinput 然而,与si 选项不同的是,在sendinput 不可用时会使用sendevent 而不是sendplay

Z 这个非常少用的选项会在每次热字串触发后重置热字串识别器,换句话说,脚本将开始等待全新的热字串,而不考虑您之前输入的任何内容,这可以避免意外地触发字符串,为了进行说明,请思考下面的字符串

1
2
3
:b0*?:11::
SendInput xx
return

由于上面没有使用 Z 选项, 所以输入 111 (三个连续的 1) 会触发热字串两次, 因为中间的 1 既是首次触发的 末尾 字符, 又是第二次触发的 起始 字符. 在 b0 前面加上字母 Z 后, 您必须输入四个 1 而不是三个才能触发热键两次. 使用 Z0 来关闭此选项.

超长替换

使用延续片段的方法可以让产生大量替换文本的热字串更具可读性和可维护性,例如

1
2
3
4
5
6
7
8
::text1::
(
Any text between the top and bottom parentheses is treated literally, including commas and percent signs.
By default, the hard carriage return (Enter) between the previous line and this one is also preserved.
By default, the indentation (tab) to the left of this line is preserved.

See continuation section for how to change these default behaviors.
)

使用延续片段后也会使热字串默认为原始模式,覆盖此特性的唯一方法是在每个含延续片段的热字串中指定 r0 选项 (例如 :r0:text1::)。

上下文相关的热字串

使用#ifwinactive/exist 指令可以让选择的热字串产生上下文相关性,这样的热字串会根据窗口是否活动或存在的不同情况发送不同的替换,执行不同的动作或什么都不做,例如

1
2
3
4
#IfWinActive ahk_class Notepad
::btw::This replacement text will appear only in Notepad.
#IfWinActive
::btw::This replacement text appears in windows other than Notepad.

自动更正

后面的脚本使用热字串及时更正大约4700常见的英文拼写错误,它还包含了win+H 热键来方便地添加更多拼写错误

备注

替换文本中当前不支持例如%MyVar%这样的变量引用,要解决此问题,请不要让这样的热字串自动替换,而是在缩写下面使用sendinput 命令,后跟着仅包含单词return 的行

要在替换文本后发送额外的空格或tab,可以把它们加在替换文本后,但需要在末尾加上重音符反引号,例如

1
:*:btw::By the way `

热字串助手

Andreas Borutta 推荐了下面额定脚本,如果您是深度的热字串用户,那么它会很有用,使用win+h 可以包当前选择的文本转变为热字串,

重映射按键和鼠标按钮

下面描述的autohotkey 重映射功能通常不如直接通过windows 注册表进行映射那么直接有效
对于每种方法的优点和缺点,请参阅注册表重映射

重映射键盘和鼠标

内置重映射功能的语法为 OriginKey::DestinationKey。例如, 只包含下面这行内容的 脚本 会将 “a” 键重映射成 “b” 键:

1
a::b

上面的例子没有改变 b 键自身的功能,b 键会继续发送b 的键击,除非把它重映射成其他功能,就像下面例子中演示的那样

上述例子中使用小写字母,在大多数情况下建议这么做,因为它也会映射相应的大写字母,
即在capslock 打开或shift 键被按住时会发送大写形式,与之相比,在右边使用大写字母会强制发送大写形式,
例如, 下面的代码行在您输入 “a” 或 “A” 时都会产生大写字母 B (只要 Capslock 是关闭的):

1
a::B

鼠标重映射 要映射鼠标,请使用和映射键盘相同的方法,例如

MButton::Shift 把鼠标中键映射成 Shift 键.
XButton1::LButton 把第四个鼠标按钮映射成鼠标左键.
RAlt::RButton 把右 Alt 映射成鼠标右键.

其他有用的映射

Capslock::Ctrl 把 Capslock 映射成 Control 键. 要保留打开和关闭 Capslock 的功能,还需添加重映射 +Capslock::Capslock(这样,当您按住 shift 键并按下 Capslock 后就可以切换 Capslock 的状态了)。
XButton2::^LButton 把第五个鼠标按钮 (XButton2) 映射成 Control-LeftClick.
RAlt::AppsKey 把右 Alt 键映射成 Apps 键 (这是打开上下文菜单的按键).
RCtrl::RWin 把右 Control 键映射成右 Windows 键.
Ctrl::Alt 把左右 Control 键映射成 Alt 键. 但是, 请参阅 alt-tab 的问题.
^x::^c 把 Control-X 映射成 Control-C. 它也会让 Control-Alt-X 产生 Control-Alt-C, 等等.
RWin::Return 让右 Windows 键简单地执行 return 来禁用它.

您可以尝试执行这里的每个例子,把它们复制到新文本文件,例如 remap.ahk 然后运行这个文件

请参阅按键列表,来了解按键和鼠标按钮名称的完整列表

备注

使用#ifwinactive/exist 指令可以让重映射仅在指定的窗口中有效,例如

1
2
3
#IfWinActive ahk_class Notepad
a::b ; 让 'a' 键到 'b' 键的映射仅在记事本中有效.
#IfWinActive ; 这里让后续的重映射和热键对所有窗口生效.

重映射按键和鼠标按钮在下面的关系中是完整的

按住修饰符 后按下原始键,会让那个修饰符对目标键生效,例如,b::a 会在您按下 control B 时产生controlA 的效果

capslock 通常会想普通键那样影响重映射的按键

按住目标键或按钮的时间和您持续按住原始键的时间一样长,但是,一些游戏不支持重映射,此时,键盘和鼠标的重映射没有效果

按住被重映射的按键时,它们的目标键好自动重复,除非是把按键重映射为鼠标按键

尽管被重映射的按键可以触发普通热键,但默认情况下它不能触发鼠标热键或钩子热键,请使用listhotkey 来找出来哪些热键使用了钩子,例如,如果重映射a::b 有效,那么按下 ctrl alt a 会触发 ^!b 热键,但仅在^!b 不是钩子热键的时候,如果^!b 是钩子热键,而且您希望使用ctrl-alt-a 来执行ctrl-alt-b 相同的动作,那么您可以把^!a 定义为热键,例如

1
2
3
4
5
a::b
^!a::
^!b::
ToolTip You pressed %A_ThisHotkey%.
return

在1.1.06及更高版本中,还可使用#inputlevel 来覆盖此默认行为,例如

1
2
3
4
5
6
7
#InputLevel 1
a::b

#InputLevel 0
^!b::
ToolTip You pressed %A_ThisHotkey%.
return

如果在自动运行段,脚本的顶部使用了sendmode 那么它会影响所有的重映射,但是,由于重映射使用send {build} 而sendplay 模式不完全支持build,所以一些映射在sendplay 模式中可能无法正常运行,尤其是control shift alt 和win 要变通解决此问题,当您脚本中含有重映射时请避免在自动执行段中使用sendplay 而仅在整个脚本的一些需要的地方使用sendplay 命令而不是send . 或者, 您可以包您的重映射转换为热键,如下所述,这样就明确调用sendevent 而不是send

加载脚本时,每个重映射会被转换为一对热键,例如,包含重映射a::b 的脚本实际包含下面的两个热键

1
2
3
4
5
6
7
8
9
*a::
SetKeyDelay -1 ; 如果目标键是鼠标按钮, 则使用 SetMouseDelay 代替.
Send {Blind}{b DownTemp} ; DownTemp 和 Down 相似, 不过使用 DownTemp 时脚本中后面的其他 Send 命令则不会假定 "b" 仍然处于按下的状态.
return

*a up::
SetKeyDelay -1 ; 请参阅下面的注意事项来了解在这段代码中两处 SetKeyDelay 都没有指定按键时长的原因.
Send {Blind}{b Up}
return

但是,上面的两个热键在下列环境中会发生变化

  1. 当原始键为lctrl 而目标见为alt 键时会把send {build}{lalt downtemp}这行语句替换为Send {Blind}{LCtrl Up}{LAlt DownTemp} 如果原始键为rctrl 也会如此,除非使用了{rctrl up}

  2. 当键盘按键被重映射为鼠标按钮时,例如 rctrl::rbutton 在上面的热键中会使用setmousedelay 代替 setkeydelay 而且,上面的首个热键会被替换为下面的热键,这样避免了由于键盘的自动重复功能生成的重复的鼠标点击

1
2
3
4
5
*RCtrl::
SetMouseDelay -1
if not GetKeyState("RButton") ; 即鼠标右键还没有按下.
Send {Blind}{RButton DownTemp}
return

请注意在上面的热键中省略了setkeydelay 的第二个参数 按键时长,这是因为按键时长不适用于独立的按键按下或按键弹起事件例如{b down}{b up}但是,它适用于 shift ctrl alt win 按键状态的改变,这会影响像a::B 或a::^b 的重映射,因此,脚本中任何在自动执行段生效的按键时长会应用于所有这类重映射

尽管一对按键不能直接重映射为单个按键,例如a&c::b是无效的,不过只需要在前面的示例中添加明确的弹起和按下热键即可实现这种行为,简单地把*a:: 替换为a&c:: 且把*a up:: 替换为a&c up::

由于重映射会被简单翻译为上面描述的热键,所以,suspend 也会影响它们,同样地hotkey 命令可以禁用或修改重映射,例如,下面的两个命令会禁用重映射 a::b

1
2
Hotkey, *a, off
Hotkey, *a up, off

alt-tab 的问题,如果您把一个按键或鼠标按键映射为alt 键,那么这个键很可能无法正确实现alt-tab的功能,一个可能得变通解决方法是添加热键*Tab::Send {Blind}{Tab} ,但是需要注意这样很可能妨碍使用真正的alt 实现alt-tab 的功能,因此,这种方法只应用于在您希望单独使用重映射的按键和 alt-tab 热键实现alt-tab 功能的时候

除了按键列表页面中的按键和鼠标按钮,原始键还可以是在特殊按键页面描述的虚拟键 vknn 或扫描码 scnnn 对于目标键同样如此,不过它还可以再虚拟键后指定扫描码,例如,在大多数键盘布局中sc01e::vk42sc030相当于a::b

要禁用按键而不进行重映射,请把它设置为只含有return的热键,F1::return 会禁用F1键

内置的重映射键功能不支持下列按键

鼠标滚轮
wheelup down left right

pause 和break 不能作为目标键,因为它们会被作为命令执行

大括号{} 不能作为目标见,作为替代请使用vksc 方法例如x::+sc01A 和 y::+sc01B
百分号%不能作为目标见,作为替代请使用vksc 方法

return 不能作为目标键,作为替代请使用enter

通过键盘移动鼠标光标

如同在全功能键盘到鼠标的映射脚本中演示的那样,可以使用键盘来移动鼠标光标,由于这个脚本提供了鼠标平滑移动, 加速和其他功能, 所以如果您想使用键盘实现许多的鼠标操作, 推荐您使用这个脚本.

使用注册表的“扫描码映射”功能进行重映射

优点

注册表的重映射功能通常比 autohotkey 的重映射更加直接有效,例如,它能适应于更大范围的游戏,它不存在alt-tab 问题,并且它能触发autohotkey 的钩子热键,然而 autohotkey 的重映射需要间接的方法才行

如果您会手动修改注册表条目 (下面进行阐述), 那么不需要任何外部软件就可以重映射您的键盘. 即使您使用 KeyTweak 来修改注册表条目, 那么完成后 KeyTweak 不需要一直保持运行 (而 AutoHotkey 需要一直运行, 重映射才会生效).
缺点:

注册表重映射比较不灵活: 每次修改映射都必须重启后才会生效.
效果是全局的: 它不能创建针对特定用户, 应用程序或环境的重映射.
它无法发送含修饰键 Shift, Control, Alt 或 AltGr 的组合键. 例如,它不能把小写字符映射为大写字符。
它只支持键盘 (AutoHotkey 还支持 鼠标重映射 和一些 受限的操纵杆重映射).
如何修改注册表: 使用注册表重映射按键至少有两种方法:

使用像 KeyTweak (免费软件) 这样的程序在可视界面中重映射按键. 它会自动修改注册表.
手动创建重映射按键的 .reg 文件 (纯文本) 并把它载入注册表. 演示的例子请参阅 www.autohotkey.com/forum/post-56216.html#56216

按键列表

鼠标键盘

注意: 字母和数字按键的名称和单个字母或数字相同. 例如: b 表示 “b” 键而 5 表示 “5” 键.

概述
CapsLock 大小写锁定键
Space 空格键
Tab Tab 键
Enter (或 Return) 回车键
Escape (或 Esc) 退出键
Backspace (或 BS) 退格键
光标控制
ScrollLock 滚动锁定键
Delete (或 Del) 删除键
Insert (或 Ins) 插入改写切换键
Home Home 键
End End 键
PgUp 向上翻页键
PgDn 向下翻页键
Up 向上方向键
Down 向下方向键
Left 向左方向键
Right 向右方向键
Numpad
NumLock 开启 NumLock 关闭
Numpad0 NumpadIns0 / 插入改写切换键
Numpad1 NumpadEnd1 / End 键
Numpad2 NumpadDown2 / 向下方向键
Numpad3 NumpadPgDn3 / 向下翻页键
Numpad4 NumpadLeft4 / 向左方向键
Numpad5 NumpadClear5 / 通常什么都不做
Numpad6 NumpadRight6 / 向右方向键
Numpad7 NumpadHome7 / Home 键
Numpad8 NumpadUp8 / 向上方向键
Numpad9 NumpadPgUp9 / 向上翻页键
NumpadDot NumpadDel十进制分隔符 / 删除键
NumpadDiv NumpadDiv除
NumpadMult NumpadMult乘
NumpadAdd NumpadAdd加
NumpadSub NumpadSub减
NumpadEnter NumpadEnter回车键
功能
F1 - F24 在大多数键盘顶部的 12 个或更多的功能键。
按键修饰符
LWin 左边的 Windows 徽标键。对应的热键前缀为 <#
RWin 右边的 Windows 徽标键。对应的热键前缀为 >#。 注意:与 Control/Alt/Shift 不同,没有一般的/中性的“Win”键,因为操作系统不支持。不过含 # 修饰符的热键可以被任何一个 Win 键触发。
Control (或 Ctrl) Control 键。单独作为热键(Control::)时它在弹起时触发,不过如果加上颚化符前缀可以改变这种情况。对应的热键前缀为 ^
Alt Alt 键。单独作为热键(Alt::)时它在弹起时触发,不过如果加上颚化符前缀可以改变这种情况。对应的热键前缀为 !
Shift Shift 键。单独作为热键(Shift::)时它在弹起时触发,不过如果加上颚化符前缀可以改变这种情况。对应的热键前缀为 +
LControl(或 LCtrl) 左 Control 键。对应的热键前缀为 <^
RControl(或 RCtrl) 右 Control 键。对应的热键前缀为 >^
LShift 左 Shift 键。对应的热键前缀为 <+
RShift 右 Shift 键。对应的热键前缀为 >+
LAlt 左 Alt 键。对应的热键前缀为 <!
RAlt 右 Alt 键。对应的热键前缀为 >!。 注意:如果您的键盘布局存在 AltGr 而不是 RAlt,那么您完全可以根据这里描述的那样通过 <^>! 把它作为热键前缀使用。此外,LControl & RAlt:: 可以把 AltGr 自身设置成热键。
多媒体
Browser_Back 后退
Browser_Forward 前进
Browser_Refresh 刷新
Browser_Stop 停止
Browser_Search 搜索
Browser_Favorites 收藏夹
Browser_Home 主页
Volume_Mute 静音
Volume_Down 调低音量
Volume_Up 增加音量
Media_Next 下一首
Media_Prev 上一首
Media_Stop 停止
Media_Play_Pause Play/Pause
Launch_Mail 打开默认的电子邮件程序
Launch_Media 打开默认的媒体播放器
Launch_App1 打开我的电脑
Launch_App2 打开计算器
注:上面列出的每个按键的功能可以通过修改 Windows 注册表进行替换。这个表格中显示的是在 Windows 系统的大多数版本中每个按键的默认功能。
特别
AppsKey 菜单键。这是调用右键上下文菜单的按键。
PrintScreen 捕获屏幕
CtrlBreak
暂停 暂停键
中断 中断键。由于此键和 Pause 含义相同,所以在热键中请使用 ^CtrlBreak 代替 ^Pause^Break
帮助 帮助键。此键可能在大多数键盘上不存在。它通常和 F1 不同.
Sleep 休眠键。注意在一些键盘上的 sleep 键可能不是休眠功能。
SCnnn 请在 nnn 中指定按键的扫描码。识别上面没有提到的罕见的按键。请参阅特殊按键了解详情。
VKnn 请在 nn 中指定十六进制的虚拟按键码。这种极少用的方法还可以避免某些类型的热键需要安装键盘钩子。例如,后面的热键不使用键盘钩子,但副作用是它会在按下 Home 或 NumpadHome 的其中一个时触发:^VK24::MsgBox You pressed Home or NumpadHome while holding down Control. 已知限制:强制使用键盘钩子的 VK 热键,例如 *VK24~VK24,只会触发其中一个热键,而不会触发两者(例如触发 NumpadHome 但不触发 Home)。关于 VKnn 方法的更多细节,请参阅特殊按键

操纵杆

尽管下列操纵杆控制器的名称不能设为热键, 但它们可以用于 GetKeyState:
JoyX, JoyY 和 JoyZ: 操纵杆的 X (水平), Y (垂直) 和 Z (高度/深度) 轴.
JoyR: 操纵杆的方向舵或第 4 轴.
JoyU 和 JoyV: 操纵杆的第 5 和第 6 轴.
JoyPOV: 视点 (帽) 控制器.
JoyName: 操纵杆或其驱动的名称.
JoyButtons: 操纵杆支持的按钮数 (不总是准确的).
JoyAxes: 操纵杆支持的轴数.
JoyInfo: 提供由零个或多个后面的字母组成的字符串, 这些字母表示操纵杆的功能: Z (有 Z 轴), R (有 R 轴), U (有 U 轴), V (有 V 轴), P (有 POV 控制器), D (POV 控制器有少数离散的/不同的设置), C (POV 控制器是连续的/良好的). 示例字符串: ZRUVPD

多个操纵杆: 如果计算机上有多个操纵杆并且您想使用第一个外的其他操纵杆, 那么请在控制器名称的前面加上操纵杆的编号 (最大为 16). 例如, 2joy1 表示第二个操纵杆的首个按钮.

注意: 如果您在使用脚本识别您的操纵杆时遇到问题, 曾有人报告说尽管只有一个操纵杆却需要指定大于 1 的操纵杆编号. 不清楚这种方法是如何得到的或是否正常, 不过请尝试在 操纵杆测试脚本 中使用操纵杆编号也许可以帮助确定这种方法是否适合您的系统.

另请参阅:
操纵杆重映射: 使用操纵杆发送键击和鼠标点击的方法.
操纵杆到鼠标的映射脚本: 把操纵杆作为鼠标使用.

手持遥控

特殊按键

如果您的键盘或鼠标含有前面没有列出的按键,那么使用下列步骤后您仍可能把它设为热键

确保至少有一个使用键盘钩子的脚本正在运行,打开脚本的

双击脚本的托盘图标来打开其主窗口.
按下您键盘上的其中一个 “神秘按键”.
选择菜单项 “View->Key history”
向下滚动到页面的底部. 在底部附近的某个地方可以看到您按键的按下和弹起事件. 注: 一些按键不生成事件, 因此这里看不到它们的事件. 如果是这种情况, 那么您不能直接把此特殊按键设为热键, 因为您的键盘驱动或硬件在很低的 AutoHotkey 无法访问的层面处理它. 要得到可能的解决方法, 请参阅较远的后面.
如果检测到了您的按键, 请记下列表中第二列的 3 位十六进制值 (例如 159).
要把此键定义为热键, 请参照此例:

1
2
3
SC159:: ; 把 159 替换为您按键的值.
MsgBox, %A_ThisHotKey% was pressed.
return

反向: 要把其他键重映射 为 “神秘按键”, 请参照此例:

1
2
3
; 把 159 替换为上面找到的值. 把FF(如果需要)替换为
; 按键的虚拟键,它可以在按键历史页面的首列找到。
#c::Send {vkFFsc159}

可选的解决方案,如果您的按键或鼠标按钮没有在按键历史页面检测到,那么下面的其中一种方法可能有帮助

重新配置您鼠标或键盘的附带软件,有时可以在控制面板或开始菜单中访问,来让神秘按键发送其他的键击,然后可以在脚本中把这样的键击设置为热键, 例如,如果您配置神秘按键来发送 Control+F1,然后在脚本中通过使用 ^F1:: 您可以把这个按键间接的设置为热键。

试试 DllCall: 对人体学输入设备的支持. 您还可以在 论坛 中搜索类似 RawInput* 的关键字.

下面是最后的手段, 通常应该在其他所有方法都无效时才去尝试. 这是由于成功的机会很小且可能会引起难以取消的不必要的副作用.
禁用或移除您键盘或鼠标的附带软件, 或者让它使用更标准的驱动, 例如操作系统内置的那个. 这里假设您特殊的键盘或鼠标使用自己的驱动并且您不使用其自带驱动和软件提供的功能.

脚本

简介
脚本顶部
转义序列
在脚本中添加注释
包过长的行分割成一系列短行
把脚本转换成exe
向脚本传递命令行参数
脚本文件代码页

调试脚本
autohotkey 的可移植性
安装程序选项

如果脚本不是 持续运行的 且不含有 热键, 热字串, OnMessage 和 GUI, 那么它会在自动执行段结束后终止. 否则, 它会以空闲状态继续运行, 从而对例如热键, 热字串, GUI 事件, 自定义菜单项 和 计时器 这些事件进行响应.

转义序列
AutoHotkey 中默认的 转义符 为重音符/反引号 (`), 它位于大多数英文键盘的左上角. 使用这个字符而不是反斜线可以避免在文件路径中使用双反斜线.

由于在 AutoHotkey 中逗号和百分号具有特殊含义,因此需要使用 , 来指定原义的逗号,使用 % 来指定原义的百分号。其中的一个例外是 MsgBox,它里面的逗号不需要进行转义。另一个例外是在任意命令最后一个参数中的逗号: 它们不需要进行转义. 请参阅 #EscapeChar 了解转义序列的完整列表。

某些特殊的字符也需要使用转义序列的方法生成. 最常见的有 `t(tab)、`n(换行)和 `r(回车)。

提示: 任何命令中的首个逗号可以省略 (除非首个参数为空或以 := 或 = 开始, 或命令单独处于 延续片段 的顶部). 例如:

把过长的行分割成一系列短行

可以把过长的行分割成一系列短行来提高可读性和可维护性,这样不会降低脚本的执行速度,因为在脚本启动时这些短行会在内存中合并起来

方法 #1: 以 “and”, “or”, ||, &&, 逗号或 句点 开始的行会自动合并到其前一行 (在 v1.0.46+, 以除了 ++ 和 – 外其他所有的 表达式运算符 开头的行也会如此). 在下面的例子中, 第二行会自动附加到首行, 因为它以逗号开始:

1
2
FileAppend, This is the text to append.`n   ; 这里可以使用注释.
, %A_ProgramFiles%\SomeApplication\LogFile.txt ; 注释.

同样地, 下列几行会合并成单行, 因为最后两行以 “and” 或 “or” 开始:

1
2
3
if (Color = "Red" or Color = "Green"  or Color = "Blue"   ; 注释.
or Color = "Black" or Color = "Gray" or Color = "White") ; 注释.
and ProductIsAvailableInColor(Product, Color) ; 注释.

三元运算符 也是个不错的选择:

1
2
3
ProductIsAvailable := (Color = "Red")
? false ; 我们没有任何红色产品, 所以不用那么麻烦去调用函数.
: ProductIsAvailableInColor(Product, Color)

尽管在上面的例子中缩进不是必须的, 但它可以显示出哪些行属于上一行从而提高代码清晰度. 并且, 可以不必在单词 “AND” 和 “OR” 开始的行加上额外的空格; 程序会自动处理这些. 最后, 可以在上面例子中任意行的末尾或行与行之间添加空行或 注释.

方法 #2: 这种方法可以合并大量的行或不适合方法 #1 处理的行. 尽管此方法对 自动替换热字串 特别有用, 但它也可以用于任意命令或 表达式. 例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; 示例 #1:
Var =
(
Line 1 of the text.
Line 2 of the text. By default, a linefeed (`n) is present between lines.
)

; 示例 #2:
FileAppend, ; 此时逗号是不能缺少的.
(
A line of text.
By default, the hard carriage return (Enter) between the previous line and this one will be written to the file as a linefeed (`n).
By default, the tab to the left of this line will also be written to the file (the same is true for spaces).
By default, variable references such as %Var% are resolved to the variable's contents.
), C:\My File.txt

在上面的例子中,一系列行被头尾的一对括号包围起来,这被称为延续片段,注意在底行的闭括号后面包含了fileappend 的最后一个参数,这种做法是可选的,这样做是为了在这种情况下把逗号视为参数分隔符而不是原义的逗号

通过在延续片段的开括号右侧包含一个或多个下列选项,可以覆盖它的默认特性,如果含有多个选项,那么选项之间使用空格分隔,例如( LTrim Join| %

Join: 指定行与行之间连接的方式. 如果省略此选项, 那么除最后一行外的其他行后面都会跟一个换行符 (n). 如果指定单词 *Join* 自身, 则行与行之间直接连接而不添加任何字符. 或者在单词 *Join* 后可以紧跟着多达 15 个字符。例如,Joins 会在除最后一行外的每行末尾插入一个空格(“s”表示原义的空格,这是一个只能被 *Join* 识别的特殊转义序列)。另一个例子是 Joinrn,它会在行与行之间插入 CR+LF。同样地,Join|` 会在行之间插入管道符。要让延续片段的最后一行也以连接字符串结尾, 需要在它的闭括号上一行添加一个空行.

LTrim: 删除每行开头的空格和 tab. 主要用来允许延续片段使用缩进. 此外,通过在一行中指定 #LTrim 自身可以为多个延续片段打开此选项。#LTrim 是与位置有关的::会影响它下面的所有延续片段。通过 #LTrim Off 可以关闭此设置。

RTrim0 (RTrim 后跟着零): 关闭自动删除每行末尾的空格和 tab 的设置.

Comments(或 CommentComC) [v1.0.45.03+]:允许在延续片段中使用分号注释(但不支持 /*..*/)。这样的注释 (以及它们左边的任何空格和 tab) 会在连接时完全被忽略而不是当成原义文本处理. 每个注释可以放在一行的右侧或单独一行.

% (百分号): 把百分号视为原义字符而不是变量引用. 这样避免了需要把每个百分号 转义 成原义字符. 在百分号已经为原义的地方不需要使用此选项, 例如 自动替换热字串.

, (逗号): 把逗号作为分隔符而不是原义逗号. 这个非常少用的选项只有在命令参数之间才需要, 因为在 函数调用 中逗号的类型没有影响. 并且, 此选项只会转换那些真正的分隔参数的逗号. 换句话说, 一旦到达命令的最后一个参数 (或者命令没有参数), 那么会忽略此选项而把后续的逗号当成原义逗号.

**** (重音符): 把每个反引号视为原义字符而不是 [转义符](https://ahkcn.sourceforge.net/docs/commands/_EscapeChar.htm). 此选项同时也避免了需要分别对逗号和百分号进行明确地转义. 此外, 它还阻止对任何特定的转义序列例如 r 和 `t 进行转义.

) [v1.1.01+]: 如果在延续片段的选项中使用闭括号 (不是作为 Join 选项的参数), 那么此行被重新解释为表达式而不是延续片段的开始. 这样可以让像 (x.y)[z]() 这样的表达式可以在不需要对开括号进行转义的情况下也有效.

使用 Ahk2Exe 有下列几种方式:

GUI 界面: 运行菜单菜单中的 “Convert .ahk to .exe” 菜单项.
右键点击: 在资源管理器中, 您可以在任何一个 .ahk 上右键点击并选择 “Compile Script” (只有在安装 AutoHotkey 时选择了脚本编译器时时才可用). 这样创建了与脚本具有相同的主文件名的 EXE 文件, 它会在稍后出现在相同目录中. 注: 这样生成的 EXE 文件会使用与前面的方法 #1 最后一次使用时相同的自定义图标, .bin 文件以及 MPRESS 设置.
命令行: 编译器可以使用下列参数在命令行中运行:
Ahk2Exe.exe /in MyScript.ahk [/out MyScript.exe] [/icon MyIcon.ico] [/bin AutoHotkeySC.bin] [/mpress 0or1]
例如:
Ahk2Exe.exe /in “MyScript.ahk” /icon “MyIcon.ico”
用法:
含有空格的参数应该包围在双引号中.
如果省略了 “out” 文件, 则使用脚本的主文件名作为 EXE 的主文件名.
注意:

进行编译通常并不会提升脚本的性能.
截至 v1.1.01, 还不支持密码保护和 /NoDecompile 选项.
如果在 AutoHotkey 安装目录的 “Compiler” 子文件夹中含有 mpress.exe, 则会使用它压缩脚本的可执行文件, 除非通过 /mpress 0 或 GUI 设置把它禁用了. 这样同时压缩了脚本的源代码 (删除了所有注释), 其中的源码可以使用 PE 资源编辑器从可执行文件中提取.
命令 #NoTrayIcon 和 “Menu, Tray, ShowMainWindow” 会影响已编译脚本的行为.
使用类似 Resource Hacker (免费软件) 的工具编辑 “AutoHotkeySC.bin” 文件可以给已编译脚本添加自定义版本信息 (和在资源管理器的文件属性对话框中看到的那些). 此文件包含在 AutoHotkey 安装目录的 “Compiler” 子文件夹中. 可以使用 Compile_AHK II 简化这个过程. 截至 v1.1.01, 可以直接编辑已编译脚本而不是 AutoHotkeySC.bin.
还可以使用上面的方法改变所有已编译脚本现有的图标或为它们添加新图标.
如果脚本以编译的形式运行, 则内置变量 A_IsCompiled 的值为 1. 否则为空.
传递参数到 Ahk2Exe 后, 它会在标准输出中写入表示编译过程成功与否的消息. 尽管此消息不会显示在命令提示符中, 但可以通过像重定向到文件的方法 “捕获”. [v1.0.43+]

变量

变量的类型

autohotkey 中没有明确的变量类型,然而,只包含数字的变量进行数学运算或比较时,会被自动转换为数值,为了提高性能,在内部会对数字进行缓存以避免与字符串之间的转换

变量的作用域和声明

除了函数中的局部变量,其他所有变量都是全局的,即可以在脚本的任意位置读取或修改它们的内容,除了在函数页面注明的情况,变量都是不需要声明的,使用它们的时候它们就产生了 每个变量初始为空

变量的名称
变量名不区分大小写,变量名可以含有多达253 个字符,并且可以由字母,数字以及后面的标点组成 #_@$

考虑到命名的惯例,通常在命名变量时最好仅使用字母,数字,和下划线 这样的风格可以让熟悉其他计算机语言的人更容易理解您的脚本,而且,如果您在autohotkey 和其他语言中使用相同的风格,您会发现能更容易读懂自己的脚本

尽管变量名可以完全由数字组成,但通常这样的名称仅用于 传入的命令行参数,这样数值名称的变量不能用在表达式中,因为它们会被看成是数字而不是变量

因为单词 and or 和not 作为表达式的运算符使用,所以通常不应该把它们用作变量名称,在表达式中使用这样的名称会无法正确计算

给变量赋值,要把字符串或数字保存到变量中,由两种方法,传统方法和表达式方法,传统方法使用等号运算符= 来指定没有加引号的,原义字符串或包围在百分号中的变量,例如

1
2
3
MyNumber = 123
MyString = This is a literal string.
CopyOfVar = %Var% ; 和 = 运算符一起使用时, 需要使用百分号来获取变量的内容.

与之相比,表达式方法使用 冒号等号运算符 来保存数字,加引号的字符串和其他类型的表达式,下面的例子在功能与前面的例子相同

1
2
3
MyNumber := 123
MyString := "This is a literal string."
CopyOfVar := Var ; 和前面段落中与其作用相同的语句不同, 百分号不和 := 运算符一起使用.

后一种方法由于其更清晰并且与其他许多语言几乎一致的表达式语法 成为大多数人的首选方法

从上面的例子中您可能已经想到了有两种方法来清除变量的内容 即让变量为空

1
2
MyVar =
MyVar := ""

上面的这对空引号只能和:= 运算符一起使用,因为和= 运算符一起使用时,则会在变量中保存两个原义的引号字符

获取变量的内容

如同赋值有两种方法,获取变量的内容也有两种方法,传统方法和表达式方法,传统方法需要将变量名包围在百分号来获取变量的内容,例如

1
2
MsgBox The value in the variable named Var is %Var%.
CopyOfVar = %Var%

与之相比,表达式方法省去了变量名两边的百分号,但原义的字符串必须包围在双引号中,所以,下面的表达式作用等同于上面的例子

1
2
MsgBox % "The value in the variable named Var is " . Var . "."  ; 使用句点连接两个字符串.
CopyOfVar := Var

从上面的msgbox 这行,, 通过使用百分号和空格把参数从传统模式改变为表达式模式. 因为所有的命令默认情况下使用传统模式 (除了另外注明的那些), 所以这是必须的. 不过, 某些命令的特定参数已注明接受表达式, 此时前导的百分号可以省略. 例如, 下面的所有语句都是等效的, 因为 Sleep 的首个参数可以是表达式:

1
2
3
Sleep MillisecondsToWait
Sleep %MillisecondsToWait%
Sleep % MillisecondsToWait

变量的比较,请阅读下面表达式部分中关于不同类型变量比较的重要提示,尤其是关于何时使用小括号的内容

表达式

表达式用来对一系列变量,原义字符串 或原义数字执行一个或多个操作

表达式中的变量名称不用包围在百分号中,伪数组和其他的双重引用除外,所以,为了与变量区别 原义的字符串必须用双引号包围
例如

1
2
if (CurrentSetting > 100 or FoundColor <> "Blue")
MsgBox The setting is too high or the wrong color is present.

在上面的例子中,因为blue 是原义字符串,所以包围在双引号中,要在原义字符串中包含真实的引号字符,请指定两个连续的引号

如同此例中的两次演示:”She said, “”An apple a day.”””。

重要说明:含有表达式的 if 语句与传统的 if 语句(例如 If FoundColor <> Blue),可以通过单词“if”后是否有开括号来区分。尽管通常把整个表达式包围在括号中,不过也可以写成这样:if (x > 0) and (y > 0)。此外, 如果单词 “if” 后的第一项为 函数调用 或类似 “not” 或 “!” 这样的运算符时, 开括号可以完全省略.

空字符串: 要在表达式中使用空字符串, 请指定一对空引号. 例如,当 MyVar 非空时语句 if (MyVar <> "") 的结果为真。然而, 在 传统 if 语句 中, 一对空引号会被视为原义的字符串. 例如,当 MyVar 仅包含一对真实的引号时语句 if MyVar = "" 结果为真。因此,要使用传统的 if 语句判断变量是否为空,则需要让 = 或 <> 的右侧为空,例如:if Var =

相关提示,任何无效的表达式例如 (x +* 3) 会产生空字符串。

保存表达式的结果: 要把结果赋值给变量, 请使用 := 运算符. 例如:

1
NetPrice := Price * (1 - Discount/100)

布尔值: 要计算表达式结果为真还是假时 (例如 IF 语句), 表达式结果为空或零被视为假, 而其他所有结果都视为真. 例如,仅当 ItemCount 为空或 0 时 if ItemCount 的结果才为假。类似地,表达式 if not ItemCount 将产生相反的结果。

像 NOT/AND/OR/>/=/< 这些运算符的运算会自动产生真值或假值的结果: 真值时结果为 1 而假值时为 0. 例如, 在下面的表达式中, 如果有一个条件为真则变量 Done 被赋值为 1:

1
Done := A_Index > 5 or FoundIt

如上面提示的那样, 简单地置空变量或为其赋值为 0 可以让它假值. 利用这种特性,可以使用简写语句 if Done 来检查变量 Done 是真还是假。

单词 truefalse 是值分别为 1 和 0 的内置变量. 使用它们可以增加脚本的可读性, 例如:

1
2
CaseSensitive := false
ContinueSearch := true

整数和浮点数: 在表达式中, 含有小数点的数字被视为浮点数; 否则视为整数. 对于大多数运算符(例如加法和乘法),只要其中的一个输入是浮点数,那么结果也将是浮点数。

不论在表达式中还是在表达式外的其他地方, 整数都可以表示成十六进制或十进制. 十六进制数必须以前缀 0x 开头. 例如,Sleep 0xFF 等同于 Sleep 255。在 v1.0.46.11+,可以识别用科学计数法表示的浮点数;但只有在它们含有小数点时才行(例如 1**.**0e4-2**.**1E-4)。

强制使用表达式: 通过在表达式前加上百分号和空格或 tab, 能把表达式用在不直接支持表达式的参数中 (除了像 StringLen 的 OutputVar 和 InputVar 的那些参数). 这种技巧常用来访问 数组. 例如:

1
2
3
4
5
FileAppend, % MyArray%i%, My File.txt
MsgBox % "The variable MyVar contains " . MyVar . "."
Loop % Iterations + 1
WinSet, Transparent, % X + 100
Control, Choose, % CurrentSelection - 1

表达式中的运算符

除了下面注明的情况, 其他时候在数学运算中包含的任何空值 (空字符串) 都 不会 被假定为零. 作为替代, 它会被视为错误, 这将导致那部分表达式的计算结果为空字符串. 例如, 如果变量 X 为空, 那么表达式 X+1 会产生空值而不是 1.

20230514-楼宇协议,什么是BACnet

https://zhuanlan.zhihu.com/p/495107879

IT 和 OT 正在走向融合

后疫情时代,智能建筑只会变得越来越重要,楼宇设备的集成也会更加普及与深度

bacnet 代表 楼宇自动化和控制网络,是楼宇自动化中使用最广泛的标准协议,它的创建是为了简化楼宇自动化设备并开放数据通信,但是,我们为什么要使用它,它来自哪里

bacnet 起源

bacnet 是用于智能建筑的通信协议,是国际标准化组织,美国国家标准协会及美国采暖,制冷与空调工程师学会 定义的通信协议,楼宇设备由不同的厂商提供,每个设备都有其自有通讯协议,因此对于业主来说,系统的维护和监管极其繁琐,为了解决这一问题,bacnet 标准委员会因此诞生,它可以提高供应商之间的互操作型,最大限度地减少对各个设备制造商定义的专有系统的约束,除此之外,系统的标准化也使得整个楼宇自动化工作站成为可能,所有相关设备的数据可以在工作站中进行处理,而不必在乎这些数据出自哪个设备供应商提供的
bacnet 的第一个版本为标准135,于1995年被采用,bacnet 协议的开发也有利于hvac 行业,引入了整合和标准化bas 功能的可能性,如数据共享,报警,事件管理、趋势、调度和远程管理,bacnet 不仅仅是一个通信协议,bacnet 还定义和描述了网络上的设备,以及这些设备提供的对象和服务

所以不像其他一些通信协议只关注信息如何移动,bacnet 对于网络上的设备具有内置的规则和行为,它可以识别网络上设备的类型,并知道对它们的期望,这就是对象发挥作用的地方

BACnet 对象的定义

在bacnet 设备中,数据被组织成对象,对象表示物理输入,输出和数据变量,这些变量表示设备上的点,以及其他更复杂的结果,如趋势日志和时间表,对象进一步定义为一组属性,可以通过工作站或其他软件进行监视或命令,考虑房间中的温度传感器:它可能有一个点,表示为一个可以称为“SPACE-TEMP”的对象,以便使其成为经过认证的BACnet设备,该传感器还将包括标准服务。因此,其他bacnet 设备或软件可以发现和读取这个space-temp 对象

工作站,甚至是移动设备,都可以调用温度传感器内的所有其他相关数据点,使其能够在网络上被看到,并正确地传输其数据,这些服务在控制器中启用并运行,非常像服务器,有许多潜在的对象类型

BLC 认证

为了使业界保持 bacnet 设备之间的互操作性,而不管它们的制造商是谁,供应商必须将每个设备型号提交给bacnet 测试实验室,以获得复合bacnet 标准的认证,该认证证明供应商的设备是作为12种公共认证类型的设备之一所生产的,并且其对象和服务是按照标准操作的,如果没有BTL 认证,您将面临设备在bacnet 网络中无法正常通讯的风险

这一切在建筑中是如何运作的,bacnet 支持七种局域网类型,通过以下方式进行通信

IP(IPv4 and IPv6);
Ethernet(ISO 8802-3);
Master Slave/Token Passing MS/TP(RS485)
Point-to-Point (PTP) (RS 232)
ZigBee
LonTalk
ARCNET

BBMD 功能

目前使用的两种最普遍的局域网类型是 BACnet/IP和BACnet MS/TP。BACnet/IP 允许跨多个子网、多区控制系统进行通信,利用光纤和千兆以太网的优点 并为设备分配ip 地址

但是,目前大多数bacnet 网络都采用了使用RS485双绞线的MSTP 在某些情况下,您可能混合使用mstp 和ip 网络,或者您可能希望在服务器上安装一个工作站,而不必将rs_485接口集成到服务器中

在这些情况下,我们将使用bacnet 路由器将bacnet mstp 和bacnet ip 网络连接。在具有IP子网的多个建筑物或多个子网的情况下,您将使用具有称为“BBMD”的特殊功能的BACnet路由器。BBMD代表“BACnet Broadcast Management Device”广播管理设备,是一种将BACnet广播消息以定向单播消息的形式从一个IP子网隧道到另一个IP子网的方法。因为IP路由器会阻塞广播消息,所以需要BBMD,而在BACnet中,广播消息是设备之间发现和通信的必要条件。

这只是bacnet 工作方式的表面,每个安装都有一些细微的差别,可以用来优化网络的通信方式

同时也欢迎您访问我们的intesis 网站

了解更多bacnet 设备的通信解决方案

20230514-网络工程师常用命令合集

ping 命令

ping 是一个使用频率极高的实用程序,主要用于确定网络的连通性,这对确定网络是否正确连接,以及网络连接的状况十分有用,简单的说,ping 就是一个测试程序,如果ping 运行正确,大体上就可以排除网络访问层、网卡、modem 的输入输出线路,电缆和路由器等存在的故障,从而缩小问题的范围

ping 能够以毫秒为单位显示发送请求到返回应答之间的时间量,如果应答时间短,表述数据报 不必通过太多的路由器或网络,连接速度比较快,ping 还能显示TTL Time to Live 生存时间

通过ttl 值可以推算数据包通过了多少个路由器

  1. 命令格式

ping 主机名

ping 域名

ping IP地址

  1. ping 命令的基本应用

一般情况下,用户可以通过使用一系列ping 命令来查找问题出在什么地方,或检测网络运行的情况,下面就给出一个典型的检测次序及对应的可能故障

ping 127.0.0.1

如果测试成功,表明网卡,tcp ip 协议的安装 ip 地址,子网掩码的设置正常,如果测试不成功,就表示 TCP/IP 的安装或设置存在有问题

ping 本机ip 地址

如果测试不成功,则表示本地配置或安装存在问题,应当对网络设备和通讯介质进行测试,检查并排除

ping 局域网内其他ip

如果测试成功,表明本地网络中的网卡和载体运行正确,但如果收到0个回送应答,那么表示子网掩码不正确或网卡配置错误或电缆系统有问题

ping 网关ip

这个命令如果应答正确,表示局域网中的网关路由器正在运行并能够做出应答

ping 远程ip

如果收到正确应答,表示成功的使用了缺省网关,对于拨号上网用户则表示能够成功的访问internet

ping localhost

local host 是系统的网络保留名,它是127.0.0.1 的别名,每台计算机都应该能够将该名字转换成该地址,否则,表示主机文件 windows host 中存在问题

ping yahoo.com 一个著名网站地址

对此域名执行ping 命令,计算机必须先将域名转换成ip 地址,通常是通过dns 服务器,如果这里出现故障,则表示本机dns 服务器的ip 地址配置不正确,或它所访问的dns 服务器有故障

如果上面所列出的所有ping 命令都能正常运行,那么计算机进行本地和远程通信基本上就没有问题了,但是,这些命令的成功并不表示你所有的网络配置都没有问题,例如,某些子网掩码错误就可能无法用这些方法检测到

ping 命令的常用参数选项

ping ip -t 连续对ip 地址执行ping 命令,直到被用户以ctrl C中断

20230512-视频监控三种存储方式NVR、IP-SAN和CVR哪种好

对于监控的项目来说,需要考虑四个部分,那就是前端系统,传输系统,存储系统以及显示系统

存储系统是监控项目中非常重要的一部分,很多朋友也经常讨论到,那么今天我们来了解下常用的三种存储方式 NVR IP-SAN 和CVR 之间的区别

NVR 存储 是网络硬盘录像机的缩写,NVR 最主要的功能是通过网络接收IPC 网络摄像机,设备传输的数字视频码流,并进行存储、管理,从而实现网络化带来的分布式架构优势,简单来说,通过NVR,可以同时观看,浏览,回放,管理,存储多个网络摄像机,摆脱了电脑硬件的牵绊,再也不用面临安装软件的繁琐

NVR 框架

现在市场上面也有少量的128路NVR 因为NVR 是x86 架构储存+监控软件,他本身也有磁盘阵列功能

NVR 主要用于中小型监控的方案中,但对于大型监控应用来说,NVR 他短板大于他有时,监控点多,码流大,压力高,容量大等问题,都会使它使用起来力不从心,而对于大型公共监控的要考虑其扩展性,易管理性,所以采用IP-SAN或CVR 的存储方式

第二种 IP-SAN存储

IP-SAN 即基于ip 以太网络的san 存储架构,它使用iscsi 协议传输数据,直接在ip 网络上进行存储,iscsi 协议就是把scsi 命令包在tcp/ip 包中传输,即为scsi over tcp/ip

ip san 也算是san 的一种,只是服务器和存储之间通过网络交换机互联,性能不算最好,但不受距离的限制,ip 存储应用十分广泛,一般也可作为大型监控存储

IP-SAN 也算是san的一种,只是服务器和存储之间通过网络交换机互联,性能不算最好,但不受距离的限制,ip 存储应用十分广泛,一般也可作为大型监控存储

ip-san 可以将存储设备分成一个或多个卷,并导出给前端应用客户端,客户端计算机可以对这些导过来的卷进行新建文件系统 格式化操作,客户端计算机对这些卷的访问方式为设备级的块访问,IP-SAN 通过把数据分成多个数据块 block 并行写入 读出磁盘,块级访问的特性决定了iscsi 数据访问的高io 性能和传输低延迟

简单的说,它是以块作为存储的,你可以认为它是含阵列功能的硬盘,其实就是磁盘阵列+硬盘

相比较nvr 存储来说,ip-san 一般会与流媒体服务器一起使用

其中流媒体服务器的作用是为了有效的解决多用户同时访问同一实时视频数据信息时对网络宽带重复占用的问题,充分节省网络带宽资源,有效降低网络阻塞的发生,需要在联网监控中心配备一台流媒体服务器

ip-san 存储模式具有如下特点

具有高带宽 块 级数据传输的优势

即使tpc ip ip 网络技术成熟,具有tcp ip 的所有优点,可路由等,减少了配置、维护管理的复杂度

可以通过以太网来部署iscsi 存储网络,易部署,成本低

易于扩展,当需要增加存储空间时,只需要增加存储设备即可完全满足,扩展性高

数据迁移和远程镜像容易,只要网络带宽支持,基本没有距离限制,更好的支持备份和异地容灾

CRV 存储
海康 crv 存储模式可支持视频流经编码器直接写入存储设备,省去存储服务器成本,避免服务器形成单点故障和性能瓶颈,独特的数据结构确保监控服务的高稳定和高性能

存储框架

而CVR 是安防监控的专用视频存储设备,cvr 是tcp ip 上的视频流改写成流数据结构直接写到磁盘里,所以磁盘里存的不是文件,没有碎片

CVR 存储模式的特点

前端直接统一管理

海康cvr 存储模式可支持视频流经编码器直接写入存储设备,省去存储服务器,可通过集中管理平台可实现多网络存储设备的集中化管理和状态监控,可以实现业务系统中存储设备的集中配置,管理,实时监控存储设备单元工作状态及其对应可管理的设备部件,运行协议,RAID 组等内容,集中报警管理支持对存储设备的定期状态巡检功能,对系统运行状态 阵列运行,iscsi http cifs scsi 通道等状态进行实时监控,集中显示

  1. 简化网络结构

海康cvr 存储模式通过前端编码设备直接写入存储设备中,不需要存储服务器,简化网络结构,解放原有设计中存储服务器与存储设备之间网络压力问题

  1. 独有的流媒体文件系统保护技术

海康cvr 存储模式采用独特的vspp 视频流预保护技术,彻底解决由于断点断网引起的文件系统不稳定甚至文件系统损坏而导致的监控服务停止、数据只读或丢失等故障问题

海康cvr 存储模式采用自身独有的数据块管理结构和容错机制,脱离对服务器端文件系统的依赖,避免其文件系统损坏对监控业务造成影响,提供更加稳定,高效的管理方式

  1. 高效的磁盘碎片免疫技术

海康cvr 存储模式采用磁盘预分配与延迟分配技术相结合,首先查找空闲空间区域并用于存储新数据的过程,最大程度地提高系统性能和避免磁盘碎片,同时,结合高效的碎片整理程序,在系统空闲时对磁盘碎片进行整理,改善系统的性能

20230512-端口映射应用场景

内网映射技术原理

内网映射项目实战

内网服务器对外发布

内网设备,从外部进行远程管理

内网监控视频,从外部取流

xxx

NVR 网络硬盘录像机

NAT 网络地址转换

nat 转换成公网ip 这个公网 ip 怎么来的

用的是企业宽带,互联网专线,运营商给咱们的固定的公网ip 这种宽带几千到上万一个月

用的是家用宽带,运营商不给固定公网ip 很多用户共用一个公网ip 几十一个月

现在的条件

硬件条件 企业级的路由器,化为ar2220

宽带条件,互联网专线,有5个可用的公网ip

要实现的目标

外网的访客,能访问到内网的服务器

sy 回车 进入配置模式

interface G0/0/1 进入连接宽带的外网接口

ip address 64.1.1.1 255.255.255.0 配上从运营商购买的公网ip

int g0/0/1 进入外网口

nat server global 64.1.1.2 inside 172.16.1.100

把内网服务器 172.16.1.100 映射为一个公网ip 64.1.1.2

外网的访客,可以通过64.1.1.2 这个公网ip 来访问172.16.1.100

实际工作中,几乎不会这么做

环路检测

主要原因,

土豪方法,有100个服务器,买100个公网ip 可以,不现实

用1个公网,来映射100个服务器

端口号

端口映射

数据包有个端口号,用来区分

收到腾讯课堂的数据包

收到网易云音乐数据包

收到杀毒软件更新的数据包

收到xxx 的数据包

netstat -nb

网络连接 tcp udp

深信服

tcp 稳 每个数据包都有确认机制,可能会增加延迟

udp 快 只管发 速度快,延迟低,可能丢包了还不知道

http 或https 都是基于tcp 的应用

端口可以随便选吗,留个悬念

闭坑指南

端口号,理论上,可以随便用

实际上,避开常见病毒的端口,以防误杀,有次映射为6666 不同,这端口号,和某危险应用相同,误拦截

避开运营商禁止的端口

避开运营商禁止的端口 问到

避开其他人用过的端口,专员的it 部门有记录

建议1024 以下不用,知名协议端口号会用

为什么要学网络技术

从事技术工作,但技术含量不高,希望转向网络技术/网络安全岗位

从事网络技术相关工作,提升技能,胜任工作,得到职业晋升

在校大学生,提升就业竞争力

技术学到什么层级

HCIA-Datacom 培养具备数通基础理论技能的网络工程师

IP
培养跨领域解决方案规划设计或单领域规划及部署的网络高级工程师

IE
培养具备跨领域解决方案坚实理论及部署能力的网络专家

大型WLAN 组网方案

技术发展方向

数通类

最易入行,下限第 上限高 职业发展方向宽

网络安全类

售后方向

售前方向

HCIA

HCIP

傻瓜交换机 组件一个同网段的,小型局域网的

企业的二层交换机 性能更好,功能更多,支持调试

核心三层交换机

路由器

防火墙

无线AC+AP

为什么网络有问题

  1. 主机会受到太多的广播包
  2. 万一发生故障,没做隔离,影响范围很大

3000个电脑,在一起,电脑的正常工作发广播包,我就会收到太多的广播包,消耗带宽,cpu 内存处理

用户私接小路由器,影响其他办公室,导致网络故障

eNSP

最后我们如何解决问题

拿出一个三层交换机,把各个楼层的傻瓜,连接到三层交换机

vlan 虚拟局域网,是一个隔离技术

  1. 隔离广播
  2. 隔离故障

vlan 配置

三层交换机

sy 回车,进入配置模式

undo in en 关掉设备的英文提示

vlan 10 创建vlan10

vlan 20 创建 vlan20

int g0/0/1 进入1号口
port link-type access 设置接口类型

port default vlan 10 把接口放到 vlan 10

交换机配vlan 的时候,接口设置类型

如果这个接口,连接的是一台电脑,一台傻瓜交换机,用access
如果这个接口,连接的是一台企业级交换机,用trunk

int g0/0/2 进入2号口

port link-type access 设置接口类型
port default vlan 20 把接口放到vlan 20

1 卡顿,解决了
故障隔离,解决了

问题又来了

为什么不是 vlan 1 和2 呢

vlan 1是默认 vlan

用了vlan 1

网关,是一个网络设备,三层交换机,路由器,防火墙,有实现不同网段之间的数据转发

int vlan 10
ip add 192.168.10.1 255.255.255.0
int vlan 20
ip add 192.168.10.1 255.255.255.0

三层交换机,输入了以下两条命令

总结以下

在实际工作中,vlan 是这么用的

用vlan 把用户隔离开,隔离的是不好的数据包,可能会引起故障的包

再用三层交换机,配好网关接口,把他们连通,连通的是好的包,正常通信

vlanif 网关接口,创建网关的时候,完整命令是 int vlanif 10

如何规划 vlan 的问题

问题,多少个主机放到1个vlan

如果办公电脑,这种普通人用的,一个vlan 不能放太多,

如果监控,门禁,哑终端,故障频率小,一个vlan 放多一些,问题不大

网络工程师职业规划

弱电

桌面运维

大学生

网络的就业方向岗位及薪资

从弱电施工转为网工

除了简单的交换机、路由器调试

还要会防火墙调试,网络组网,故障排除

环路怎么办,高可靠性组网需求怎么办,无线优化等等

避免环路又要用到生成树

高可靠性 mstp vrrp 堆叠 BFD ospf

无线优化,ac+ap 组网,信道优化,黑白名单

SSH 网络安全加固

先掌握基础设备调试

基本网络故障排除能力

能掌握网络规划设计能力更佳

  1. 先满足自己的工作需求

  2. 储备一些知识,掌握基本故障解决能力,提高一些职业竞争力

转行需谨慎,不要轻易尝试

年龄不大,可以尝试转行,同时在平时工作中注意多留意一些网络搭建方面的项目

30岁以下

一定要多学习拓展知识,以免错失机会

年龄小,发展上限高,无论内部调岗或转行都可行性大

除学习基本路由交换方面的核心技术之外,额外拓展例如安全等方面的技术知识


传统以太网的问题

二层广播域

在典型交换网络中,当某台主机发送一个广播帧或未知单帧时,该数据帧会被泛洪,甚至传递到整个广播域

广播域越大,产生的网络安全问题、垃圾流量问题,就越严重

Switch1与Switch2同属一个企业,该企业统一规划了网络中的vlan 其中vlan10 用于A 部门,vlan 20 用于B 部门,A B 部门的员工在switch1 和switch 2 上都有接入

PC1 发出的数据经过Switch1 和Switch2 之间的链路到达了switch2 如果不加处理,后者无法判断该数据所述的vlan,也不知道应该将这个数据输出到本地那个vlan 中

交换机如何识别接收到的数据帧属于哪个vlan

要使交换机能够分辨不同vlan 的报文,需要在报文中添加标识vlan 信息的字段

IEEE 802.1Q 协议规定,在以太网数据帧中,加入4个字节的vlan 标签,又称vlan Tag 简称tag

Vlan 数据帧

原始以太网数据帧 无标记帧

802.1QTag

TPID 标签协议标识符,标识数据帧的类型,值为0x8100 时表示802.1Q帧

PRI 优先级 标识帧的优先级,主要用于QoS
CFI 标准格式指示符,在以太网环境中,该字段的值为0

Vlan ID VLAN 标识符,标识该帧所述的vlan

802.1Q 帧标记帧

目的MAC 地址 源mac地址,tag 类型 data FCS

Switch1和switch2 之间的链路需要承载多个vlan 的数据,需要一种基于vlan 的数据标记手段,以便对不同vlan 的数据帧进行区分

IEEE 802.1Q 标准定义了该标记方法,该标准对传统的以太网数据帧进行修改,在帧头中插入 802.1Q Tag ,而在该Tag 中,便可以写入vlan 信息

整个网络是如何划分vlan的而

Vlan 划分方式

基于接口
基于mac 地址

基于ip 子网划分

基于协议划分

基于策略


基于接口的vlan 划分

原理

根据交换机的接口来划分 vlan

网络管理员预先给交换机的每个接口配置不同的pvid ,将该接口划入pvid 对应的vlan

当一个数据帧进入交换机时,如果没有带vlan 标签,该数据帧就会被打上接口指定的pvid 的tag 然后数据帧将在指定pvid 中传输

缺省 vlan pvid

port vlan id 是接口上的缺省 vlan

取值 1–4094

基于MAC 地址的vlan 划分

SW1 的mac 地址与vlan 表

基于mac 地址的vlan 划分

原理

根据数据帧的源mac 地址来划分vlan

网络管理员预先配置mac 地址和vlan id 映射关系表

当交换机收到的是untagged 帧时,就依据该表给数据帧添加指定vlan 的tag,然后数据帧将在指定vlan 中传输

映射表

记录了mac 地址和vlan id 的关联情况

以太网二层接口类型

access 接口
交换机上常用来连接用户pc 服务器等终端设备的接口,access 接口所连接的这些设备的网卡往往只收发无标记帧,access 接口只能加入一个vlan

Trunk 接口

Trunk 接口允许多个vlan 的数据帧通过,这些数据帧通过802.1Q Tag 实现区分,Trunk 接口常用于交换机之间的互联,也用于连接路由器、防火墙等设备的子接口

Hybrid 接口

Hybrid 接口与Trunk 接口类似,也允许多个vlan 的数据帧通过,这些数据帧通过802.1Q Tag 实现区分,用户可以灵活指定hybrid 接口在发送某个 vlan 的数据帧时是否携带tag

配置接口类型 port link-type hybrid

在接口视图下,配置接口的链路类型为hybrid

配置hybrid 接口加入 指定vlan

1
port hybrid untagged vlan {{ vlan-id1 [to vlan=id2] | all }}

配置hybrid 接口的缺省 vlan

port hybrid pvid vlan vlan-id

在接口视图下,配置hybrid 类型接口的缺省vlan

hybrid 接口的基础配置 1

解决方案

通过vlan 实现故障隔离

通过DHCP snooping 禁止私设服务器的DHCP 报文

通过ACL 访问控制列表,禁止用户区域DHCP 服务器报文

vlan 的接口类型

access 如果这个口只通过一个vlan 用access

trunk 如果这个口需要通过多个vlan 用 trunk

hybrid 应用灵活

业务隔离

可以通过划分不同的vlan 实现不同业务的隔离

链路聚合

链路聚合是把多条物理链路聚合在一起,形成一条逻辑链路

采用链路聚合既可以提供链路冗余性,又可以提高链路的带宽

聚合接口是一个手工配置的逻辑接口,链路聚合组是随着聚合接口的创建而自动生成的

操作key 是在链路聚合时,聚合控制根据成员端口的某些配置自动生成的一个配置组合

链路聚合模式

静态聚合模式

端口不与对端设备交互信息

根据本端设备信息选择参考端口

用户命令创建和删除静态聚合组

动态聚合模式

端口的LACP 协议自动使能,与对端设备交互LACP 报文

根据本端设备与对端设备交互信息选择参考端口

用户命令创建和删除动态聚合组

DHCP 系统组成

DHCP 服务器

能提供DHCP 功能的服务器或具有DHCP 功能的网络设备

DHCP 中继

一般为路由器或三层交换机等网络设备

DHCP 客户端

需要动态获得ip 地址的主机

手工分配

根据需求,网络管理员为某些少数特定的主机 如DNS 服务器,打印机 绑定固定的ip 地址,其地址不会过期

自动分配

为连接到网络的某些主机分配 ip 地址,该地址将长期由该主机使用

动态分配
主机申请ip 地址最常用的方法,DHCP 服务器为客户端指定一个ip 地址,同时为此地址规定了一个租用期限,如果租用时间到期,客户端必须重新申请ip 地址


vlan 技术特殊应用

vlan 数据转发原理

华为系pvid 思科系本征vlan 原理

无线网络,云桌面等环境pvid 应用实例

基本的vlan通信原理

什么是vlan 虚拟局域网,把一个大的局域网,分隔成多个小的局域网

隔离广播包,大网络,人太多了,广播包就太多了,当我收到太多的广播包,我会卡顿

隔离故障,否则,故障影响范围太大,排查麻烦

vlan 如何配置

vlan 的数据转发原理

ensp 华为出的一个网络设备模拟器,用来模拟搭建一个企业级网络

化为G口和E口有什么区别,工作中到底用什么口
f 四万兆
t 万兆
g 千兆
e 百兆

配vlan 的时候,交换机的接口类型,有多种,最常见的是两种

access 如果这个接口只连接一个vlan 用access

trunk

基本的vlan 配置

怎么创建vlan

怎么把中断 电脑 摄像头 门禁 放到对应的vlan

怎么配置 trunk 两台交换机互联,一个接口要通过多个vlan

怎么配置网关

交换机B,给交换机A,发数据包的时候,会给数据包带上vlan 标签

这样,交换机A 的trunk 接口收到数据包,看标签,就知道这个包是什么vlan

反着想问题,交换机A 的trunk 接口收到数据包,如果包没标签,那怎么处理

pvid 可以在trunk 口配一个pvid 的值,比如5

当咱们配了pvid,接下来,交换机A的trunk 接口收到数据包,如果包没标签,认为他属于vlan 5

云桌面,办公电脑不是普通的电脑,是一个类似于电视盒的小玩意

电视盒,专业名词,云终端,云电脑,只负责显示画面,不复杂计算

物理服务器,放到 vlan5

物理服务器全新的时候,还没进入云平台的管辖范围,还不会给自己打标签

作为网络设备的技术支持,要做到,让交换机收到没标签的包,还知道这个包,属于vlan5

网络技术学习路线

单核心网络

产品

二三层交换机
路由器
无线AC+AP
防火墙 无复杂策略

技术 dhcp
vlan
静态路由
nat

可胜任工作

小型弱电项目网络技术支持
小型企业运维

高可靠多分支网络

数通技术典型发展路线

小公司,小的网络

大公司 中大型的网络 hcip hcie

小公司,创业型,收入更高

网络安全发展路线

  1. 系统继承商
  2. 启明星辰
    深信服

云计算路线
普通二本,毕业去h3c公司

跳槽,去了腾讯,负责腾讯云的网络技术支持

20230512-mathematica入门教程

学会mma 基本用法

内置函数首字母大写

1
2
3
4
5
[] 是所需要计算的内容

{} 列表或者范围

shift+enter 执行计算

默认情况下未赋值变量运行后是蓝色,已赋值变量是黑色

等号是 == 而= 是赋值符号

设置工作路径 SetDirectory[NotebookDirectory[]]; SetDirectory[“./DataFiles”];

第一次使用mathematical

mma 尽可能给出准确的结果,例如

In[1]:= 8/3
Out[1]= 8/3

函数N[]计算近似结果
In[5]:= N[8/3]
Out[5]= 2.66667

计算 3a+1 两个数或表达式之间空一格就代表两者相乘

3 a+1
# 等价于3*a+1

多项式展开(a+1)(a-2)

Expand[(a+1)(a-2)]

简单方程求解 $x^2+2x+1=0$

Solve[x^2+2 x+1,x]

自由格式输入,先输入等号提示符,后面内容不需要标准mathematica 语法,用英文表达自己的意思即可,例如,做sin(x)的图像

化sin x 在区间0到10的函数图像

Plot[Sin[x],{x,0,10}]

列表表达式Table

1
2
3
4
5
6
7
8
In[3]:= Table[i, {i, 1, 10}]

Out[3]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

In[4]:= Table[i + j, {i, 1, 5}, {j, 2, 5}]

Out[4]= {{3, 4, 5, 6}, {4, 5, 6, 7}, {5, 6, 7, 8}, {6, 7, 8, 9}, {7,
8, 9, 10}}

Clear 用法,清除全局变量

1
Clear["Global `*"]

好了到此为止,大家已经学会了mathematical 基本操作,不错,mma 就回去吃这么人性化,想做什么就做什么

输入输出

自动补签,当我们输入某个命令前几个字母时就会有智能提示,根据提示可以选择我们需要的函数,这种情况适用于对函数具体写法不太清楚的时候,根据智能提示就可以选择正确的写法,例如plo,下面就会有非常多这几个字母开头的函数供选择

普通格式+-*/

数学2D格式,善用esc 键,比如输入pi esc+pi+esc 当然有时候我们并不需要将完整的字母写出来

百分号+数字,表示引用第几次结果,不加数字就是上一个结果,例如

%% %8

双斜线// 函数后缀,里面simplify[] 和//Simplify 是等价的

mma 格式排版,Alt+数字1到7 可以得到不同的文档结构

wolf-mathematica 正式开始

定义变量

定义x=10 计算2的x次方
In[26]:= x = 10;2^x
Out[27]= 1024

判断两个值是否一致

In[28]:= x == 1023
Out[28]= False

加减乘除幂指数括号运算

In[31]:= (Sqrt[2] + 1)^2 (3 - a)/[Pi]
Out[31]= ((1 + Sqrt[2])^2 (3 - a))/[Pi]

创建列表

1
2
3
4
5
6
In[32]:= Table[i^2, {i, 1, 10}]
Out[32]= {1, 4, 9, 16, 25, 36, 49, 64, 81, 100}
In[33]:= Table[i^2, {i, 1, 10, 2}]
Out[33]= {1, 9, 25, 49, 81}
In[34]:= Table[{i, i^2}, {i, 1, 10, 2}]
Out[34]= {{1, 1}, {3, 9}, {5, 25}, {7, 49}, {9, 81}}

自定义函数

简单函数,注意下划线与冒号,当然还有更高级用法,两个下划线与三个下划线,以及默认参数等

1
2
3
4
5
In[35]:= f[x_, y_] := x^2 y    
f[a, y]
f[1, 2]
Out[36]= a^2 y
Out[37]= 2

交互式操作

首先画一个sin x 函数图像,并改变其振幅与周期

1
Manipulate[Plot[A Sin[a x], {x, -5, 5}, PlotRange -> {{-5, 5}, {-5, 5}}], {a, 2, 5, 0.5}, {A, -2, 2, 0.2}]

改进一下模型,可以自定义函数头 {sin, cos, tan} 以及滑块名称定义,默认值定义

使用帮助很重要

选中需要帮助的函数,按F1 快捷键打开帮助文档

?+ 函数,执行后给出函数帮助信息

2D 3D 绘图

2D 绘图

1
Plot[{Sin[x], Cos[x]}, {x, 0, 2 \[Pi]}]

Plot 函数属性分叉之多,例如常用的如下

AspectRatio 1 GoldenRatio 宽高比

Axes True 是否绘制轴

ClippingStyle None 如何绘制曲线被剪切的区域
ColorFunction Automatic 确定曲线颜色的方法
ColorFunctionScaling True 是否缩放 ColorFunction 的变量
PlotLabel None 整个绘图的标签
PlotLabels None 曲线的标签
EvaluationMonitor None
在每次函数计算时,需要计算的表达式 Exclusions Automatic
x 中排除的点 ExclusionsStyle None
排除点的绘制样式 Filling None
每条曲线下填充 FillingStyle Automatic
填充的样式 LabelingSize Automatic maximum size of callouts and labels MaxRecursion Automatic
递归子划分的最大数量 Mesh None
在每条曲线上绘制多少个网格点 MeshFunctions

20230512-如何在markdown里优雅地画基本函数图像

markdown 里面可以使用HTML标签,而HTML又支持svg,所以我们可以直接用svg来画

在 Markdown 中绘制函数图像

使用 SVG

首先用 Mathematica 绘图并导出 SVG

1
2
Plot[Sin[x], {x, -4, 4}, PlotPoints -> 2]
Export["sin.svg", %]

接下来使用 svgo 做一下压缩:

1
svgo --pretty sin.svg

20230506-markdown绘图技巧

  1. 流程图

先在typora 中输入
```mermaid
然后敲击回车,即可初始化一张空白图

语法解释 graph 关键字就是声明一张流程图,TD 向下,LR 向右边,这里的含义是 top-down 由上至下

1
2
3
4
5
graph TD
A[Hard edge] -->B(Round edge)
B --> C{Decision}
C -->|One| D[Result one]
C -->|Two| E[Result two]
  1. 时序图

语法解释 ->> 代表实线箭头 –>> 则代表虚线

1
2
3
4
5
6
7
8
9
10
11
sequenceDiagram
Alice-->>Bob: Hello Bob, how are you?
alt is sick
Bob->Alice: Not so good :(
else is well
Bob->>Alice: Feeling fresh like a daisy
end
opt Extra response
Bob->>Alice: Thanks for asking
end
Bob->>Alice: Thanks
  1. 状态图

语法解释 [*] 表示开始或者结束,如果在箭头右边则表示结束

1
2
3
4
5
6
7
8
stateDiagram
[*] --> Still
Still --> [*]

Still --> Moving
Moving --> Still
Moving --> Crash
Crash --> [*]
  1. 类图

语法解释, <|-- 表示继承 + 表示 public - 表示private

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
classDiagram
Animal <|--Duck
Animal <|-- Fish
Animal <|-- Zebra
Animal : +int age
Animal : +String gender
Animal: +isMammal()
Animal: +mate()
class Duck{
+String beakColor
+swim()
+quack()
}
class Fish{
-int sizeInFeet
-canEat()
}
class Zebra{
+bool is_wild
+run()
}
  1. 甘特图

甘特图 一般用来表示项目的计划排期,目前在工作中经常会用到

语法也非常简单,从上到下依次是 图片标题、日期格式、项目、项目细分的任务

1
2
3
4
5
6
7
8
9
gantt
title 工作计划
dateFormat YYYY-MM-DD
section Section
A task :a1, 2020-01-01, 30d
Another task :after a1 , 20d
section Another
Task in sec :2020-01-12 , 12d
another task : 24d
  1. 饼图

饼图使用pie 表示,标题下面分别是区域名称及其百分比

  • Copyrights © 2015-2024 TeX_baitu
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~