2026-03-27

Blender-Gears

1. Gear
2. 齿轮分类
	2.1 根据齿轮轴相对位置 Relative axis position 
	2.2 以传动比分类 
	2.3 非刚性齿轮  Non-rigid 
3. Gear建模
	3.1 手动建模
	3.2 插件建模
	3.3 精确建模
4. 齿轮动画
	4.1 约束-复制旋转
	4.2 驱动器
	4.3 制作简单的动画

1. Gear

齿轮(英语:gear或cogwheel)是轮缘上有齿能连续啮合传递运动和动力的机械零件,齿轮依靠齿的啮合传递扭矩。
齿轮通过与其它齿状机械零件(如另一齿轮、齿条、蜗杆)传动,传动方式是啮合传动,可实现改变转速与扭矩、改变运动方向和改变运动形式等功能。
由于传动效率高、传动比准确、功率范围大等优点,齿轮机构在工业产品中广泛应用,其设计与制造水准会直接影响到工业产品的品质。

2. 齿轮分类

2.1 根据齿轮轴相对位置 Relative axis position

相对位置 Gear 种类 说明 效率(%)
平行轴
Parallel
正齿轮
Spur gears
圆柱齿轮,易于加工,使用最广泛。中速性能优异,
高速(节线速度超过25米/秒)时噪音较大。
98.0~99.5
齿条 racks 节圆直径无限大的正齿轮
内齿轮 internal gears 轮齿在圆环内侧的齿轮
斜齿轮
helical gears
齿线为螺旋线的圆柱齿轮,比正齿轮强度高且运转平稳,
传动时产生轴向推力。
斜齿条 helical racks 与斜齿齿轮相啮合的条状齿轮。
人字齿轮
herringbone gears
齿线为左旋及右旋的两个斜齿齿轮组合而成的齿轮。
不产生轴向推力。
相交轴
Crossed
直齿锥齿轮
straight bevel gears
齿线与节锥线的母线一致的锥齿轮,比较容易制造,应用广泛。
(5米/秒) 或小齿轮1000转/分钟以内的低速应用。
98.0~99.0
弧齿锥齿轮
spiral bevel gears
齿线为曲线,带有螺旋角。虽然制作难度稍大,
但由于强度高,噪音低,也使用广泛。
零度齿锥齿轮
zero-degree bevel gears
螺旋角接近零度的曲线齿锥齿轮。
交错轴
Skew
交错轴斜齿轮
crossed-axis helical gears
只适用于轻负荷情况 70.0~95.0
圆柱蜗杆蜗轮
face gears (crown gear)
运转平静,传动比大,具备自锁功能,以防负荷过大时产生反转。 30.0~90.0
鼓形蜗杆副
drum-shaped worm pairs
比圆柱蜗杆副制造困难,但能传动大负荷。 -
准双曲面齿轮
hypoid gears
经偏心加工的弧齿圆锥齿轮,啮合原理复杂。 -
相交/交错 面齿轮 (冠状)
face gears (crown gear)
可与正齿轮或斜齿齿轮啮合的圆盘状齿轮。在直交及交错轴间传动。 -

2.2 以传动比分类

有前面的定传动比的圆形齿轮机构(圆柱、圆锥)和下面的变传动比的非圆齿轮机构(椭圆齿轮) 

非圆齿轮 Non-circular 

非圆齿轮是为特殊用途而设计的。常见的应用包括纺织机械、电位计和无级变速器。 普通齿轮旨在以最小的噪音、磨损和最高的效率将扭矩传递给另一个啮合部件,而非圆齿轮的主要目标可能是改变传动比、抑制轴位移振荡等等。

2.3 非刚性齿轮 Non-rigid

大多数齿轮理想情况下都是刚体,它们通过杠杆原理和齿间的接触力传递扭矩和运动。
也就是说,施加在一个齿轮上的扭矩会使其像刚体一样旋转,从而使其齿推向与之匹配的齿轮,后者也像刚体一样旋转,并将扭矩传递给其轴。然而,一些特殊的齿轮并不遵循这种规律。

谐波齿轮 Harmonic

谐波齿轮或应变波齿轮是一种特殊的齿轮机构,由于其相对于传统齿轮系统的优势(包括无齿隙、结构紧凑和齿轮比高), 常用于工业运动控制、机器人和航空航天领域。

磁力齿轮 Magnetic 

在磁力齿轮副中,两个部件之间没有直接接触;扭矩是通过磁场传递的。
每个齿轮的齿片都是恒磁体 ,其啮合面上的磁极交替排列。
齿轮部件的安装具有与其他机械齿轮类似的间隙能力。
虽然由于磁场强度的限制,它们无法像传统齿轮那样产生巨大的力,但这种齿轮无需接触即可工作,因此不会磨损,噪音极低,摩擦造成的功率损耗也极小,即使打滑也不会损坏,因此非常可靠。
它们可以用于传统齿轮必须物理接触而无法实现的配置中,并且可以在完全隔离驱动力和负载的非金属屏障下运行。
磁耦合可以将力传递到密封外壳中,而无需使用可能泄漏的径向轴封。
磁力齿轮也与电磁铁一起用于无刷电机中,以驱动电机旋转。

3. Gear建模

3.1 手动建模

比如建立一个12齿的齿轮。Blender默认设置下。
  1. 新建 Mesh 网格\柱体 参数如下: 
    • 顶点: 48
    • 半径: 0.9
    • 厚度: 0.4
  2. 编辑 Mesh 
    • 选择 柱体48个侧面中的24个,每隔2个面选择2个面
    • [E] 挤出 [Shift +Z] 限定在 X,Y 轴范围内,挤出大约(1.11)倍. 
    • [E] 再次挤出 [Shift +Z] 限定在 X,Y 轴范围内,(默认的世界中心轴),挤出大约(1.1)倍. 
    • 变换轴心点 位 (各自原点)
    • [S] 缩放  [Shift +Z] 限定在 X,Y 轴范围内,缩放大约(0.75)倍。
    • 最后 柱体中间掏个洞,一个简单的齿轮就完成了。
进阶: [Alt + Z] 透视模式,[Num:1] 正交前视图,框选所有下表面,[R] [Z] 10 ,沿Z轴选择10度。完成,一个斜齿轮就建好了。

3.2 插件建模

Blender 偏好设置 \ 插件 找到 (Extra Mesh Objects) 这个插件,若这里没有,就去 获取插件里找。
找到并启用插件: Extra Mesh Objects 
[Shift + A] 新建 网格 \ Gears \ Gear
初始默认的设置生成齿轮和上面手动建立的几乎是一摸一样。
这里只需要点一下就完成建模,左下角还有很多参数可调。
参数-en 默认值 参数-cn 备注
Teeth 12 齿数
Radius 1m 半径
Width 0.2m 齿轮厚度
Base 0.2m 齿轮基部
Dedendum 0.1m 齿根高 齿形
参数
Addendum 0.1m 齿顶高
Pressure Angle 20° 齿顶压力角
Skewness 偏斜度 斜齿轮参数
Conical Angle 锥角 锥齿轮参数
Crown 0m 齿冠

3.3 精确建模

上面的建模适合作图,做动画,做模型。要精确建模可以借助网站:
这里有很多已生成的复杂的齿轮组模型,可以下载后直接导入进行3D打印。
还有很多建模的教程。包含各种复杂的齿轮计算器,根据参数生成齿轮建模脚本。
从Blender2.7x版本就可以参考这里的教程精确建模了。
详细信息打开以上官网查看... 

4. 齿轮动画

4.1 约束-复制旋转

这是最简单的动画,适合2个相邻相同规格的齿轮或同步的车轮等运动。
以上面建立的2个12齿的齿轮为例,一个驱动轮,一个从动轮。
  • 选择 从动轮 沿X轴移动2单位,再旋转15度,正好和 驱动轮咬合。[Ctrl A]应用旋转。
  • 接着 在右下方 属性区,打开约束页签,添加复制旋转
  • 目标:旋转 驱动轮。转向和反转,都选Z。完成。
  • 驱动轮沿Z轴旋转,从动轮就会同步咬合转动起来。

4.2 驱动器

驱动器可以根据不同齿数比适应旋转速度。
  • 再新建一个18齿的齿轮,齿数是12的1.5倍,半径也同样调整位1.5个单位。
    • 作为第二个从动轮,移动到 驱动轮的另外一侧,再旋转10度达到齿轮咬合状态。
  • 在 从动轮 的 旋转 Z 轴上,右键菜单\ 添加驱动器
    • 表达式: ( -var * 12/18 )。这里的数字12和18就是2个齿轮的齿数,负号表示方向相反。
    • 物体 选择 (驱动轮)。类型 选择 (Z 旋转)。完成。

4.3 制作简单的动画

  • 选中 驱动轮 ,下方的时间线定位第一帧。
  • 右边属性区,物体 \ 变换 \ 旋转 \ Z 轴,鼠标放在这里,[I] 或右键菜单 插入关键帧。Z输入框变为黄色,表示当前位关键帧。
  • 时间线向右拖动,上面的 Z轴 输入框变为绿色,表示非关键帧。
  • 比如定位到50帧,Z轴 输入数字300,表示50帧,齿轮滚动了300度。
  • 再定位到200帧,Z轴 输入数字2000,表示接着150帧,齿轮滚动了1700度。
  • 保存后渲染,[Ctrl + F12] 渲染好后,是一堆图片。
注: 如果没有在 偏好设置 \ 文件路径 \ 数据 \ 渲染 \ 渲染输出 设置路径,则渲染动画会保存到 C:\tmp
如下命令使用ffmpeg,将图片转换为视频。前提是有下载开源的ffmpeg工具。
 ffmpeg -framerate 30 -i %04d.png -c:v libx264 ot1.mp4


2026-03-19

Blender5-WindowUI

1. Blender主窗口
	1.1 Topbar
	1.2 Areas
	1.3 Status Bar
2. Workspaces
	2.1 Default Workspaces
	2.2 Blender 还默认添加了其他几个工作区
	2.3 附加工作区
3. Editors 编辑器
	3.1 通用 (General)
	3.2 动画 (Animation)
	3.3 脚本 (Scripting)
	3.4 数据 (Data)
4. Regions 区块
	4.1 3D视图编辑器的区块分布
	4.2 属性编辑器的区块分布
5. 多显示器
6. 偏好设置和启动文件

1. Blender主窗口

Blender 默认的主界面分为以下三个部分:
  • Topbar:位于最上方的[顶栏],包括主要菜单,用于保存、导入和导出文件、配置设置,以及渲染等其他功能。
  • Areas:位于中部的[区域],是主要工作区。
  • Status Bar:位于底部的[状态栏],显示按键建议和相关统计信息。

1.1 Topbar

位于最上方的[顶栏],包括主要菜单,用于保存、导入和导出文件、配置设置,以及渲染等其他功能。
从左到右依次是: 
  • [主菜单…] 分割线[|] 
  • [workspaces…]标题 [+]加号可添加更多工作区 (用于切换工作空间)
  • [Scene]场景选择,[ViewLayer]试图层选择。

1.2 Areas

Blender 窗口被划分为若干矩形,称为区域。
区域为编辑器保留屏幕空间,例如 3D 视图或大纲。每个编辑器都提供了一个特定的功能。

区域被分组为工作区,它们面向特定的任务(建模、动画等等)。
每个区域都可以自定义某个编辑器,且任意拆分以增加更多区域,或关闭不需要的区域。
  • 区域最大化
    • 菜单: 视图 ‣ 区域 ‣ 切换区域最大化
    • 快捷键: Ctrl-空格键
  • 专注模式
    • 菜单: 视图 ‣ 区域 ‣ 专注模式
    • 快捷键: Ctrl-Alt-空格键

1.3 Status Bar

状态栏位于 Blender 窗口的底部,显示上下文信息,如键盘快捷键、消息和统计信息。 状态栏可以通过禁用窗口菜单中的 显示状态栏 或从顶部边缘向下拖动来隐藏。 
  • 左侧
    • Keymap Information 状态栏的左侧显示鼠标按键的快捷方式和活动工具的快捷键。 在有工具栏的编辑器中,点击 Alt(或 macOS 上的 Option)会显示热键以切换到所需工具。 
  • 中间
    • Status Messages 状态信息:状态栏的中间显示有关正在进行的操作的信息。
      • Running Task 运行的任务
      • 显示当前运行任务(比如渲染或烘焙)的进度。 将鼠标指针悬停在进度条上会显示估计时间。单击取消按钮()可中止任务。
    • Report Message 报告信息
      • 信息性消息或警告,例如在保存文件之后。 它们会在短时间内消失。点击它们可以在信息编辑器中显示完整的信息。
  • 右侧
    • Resource Information 资源信息:状态栏的右侧显示 Blender 实例的相关信息。 可以通过在状态栏上点击 鼠标右键 或在偏好设置中选择显示哪些信息。
    • Scene Statistics 场景统计, 显示活动场景内数据的信息。
      • Collection 集合:活动集合的名称。
      • Active Object 活动物体:活动的选中物体的名称。
      • Geometry 几何:根据模式和物体类型的不同显示当前场景的信息。这可以是顶点、面、三角形或骨骼的数量。
      • Objects 物体:所选物体的数量和物体的总数。

2. Workspaces

2.1 Default Workspaces

Blender 的默认启动在主区域显示了 “布局 (Layout)” 工作区。 这个工作区是一个通用工作区,用于预览你的场景,包含以下编辑器: 
  • 左上角的 3D 视图。[3D Viewport]
  • 右上角的大纲。[Outliner]
  • 右下角的属性。[Properties]
  • 左下角的时间线。[Timeline]

2.2 Blender 还默认添加了其他几个工作区

  • Modeling 建模:使用建模工具修改几何体。
  • Sculpting 雕刻:使用雕刻工具修改网格。
  • UV Editing UV 编辑:将图像纹理坐标映射至三维表面。
  • Texture Paint 纹理绘制:用于在3D视图中为图像纹理上色。
  • Shading 着色:用于为渲染指定材质属性。
  • Animation 动画:使物体属性随时间发生变化。
  • Rendering 渲染:用于查看以及分析渲染结果。
  • Compositing 合成:图像和渲染信息的合并以及后期处理。
  • Geometry Nodes 几何节点:使用几何节点程序化建模。
  • Scripting 脚本:用于与 Blender 的 Python API 交互和编写脚本。

2.3 附加工作区

添加新工作区时,Blender 还提供了其他几组可供选择的工作区:
  • 二维动画
    • 二维动画: 蜡笔绘画的通用工作区。
    • 全屏二维画布: 类似 “二维动画” 但有个更大的画布。
  • VFX
    • 遮罩: 为合成或视频编辑创建二维遮罩。
    • 运动追踪: 用于计算摄像机运动和稳定视频片段。
  • 视频编辑
    • 视频编辑: 将媒体排序整合到一个视频中。

3. Editors 编辑器

Blender 提供了许多不同的编辑器,用于显示和修改数据的不同方面。 编辑器包含在区域中,该编辑器确定其在 Blender 窗口中的大小和位置。 每个区域都可能包含任何类型的编辑器。 
编辑器类型 选择器,即标题左侧的第一个按钮,允许你改变该区域的编辑器。 也可以同时在不同的区域打开同一个编辑器类型。 

3.1 通用 (General)

  • 3D 视图 (3D Viewport)
  • 图像编辑器 (Image Editor)
  • UV 编辑器 (UV Editor)
  • 合成器 (Compositor)
  • 纹理节点 (Texture Nodes)
  • 几何节点编辑器 (Geometry Node Editor)
  • 着色器编辑器 (Shader Editor)
  • 视频序列编辑器 (Video Sequencer)
  • 影片剪辑编辑器 (Movie Clip Editor)

3.2 动画 (Animation)

  • 动画摄影表 (Dope Sheet)
  • 时间线 (Timeline)
  • 曲线编辑器 (Graph Editor)
  • 驱动器编辑器 (Drivers Editor)
  • 非线性动画 (Nonlinear Animation)

3.3 脚本 (Scripting)

  • 文本编辑器 (Text Editor)
  • Python 控制台 (Python Console)
  • 信息编辑器 (Info Editor)

3.4 数据 (Data)

  • 大纲视图 (Outliner)
  • 属性编辑器 (Properties Editor)
  • 文件浏览器 (File Browser)
  • 资产浏览器 (Asset Browser)
  • 电子表格 (Spreadsheet)
  • 偏好设置 (Preferences)

4. Regions 区块

Blender 中的每个编辑器都分成几个区块(Region)。 区块可以具有较小的结构元素,如选项卡和面板,其中包含按钮、控件和小部件。 

4.1 3D视图编辑器的区块分布

在添加一个立方体后,3D视图编辑器显示的侧栏和调整上一步操作面板的区块。
  • 顶部的 标题栏(绿色),
  • 中间的 主区块(黄色),
  • 左侧的 工具栏(蓝色),快捷键[T],
  • 右侧的 侧栏(红色),快捷键[N],
  • 调整上一步操作面板(粉色)。

4.2 属性编辑器的区块分布

属性编辑器有左侧的 选项卡 (Tabs) 和右侧的多个 面板 (Panels) 组成。

5. 多显示器

Blender支持多显示器,以基础建模为例,双显示器环境下。
默认主显示器,使用默认主界面,用于建模。
窗口菜单下,新建窗口,用于随时从多个角度观察模型。

多显示器
主窗口左上角菜单列: 窗口 \ 新建窗口
新建的窗口 可以拖动到其他显示器,组成多显示器模式。

三视图
快捷键: Ctrl + Alt + Q
右上角的透视模式可以改为摄像机镜头。渲染视图

渲染视图
快捷键: 小键盘的数字 [0]
3D视图右边 [N] 辅助栏 \ 视图 \ 视图锁定 \ 摄像机到视图方向 □
勾选后,方便调整摄像头位置及方向,设置好后别忘了取消勾选。

6. 偏好设置和启动文件

快捷键: (Ctrl + ,)
  • 菜单栏\编辑\偏好设置
    • 界面\状态栏\场景统计数据 (勾选)
    • 界面\语言\简体中文
    • 界面\语言\新建数据 (建议取消勾选) 新建的物体则已英文命名,避免潜在的兼容问题... 
    • 试图导航\缩放\缩放至鼠标位置 (根据喜好勾选)
  • 其他设置: 
    • 菜单栏\文件\外部数据\自动打包资源 (勾选) 保存时自动包含相关贴图等素材
最后别忘了:菜单栏\文件\默认\保存启动文件

2026-03-04

Video-file-size

1. 视频文件大小计算公式
2. 视频文件关键参数
	2.1 Resolution 分辨率
	2.2 Frame rate 帧率
	2.3 Bitrate 比特率
3. 视频压缩
	3.1 分辨率与最低比特率参考对照表
	3.2 ffmpeg压缩命令
	3.3 FfmpegFreeUI

1. 视频文件大小计算公式

比特率(Mb/s) x 视频时长(s) ÷ 8 = 视频文件大小(MB) 
视频文件大小基本可以按该公式计算。计算结果和实际文件大小相差无几。

2. 视频文件关键参数

2.1 Resolution 分辨率

解析度(英语:resolution)又称分辨率(resolving power),泛指量测或显示系统对细节的分辨能力。
此概念可以用时间、空间等领域的量测。
影像分辨率(image resolution)则专指影像、图像记录物体细部能力的一种度量,此时又称解像度、解像力。

2.2 Frame rate 帧率

帧率(英语:frame rate)是用于测量显示帧数的度量。
测量单位为“每秒显示帧数”(frame per second,FPS)或“赫兹”,FPS通常用于描述影片、电子绘图或游戏每秒播放多少帧。 
较高的帧率在一秒钟内捕捉更多帧,特别是在有快速移动物体的环境中,影片的视觉呈现更细致流畅。 
常见的帧率有: 
  • 24fps:(胶片)电影标准
  • 25fps:PAL标准(欧洲, 亚洲, 澳洲等地的电视广播格式), SECAM(法国, 俄国, 部分非洲等地的电视广播格式)
  • 29.97fps: NTSC标准(美国, 加拿大, 日本等地的电视广播格式)
  • 60P:适合减慢做慢动作
  • 120P:做更慢的慢动作

2.3 Bitrate 比特率

比特率(英语:Bit rate或Bit-rate/Bitrate,变量简写为R)在电信和计算领域是指单位时间内传输送或处理的比特数量。
比特率经常在电信领域用作连接速度、传输速度、信息传输速率和数字带宽容量的同义词。
在数字多媒体领域,比特率是单位时间播放连续的媒体如压缩后的音频或视频的比特数量。
比特率规定使用“比特每秒”(bit/s或bps)为单位。
码流=文件大小(字节*8位)/视频持续时间(秒)例如:2400MBx8 / 480 秒 = 40Mbps

较高的比特传输率将可容纳更高的视频质量,即更大的视频文件。一些典型比特率: 
  • VCD: 1Mbps
  • DVD: 5Mbps
  • HDTV: 20Mbps
  • Blu-ray: 40Mbps
  • Ultra HD Blu-ray: 100Mbps

3. 视频压缩

视频文件当前使用最多的是H264,兼容性也最好。更新的是H265(hevc)
根据分辨率,设置适当的比特率,能有效压缩文件大小,且保留品质。

3.1 分辨率与最低比特率参考对照表

名称 分辨率 备注 比特率
(Mbps)
时长
(s)
bit → Byte
(/8)
M → G
(/1024)
Size
(GB)
水平 垂直 X Y
8k 7680 4320 UHDTV2 40 6000 8 1024 29.3
4k 2160p 3840 2160 UHD 10 6000 8 1024 7.3
2k 1440p 2560 1440 QHD 5 6000 8 1024 3.7
1080p 1920 1080 Full HD 3 6000 8 1024 2.2
1600 900 2 6000 8 1024 1.5
720p 1280 720 HD 1.5 6000 8 1024 1.1
⇧列出 (16:9) 的显示器分辨率 比特率(Mb/s) * 时长(s) /8 /1024 = Size(GB)

公式: 比特率(Mb/s) * 时长(s) /8 /1024 = Size(GB)
计算时长100分钟的视频文件在指定比特率下的参考大小。
  • 这里分辨率: (720p, 1080p) 的比特率分别为(1.5~3Mbps), 这个数值算是经验参数,查看了很多下载的视频,文件紧凑,品质尚可的都是这个数值。
  • 至于分辨率: (2k以上的),根据上面参数的近似比例放大,不一定对,仅供参考。

3.2 ffmpeg压缩命令

调整分辨率
ffmpeg -i m4k.mkv -vf scale=1920:-2 -map 0 c3.mkv
-map 0 保留所有音轨和字幕轨。若不加(-map 0),则只保留第一个音轨和第一个字幕轨。
注意,虽然能保留所有字幕轨,但原本字幕格式可能会被重新编码,若出现字幕显示异常。可用如下复制参数: 
  • 复制参数: -map 0:a -c:a copy -map 0:s -c:s copy
  • 调整帧率: -r 30
  • 调整码率: -b:v 2M

调整为更高效的编码格式. Intel CPU 使用libx265:
-c:v libx265 -crf 26
-crf 23 表示视频质量,值越小,视频质量越高,文件越大。(范围:0~51,推荐23)
ffmpeg -i "<输入>" -c:v libx265 -preset medium -crf 25 -map 0:a -c:a copy -map 0:s -c:s copy "<输出>"

指定比特率: 
ffmpeg -i "<输入>" -c:v libx265 -b:v 2M -map 0:a -c:a copy -map 0:s -c:s copy "<输出>"

  • NVIDIA显卡 使用 hevc_nvenc 代替上面的libx265
  • M1芯片 使用 hevc_videotoolbox 代替上面的libx265
对于M1 Mac用户,hevc_videotoolbox 是视频转码和压缩的最佳替代品,性能远超单纯依靠CPU的 libx265。

苹果M1芯片使用如下命令压缩 (H264格式4k视频, 比特率50Mbps)
比特率50M改为8M,改用H265压缩,文件缩小到16%
ffmpeg -i m4k.mp4 -map 0:v -c:v hevc_videotoolbox -b:v 8M -map 0:a -c:a copy  m265-8M.mp4 
同样的文件,修改分辨率,设定比特率2M,文件缩小到4%。
ffmpeg -i m4k.mp4 -vf scale=1920:-2 -b:v 2M -map 0 m1920-2m.mp4 
若包含多音轨,多字幕,使用如下map的copy,保留全部。
ffmpeg -i m4k.mkv -map 0:v -c:v hevc_videotoolbox -b:v 2M -map 0:a -c:a copy -map 0:s -c:s copy m265-2M.mkv
macOS-m1芯片使用hevc_videotoolbox:h265压缩,比特率的2M或3M,需要M大写。 

3.3 FfmpegFreeUI

不想使用ffmpeg命令,可以使用这个开源工具。ffmpeg的图形界面。
在参数面板设置好参数,在参数总览下可以看到生成的实际命令行。

2025-12-17

Windows-Execution-Policies

1. about_Execution_Policies
	1.1 POWERSHELL 执行策略
	1.2 执行策略作用域
2. 使用 PowerShell 管理执行策略
	2.1 查看当前的有效执行策略
	2.2 更改执行策略
	2.3 删除执行策略
	2.4 为某个会话设置一个不同的执行策略
	2.5 使用组策略管理执行策略
3. 未签名的脚本
	3.1 未签名的脚本包含:
	3.2 本地脚本与网络下载脚本的区别
	3.3 一秒解锁网络下载脚本
	3.4 临时绕过策略执行特定脚本
	3.5 直接运行网络未签名脚本
	3.6 小结
4. 执行策略可能会失败的原因

1. about_Execution_Policies

PowerShell 执行策略是一项安全功能,用于控制 PowerShell 加载配置文件和运行脚本的条件。  此功能有助于防止恶意脚本的执行。 

本地计算机和当前用户的执行策略存储在注册表中。
无需在 Windows PowerShell 配置文件中设置执行策略。
某个特定会话的执行策略仅存储在内存中,当关闭会话时,该执行策略会丢失。

执行策略不是限制用户操作的安全系统。
例如,当用户无法运行脚本时,可以通过在命令行键入脚本内容轻松绕过策略。
相反,执行策略帮助用户设置基本规则并阻止他们无意中违反规则。

1.1 POWERSHELL 执行策略

ExecutionPolicy
执行策略
已签名 未签名 行为描述 概述 组策略
选项
本地 远程(网络)
Restricted No No No 默认策略,禁止所有. 包括: (.ps1xml)格式, (.psm1)模块, (.ps1)PS配置 受限 n
AllSigned Yes No No 要求所有脚本和配置文件都由受信任的发布者签名,包括在本地计算机上编写的脚本。 仅签名 Y
RemoteSigned Yes Yes No 本地脚本可运行,下载的脚本需签名 (Windows Server 2012 R2 默认执行策略) 普通 Y
UnRestricted Yes Yes Yes (提示) 允许运行所有脚本,但下载的未签名脚本会提示确认 (非 Windows 的默认执行策略) 非受限 Y
Bypass Yes Yes Yes 无任何限制,无警告或提示!(高风险) 无限制 n
Undefined - - - 当前作用域中未设置执行策略。 未定义 n
Undefined 表示当前作用域中未设置执行策略。
若所有作用域都没有设置,则默认为: Restricted, 禁止所有脚本。

1.2 执行策略作用域

优先级 Scope 作用域 执行策略影响范围 存储在:
最高 MachinePolicy 当前计算机上的所有用户 通过组策略为计算机的所有用户设置
^ UserPolicy 当前计算机上的当前用户 通过组策略为计算机的当前用户设置
^ PROCESS 当前的 PowerShell 会话 环境变量 $env:PSExecutionPolicyPreference.
关闭 PowerShell 会话时,将删除变量和值。
^ CURRENTUSER 当前计算机上的当前用户 存储在 HKCU 注册表子项
最低 LOCALMACHINE 当前计算机上的所有用户 HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
作用域优先级:如上表从上往下依次降低。也是命令 (Get-ExecutionPolicy -list) 列出的顺序。
  • 若所有作用域都没有设置执行策略,即同为 [Undefined], 则默认为: Restricted, 禁止所有脚本。
  • 若多个作用域设置了执行策略,则优先级高的生效,优先级低的会被忽略。

2. 使用 PowerShell 管理执行策略

2.1 查看当前的有效执行策略

获取当前 PowerShell 会话的有效执行策略
 Get-ExecutionPolicy
Restricted

若要获取影响当前会话的所有执行策略,并按优先顺序显示它们,请键入: 
 Get-ExecutionPolicy -List
        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined

以下命令获取 CurrentUser 作用域的执行策略。 
 Get-ExecutionPolicy -Scope CurrentUser
Undefined

2.2 更改执行策略

若要更改你计算机上的 Windows PowerShell 执行策略,请使用 Set-ExecutionPolicy cmdlet。
更改会立即生效,你无需重新启动 Windows PowerShell。
  • 如果为 Scopes LocalMachine 或 CurrentUser 设置执行策略,更改将保存在配置文件中,并在再次更改之前保持有效。
  • 如果为 Process 范围设置执行策略,则不会将其保存在配置文件中。 执行策略将一直保留,直到当前进程和任何子进程关闭。

若要更改你的执行策略,请键入:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
不指定作用域,则默认为本机

若要设置某个特定作用域中的执行策略,请键入 
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

更改执行策略的命令会成功,但不一定会成为有效的执行策略。
例如,用于设置本地计算机的执行策略的命令可能成功,但会被当前用户的执行策略覆盖。优先级更高的生效。

2.3 删除执行策略

若要删除某个特定作用域的执行策略,则将执行策略的值设置为 Undefined。
例如,若要删除本地计算机的所有用户的执行策略,请键入:
Set-ExecutionPolicy Undefined
或者键入: 
Set-ExecutionPolicy Undefined -scope LocalMachine
如果未在任何作用域中设置执行策略,则有效的执行策略是 Restricted,它是默认执行策略。 

2.4 为某个会话设置一个不同的执行策略

可以使用 PowerShell.exe 的 ExecutionPolicy 参数为新的 Windows PowerShell 会话设置执行策略。 策略仅影响当前会话和子会话。
例如:
PowerShell.exe -ExecutionPolicy AllSigned
设置的执行策略不是存储在注册表中,而是存储在 $env:PSExecutionPolicyPreference 环境变量中。 当关闭在其中设置了策略的会话时,会删除变量。不能通过编辑变量值来更改策略。 
在会话期间,为会话设置的执行策略优先于在注册表中为本地计算机或当前用户设置的执行策略。 但是,它并不优先于通过使用组策略设置的执行策略。优先级见前面的表格。

2.5 使用组策略管理执行策略

可以使用“启用脚本执行”组策略设置来管理计算机的执行策略。 组策略设置覆盖所有作用域中设置的执行策略。
“启用脚本执行”策略设置如下所示:
  • -- 如果禁用“启用脚本执行”,则脚本不会运行。这等效于“Restricted”执行策略。
  • -- 如果启用“启用脚本执行”,则可以选择一个执行策略。组策略设置等效于以下执行策略设置。
    • Group Policy                Execution Policy  
    • 允许所有脚本          Unrestricted
    • 允许本地脚本和远程签名脚本         RemoteSigned
    • 只允许签名脚本           AllSigned
  • '-- 如果未配置“启用脚本执行”,则它将不起作用。 在 Windows PowerShell 中设置的执行策略是有效的。

PowerShellExecutionPolicy.adm 和 PowerShellExecutionPolicy.admx 文件将“启用脚本执行”策略添加到组策略编辑器中的计算机配置节点和用户配置节点中。路径如下: 
  •     Administrative Templates\Windows Components\Windows PowerShell
  • [计算机配置] 或 [用户配置]  → 管理模板 → Windows 组件 → Windows PowerShell → 启用脚本执行
设置后,让策略立即生效命令: 
 gpupdate /force
[计算机配置] 节点中设置的策略 优先于 [用户配置] 节点中设置的策略。 

Microsoft 下载中心提供 PowerShellExecutionPolicy.adm 文件。有关详细信息,请访问 PowerShell 的管理模版 
about_Group_Policy_Settings 

3. 未签名的脚本

3.1 未签名的脚本包含:

  • 网络地址未签名脚本,比如: http://127.0.0.1:9000/Microsoft.PowerShell_profile.ps1
  • 本地未签名脚本,本机生成的脚本,比如: Microsoft.PowerShell_profile.ps1
  • 网络下载的未签名脚本。~\download\Microsoft.PowerShell_profile.ps1

3.2 本地脚本与网络下载脚本的区别

在 Windows 中,Internet Explorer 和 Microsoft Edge 等程序会向下载的文件添加备用数据流。 这会将文件标记为“来自 Internet”。 
如果 PowerShell 执行策略是 RemoteSigned,PowerShell 将不会运行从 Internet 下载的未签名脚本,其中包括电子邮件和即时消息程序。
可以对脚本进行签名,或选择在不更改执行策略的情况下运行未签名的脚本。

从 PowerShell 3.0 开始,可以使用 cmdlet 的 Get-Item 的 Stream 参数来检测因从 Internet 下载而被阻止的文件。  使用 Unblock-File cmdlet 解除阻止脚本,以便可以在 PowerShell 中运行这些脚本。 

下载文件的其他方法可能不会将文件标记为来自 Internet 区域。 一些示例包括: 
curl.exe; Invoke-RestMethod; Invoke-WebRequest.

查看当前目录下来自网络的未签名文件
  • 在脚本文件上,右键 → [属性] 下方有 [解除锁定]的待选框,该文件即为网络下载的带有Internet标记的网络脚本。
  • 使用命令行查看 带有Internet标记的网络脚本
    • [0.02 sec] > Get-Item * -Stream "Zone.Identifier" -ErrorAction SilentlyContinue
    • PSPath        : Microsoft.PowerShell.Core\FileSystem::D:\Tom\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1:Zone.Identifier
    • PSParentPath  : Microsoft.PowerShell.Core\FileSystem::D:\Tom\Documents\WindowsPowerShell
    • PSChildName   : Microsoft.PowerShell_profile.ps1:Zone.Identifier
    • PSDrive       : D
    • PSProvider    : Microsoft.PowerShell.Core\FileSystem
    • PSIsContainer : False
    • FileName      : D:\Tom\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
    • Stream        : Zone.Identifier
    • Length        : 125

3.3 一秒解锁网络下载脚本

如果 PowerShell 执行策略是 RemoteSigned,则会阻挡网络下载的脚本。但只需解锁,将网络下载脚本变成本地脚本即可。
有很多方法实现这个过程:
  • [下载的脚本文件] 上右键 → 点击 [属性] → 勾选下方的 [解除锁定]
  • 使用文本编辑器 打开 [下载的脚本文件] → [另存为],新保存的文件就是本地脚本了… 
  • 使用命令解锁,下面是解锁的不同写法: 
    •  dir D:\Downloads\*PowerShell* | Unblock-File
    •  Unblock-File -Path D:\Downloads\PowerShell.ps1
    •  Get-Item D:\Downloads\PowerShell.ps1 | Unblock-File
获取Unblock-File命令帮助
  • get-help Unblock-File
  • get-help Unblock-File -examples
  • get-help Unblock-File -detailed

3.4 临时绕过策略执行特定脚本

PowerShell.exe -ExecutionPolicy Bypass -File "D:\Downloads\PowerShell.ps1"
仅对当前会话有效,退出当前PowerShell后策略自动恢复

3.5 直接运行网络未签名脚本

在本地包含脚本的目录下执行如下命令,启动简单web服务
python -m http.server 9000 
通过本机IP即可访问该文件夹的脚本文件
http://127.0.0.1:9000/Microsoft.PowerShell_profile.ps1

通过 Invoke-Expression 命令从网络加载 PowerShell 脚本. 效果同本地文件... 
IEX (New-Object Net.WebClient).DownloadString('http://127.0.0.1:9000/Microsoft.PowerShell_profile.ps1')
这个脚本文件本身,即使有来自Internet的标记,不需要解锁,就能加载执行。

查看相关帮助
  • Iex -?
  • get-help Invoke-Expression -examples
  • get-help Invoke-Expression -detailed

加载 PowerShell 脚本 

3.6 小结

网络下载的未签名脚本,如上所述,很多方法,非常容易就能解锁变为本地脚本。
再回看前面的 [执行策略表格] 对于网络下载的未签名脚本的态度:
  • RemoteSigned,No,但是可以轻松1秒解锁… 
  • UnRestricted,Yes (提示)
  • Bypass,Yes
这样看来这3个策略其实差别不大... 

4. 执行策略可能会失败的原因

出现以下错误: 
AuthorizationManager check failed. 

PowerShell 使用 Windows 桌面 Shell 中的 API (explorer.exe) 来验证脚本文件的区域。 
Windows Shell 在 Windows Server Core 和 Windows Nano Server 上不可用。

如果 Windows 桌面 Shell 不可用或无响应,也可能在任何 Windows 系统上收到此错误。 
例如,在登录期间,PowerShell 登录脚本可能会在 Windows 桌面准备就绪之前开始执行,从而导致失败。

使用 ByPass 或 AllSigned 的执行策略不需要区域检查,以避免问题。

2025-12-16

Windows-PowerShell-prompt

1. about_Prompts
	1.1 获取 prompt 函数
	1.2 获取 prompt 脚本
	1.3 默认提示符
	1.4 内置提示符
2. 自定义当前会话的提示符
	2.1 几个简单的例子
	2.2 检测是否管理员运行
	2.3 显示历史记录ID
	2.4 随机更改颜色的提示符
3. 自定义配置文件
	3.1 about_Profiles
	3.2 配置文件类型和位置
	3.3 $PROFILE 变量
	3.4 创建配置文件
	3.5 编辑配置文件
	3.6 修改执行策略-允许本地脚本运行
	3.7 NoProfile 参数
	3.8 添加更多个性化设置
4. 转载一个不错的配置

1. about_Prompts

PowerShell 具有内置 prompt 函数。 可以在 PowerShell 配置文件脚本中定义自定义 prompt 函数。 
function prompt { <function-body> }
prompt 函数必须返回一个对象。 最佳做法是返回一个字符串或格式化为字符串的对象。 建议最大长度是 80 个字符。 
PS C:\Windows\system32> function prompt {"Hello, World > "}
Hello, World >

1.1 获取 prompt 函数

若要获取 prompt 函数,请在 Function 驱动器中使用 Get-Command cmdlet 或使用 Get-Item cmdlet。
Get-Command prompt
CommandType     Name                                               Version    Source
Function        prompt

Get-Item Function:prompt
CommandType     Name                                               Version    Source
Function        prompt

1.2 获取 prompt 脚本

若要获取设置提示符的值的脚本,请使用函数的 ScriptBlockprompt 属性。 
PS C:\Windows\system32> (Get-Command prompt).ScriptBlock

与所有函数一样,prompt 函数存储在 Function: 驱动器中。 若要显示创建当前 prompt 函数的脚本,请键入: 
PS C:\Windows\system32> (Get-Item Function:prompt).ScriptBlock

1.3 默认提示符

仅当 prompt 函数生成错误或未返回对象时,才会显示默认提示符。
默认 PowerShell 提示符为:
PS>
例如,以下命令将 prompt 函数设置为 $null,这是无效的。 因此会显示默认提示符。 
 function prompt {$null}
PS>
因为 PowerShell 附带内置提示符,所以通常不会看到默认提示符。 

1.4 内置提示符

PowerShell 包含内置 prompt 函数。 
function prompt {
  "PS $($ExecutionContext.SessionState.Path.CurrentLocation)$('>' * ($NestedPromptLevel + 1)) ";
  # .Link
  # https://go.microsoft.com/fwlink/?LinkID=225750
  # .ExternalHelp System.Management.Automation.dll-help.xml
}
该函数使用 Test-Path cmdlet 测试 $PSDebugContext 自动变量是否具有值。 
  • 如果 $PSDebugContext 具有值,则你在调试模式下运行,且 [DBG]: 已添加到提示符,如下所示: 
    • [DBG]: PS C:\ps-test>
  • 如果未填充 $PSDebugContext,则函数会将 PS 添加到提示符。 并且,该函数使用 Get-Location cmdlet 获取当前文件系统目录位置。 随后,它会添加一个右尖括号 (>)。 
    • PS C:\ps-test>
  • 如果处于嵌套提示符中,则该函数会将两个尖括号 (>>) 添加到提示符。
  • 如果 $NestedPromptLevel 自动变量的值大于 0,则处于嵌套提示符中。
  • 例如,在嵌套提示符中进行调试时,提示符类似于以下提示符:
    • [DBG] PS C:\ps-test>>>

2. 自定义当前会话的提示符

若要自定义提示符,请编写新的 prompt 函数。 该函数不受保护,因此可以覆盖它。
若要编写 prompt 函数,请键入以下内容:
function prompt { }
随后在大括号之间,输入创建提示符的命令或字符串。

2.1 几个简单的例子

例如,下面的提示符包含计算机名称:
PS C:\Windows\system32> function prompt {"PS [$Env:COMPUTERNAME]> "}
PS [TOMPC]>

下面的 prompt 函数包含当前日期和时间: 
PS [TOMPC]> function prompt {"$(Get-Date)> "}
12/11/2025 20:45:35>

路径+日期
function prompt {"$(Get-Location) $(Get-Date)> "}
格式化后的时间+路径
function prompt {"[ $(Get-Date -Format 'HH:mm:ss') ] $(Get-Location) >"}

2.2 检测是否管理员运行

还可以更改默认 prompt 函数:
例如,以下修改后的 prompt 函数在提升的会话中运行时,会将 [ADMIN]: 添加到内置的 PowerShell 提示符。
function prompt {
  $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
  $principal = [Security.Principal.WindowsPrincipal] $identity
  $adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator

$(if (Test-Path Variable:/PSDebugContext) { '[DBG]: ' }
    elseif($principal.IsInRole($adminRole)) { "[ADMIN]: " }
    else { '' }
  ) + 'PS ' + $(Get-Location) +
    $(if ($NestedPromptLevel -ge 1) { '>>' }) + '> '
}
使用“以管理员身份运行”选项启动 PowerShell 时,会显示类似于以下提示符的提示符: 
[ADMIN]: PS C:\Windows\system32>

2.3 显示历史记录ID

以下 prompt 函数显示下一个命令的历史记录 ID。 若要查看命令历史记录,请使用: Get-History 
function prompt {
   # The at sign creates an array in case only one history item exists.
   $history = @(Get-History)
   if($history.Count -gt 0)
   {
      $lastItem = $history[$history.Count - 1]
      $lastId = $lastItem.Id
   }

$nextCommand = $lastId + 1
   $currentDirectory = Get-Location
   "PS: $nextCommand $currentDirectory >"
}
PS: 7 C:\Windows\system32 >

PS: 7 C:\Windows\system32> get-history
  Id CommandLine
  -- -----------
   1 (Get-Item Function:prompt).ScriptBlock
   2  Get-Location
   3 function prompt {"PS [$Env:COMPUTERNAME]> "}
   4 function prompt {"$(Get-Date)> "}
   5 function prompt {...
   6 function prompt {...
PS: 8 C:\Windows\system32 >

2.4 随机更改颜色的提示符

以下提示符使用 Write-Host 和 Get-Random cmdlet 创建随机更改颜色的提示符。 因为 Write-Host 会写入当前主机应用程序,但不会返回对象,所以此函数包含 return 语句。 如果没有该语句,则 PowerShell 会使用默认提示符 PS>。 
function prompt {
    $color = Get-Random -Min 1 -Max 16
    Write-Host ("PS " + $(Get-Location) +">") -NoNewline -ForegroundColor $Color
    return " "
}
PS C:\Windows\system32>

3. 自定义配置文件

3.1 about_Profiles

与任何函数一样,prompt 函数仅存在于当前会话中。如前一章的例子。
PowerShell 配置文件是在 PowerShell 启动时运行的脚本。
  • 可以使用配置文件作为启动脚本来自定义环境。
  • 可以将如前一章的例子都添加到配置文件中。
  • 可以添加命令、别名、函数、变量、模块、PowerShell 驱动器等。
  • 还可以将其他特定于会话的元素添加到配置文件中,以便在每个会话中都可用,而无需导入或重新创建它们。
PowerShell 支持多个用户和主机程序的配置文件。但是,它不会为你创建配置文件。

3.2 配置文件类型和位置

PowerShell 支持多个范围限定为用户和 PowerShell 主机的配置文件。 你可以在计算机上拥有任何或全部这些配置文件。
PowerShell 控制台支持以下基本配置文件。 这些文件路径是默认位置。

  • 所有用户、所有主机 AllUsersAllHosts
    • Windows- $PSHOME\Profile.ps1
    • Linux - /opt/microsoft/powershell/7/profile.ps1
    • macOS - /usr/local/microsoft/powershell/7/profile.ps1
  • 所有用户,当前主机
    • Windows- $PSHOME\Microsoft.PowerShell_profile.ps1
    • Linux - /opt/microsoft/powershell/7/Microsoft.PowerShell_profile.ps1
    • macOS - /usr/local/microsoft/powershell/7/Microsoft.PowerShell_profile.ps1
  • 当前用户、所有主机
    • Windows- $HOME\Documents\PowerShell\Profile.ps1
    • Linux - ~/.config/powershell/profile.ps1
    • macOS - ~/.config/powershell/profile.ps1
  • 当前用户,当前主机 CurrentUserCurrentHost
    • Windows- $HOME\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
    • Linux - ~/.config/powershell/Microsoft.PowerShell_profile.ps1
    • macOS - ~/.config/powershell/Microsoft.PowerShell_profile.ps1
配置文件脚本按列出的顺序执行。 这意味着,
  • AllUsersAllHosts 配置文件中所做的更改可由任何其他配置文件脚本重写。
  • CurrentUserCurrentHost 配置文件始终最后运行。
在 PowerShell 帮助中,CurrentUserCurrentHost 最常称为 PowerShell 配置文件。

托管 PowerShell 的其他程序可以支持自己的配置文件。 
例如,Visual Studio Code (VS Code) 支持以下特定于主机的配置文件。 
  • 所有用户,当前主机 - $PSHOME\Microsoft.VSCode_profile.ps1
  • 当前用户、当前主机 - $HOME\Documents\PowerShell\Microsoft.VSCode_profile.ps1
配置文件路径包括以下变量:
  • $PSHOME 变量存储 PowerShell 的安装目录
  • $HOME 变量存储当前用户的主目录

3.3 $PROFILE 变量

$PROFILE
D:\Tom\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
$PROFILE 自动变量存储当前会话中可用的 PowerShell 配置文件的路径。
若要查看配置文件路径,请显示 $PROFILE 变量的值。 还可以在命令中使用 $PROFILE 变量来表示路径。
$PROFILE 变量存储“当前用户、当前主机”配置文件的路径。 其他配置文件保存在 $PROFILE 变量的注释属性中。
例如,$PROFILE 变量在 Windows PowerShell 控制台中具有以下值。
  • 当前用户、当前主机 - $PROFILE
  • 当前用户、当前主机 - $PROFILE.CurrentUserCurrentHost
  • 当前用户、所有主机 - $PROFILE.CurrentUserAllHosts
  • 所有用户、当前主机 - $PROFILE.AllUsersCurrentHost
  • 所有用户、所有主机 - $PROFILE.AllUsersAllHosts
由于每个用户和每个主机应用程序中 $PROFILE 变量的值发生更改,因此请确保在所使用的每个 PowerShell 主机应用程序中显示配置文件变量的值。
若要查看 $PROFILE 变量的当前值,请键入:
 $PROFILE | Select-Object *
AllUsersAllHosts       : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost    : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts    : D:\Tom\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost : D:\Tom\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Length                 : 67
PS C:\Windows\system32>

可以在许多命令中使用 $PROFILE 变量。 例如,以下命令在记事本中打开“当前用户,当前主机”配置文件: 
 notepad $PROFILE

 $PROFILE
D:\Tom\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

以下命令确定是否在本地计算机上创建了“所有用户,所有主机”配置文件: 
 Test-Path -Path $PROFILE.AllUsersAllHosts
FALSE

3.4 创建配置文件

若要创建 PowerShell 配置文件,请使用以下命令格式:
if (!(Test-Path -Path <profile-name>)) {   New-Item -ItemType File -Path <profile-name> -Force }
例如,若要在当前 PowerShell 主机应用程序中为当前用户创建配置文件,请使用以下命令: 
if (!(Test-Path -Path $PROFILE)) {   New-Item -ItemType File -Path $PROFILE -Force }
    目录: D:\Tom\Documents\WindowsPowerShell
Mode                 LastWriteTime         Length Name
-a----        2025/12/11     21:10              0 Microsoft.PowerShell_profile.ps1
在此命令中,if 语句阻止覆盖现有配置文件。 将 $PROFILE 变量的值替换为要创建的配置文件的路径。 

创建所有用户所有主机的配置文件
if (!(Test-Path -Path $PROFILE.AllUsersAllHosts)) {   New-Item -ItemType File -Path $PROFILE.AllUsersAllHosts -Force }
    目录: C:\Windows\System32\WindowsPowerShell\v1.0
Mode                 LastWriteTime         Length Name
-a----        2025/12/12      0:12              0 profile.ps1

3.5 编辑配置文件

可以在文本编辑器(如记事本)中打开任何 PowerShell 配置文件。
若要在记事本的当前 PowerShell 主机应用程序中打开当前用户的配置文件,请键入:
PS C:\Windows\system32> notepad $PROFILE

若要打开其他配置文件,请指定配置文件名称。 例如,若要打开所有主机应用程序的所有用户的配置文件,请键入: 
notepad $PROFILE.AllUsersAllHosts

先来个简单的配置,将以下代码复制到配置文件中。会显示时间和当前路径。
function prompt {"[ $(Get-Date -Format 'HH:mm:ss') ] $(Get-Location) >"}

若要应用更改,保存配置文件。
  • 然后重启 PowerShell,
  • 或者(. $Profile )重新加载配置文件。
类似 linux 环境下的 source 命令。在 Powershell 中,使用点号 . 来重新加载指定的 ps1 文件。 由于 $Profile 变量保存了 ps1 文件的绝对路径,所以可以用下面的命令使改动实时生效。
. $Profile 
无法加载文件 D:\Tom\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1,因为在此系统上禁止运行脚本。
… 
由于执行策略的默认设置是禁止所有脚本运行的,所有普通用户到这一步,加载配置文件时就会报错。

3.6 修改执行策略-允许本地脚本运行

查看当前执行策略
 Get-ExecutionPolicy
Restricted

为当前用户设置执行策略,允许运行本地脚本。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

再次查看当前执行策略
Get-ExecutionPolicy
RemoteSigned

然后再尝试加载脚本: 
. $Profile 
理论上应该会成功了。关闭会话,重新打开新的PowerShell,配置文件依然生效。

3.7 NoProfile 参数

设置的配置文件,那么每次打开都会加载相关自定义的内容。 若想回到无配置的状态,不必删除配置,可以用如下命令: 
powershell -NoProfile
更多参数,请看帮助:
Powershell -?

3.8 添加更多个性化设置

可以在 Windows 中使用 notepad.exe,或 VS Code。在 Linux 中使用 vi,或任何其他文本编辑器。
 code $PROFILE
 notepad $PROFILE
以下配置文件脚本包含许多自定义项的示例。 具体代码在如下页面里,微软网站提供的参考,直接复制运行可能会报错。有兴趣的可以自己研究研究。
此配置脚本提供以下个性化自定义的示例:
PowerShell-Docs 风格指南

4. 转载一个不错的配置

该文章分享了完整的脚本代码,包含注释。文章还对每一处做了详细的说明。
执行效果如图: 
包含功能: 
  • 判断是否为管理员权限;
  • 当前用户名;
  • 上一条命令完成后的时间;
  • 当前路径,然后换行;
  • 上一条命令运行的时间,秒数或分钟数。
可以根据个人喜好增减或调整顺序。
补充,可以添加一行: cd 目录, 修改初始路径。
function prompt {
    #Assign Windows Title Text
    $host.ui.RawUI.WindowTitle = "Current Folder: $pwd"
    #Configure current user, current folder and date outputs
    $CmdPromptCurrentFolder = Split-Path -Path $pwd -Leaf
    $CmdPromptUser = [Security.Principal.WindowsIdentity]::GetCurrent();
    $Date = Get-Date -Format 'dddd hh:mm:ss tt'
    # Test for Admin / Elevated
    $IsAdmin = (New-Object Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
    #Calculate execution time of last cmd and convert to milliseconds, seconds or minutes
    $LastCommand = Get-History -Count 1
    if ($lastCommand) { $RunTime = ($lastCommand.EndExecutionTime - $lastCommand.StartExecutionTime).TotalSeconds }
    if ($RunTime -ge 60) {
        $ts = [timespan]::fromseconds($RunTime)
        $min, $sec = ($ts.ToString("mm\:ss")).Split(":")
        $ElapsedTime = -join ($min, " min ", $sec, " sec")
    }
    else {
        $ElapsedTime = [math]::Round(($RunTime), 2)
        $ElapsedTime = -join (($ElapsedTime.ToString()), " sec")
    }
    #Decorate the CMD Prompt
    Write-Host ""
    Write-host ($(if ($IsAdmin) { 'Elevated ' } else { '' })) -BackgroundColor DarkRed -ForegroundColor White -NoNewline
    Write-Host " USER:$($CmdPromptUser.Name.split("\")[1]) " -BackgroundColor DarkBlue -ForegroundColor White -NoNewline
    If ($CmdPromptCurrentFolder -like "*:*")
        {Write-Host " $CmdPromptCurrentFolder "  -ForegroundColor White -BackgroundColor DarkGray -NoNewline}
        else {Write-Host ".\$CmdPromptCurrentFolder\ "  -ForegroundColor White -BackgroundColor DarkGray -NoNewline}
    Write-Host " $date " -ForegroundColor White
    Write-Host "[$elapsedTime] " -NoNewline -ForegroundColor Green
    return "> "
} #end prompt function 

2025-12-13

Windows-UAC

1. UAC
1.1 UAC选项
1.2 触发UAC警告条件
1.3 避免UAC提示的方法
2. 提供管理员权限-任务计划方式
2.1 Windows 任务计划
2.2 快捷方式
2.3 运行
2.4 更便捷的UAC白名单小工具
3. 不提供管理员权限-RUNASINVOKER
3.1 RUNASINVOKER
3.2 补充说明
4. 应用程序兼容性工具包 (ACT)

1. UAC

用户帐户控制 (UAC) User Account Control 旨在防止对 Windows 进行未经授权的更改。 
当作需要管理员级权限时,UAC 会提示你批准或拒绝更改。这有助于保护 Windows 设备免受恶意软件和未经授权的修改的影响。 

可以通过打开控制面板 > 系统和安全 > 更改用户帐户控制设置来更改 UAC 行为。
将滑块移动到所需的通知级别,然后选择“ 确定”以保存更改。

1.1 UAC选项

选项如下,中间2项基本一致,只是第三项更加友好些。
  • 始终通知
  • 仅当应用尝试对我的计算机进行更改时通知我 (默认)
  • 仅当程序尝试更改我的计算机时通知我 (不调暗我的桌面)
  • 从不通知 (禁用 UAC)

1.2 触发UAC警告条件

  • 安装或卸载程序
  • 账户设置
  • 系统各种设置
  • 注册表操作
  • 访问系统目录,程序目录
  • 访问其他用户目录
  • 安装驱动
  • 设置共享
  • … 
更详细的列表: 

1.3 避免UAC提示的方法

禁用 UAC 是不推荐的。但可以针对个别软件进行相应的设置,规避UAC提示。

避免UAC提示的方法有: 
  • 提供管理员权限
    • Windows 任务计划
    • 更便捷的UAC白名单小工具
  • 不提供管理员权限
    • [RUNASINVOKER] 强制软件 [以普通用户身份运行] 以取消 UAC 提示
  • 微软应用程序兼容性工具包 (ACT) Application Compatibility Toolkit

2. 提供管理员权限-任务计划方式

方法有点绕,效果还不错。步骤是先建立一个任务计划,再建立对应的快捷方式。参照原文连接:

2.1 Windows 任务计划

 右键开始菜单,选择计算机管理(cmd: compmgmt)
计算机管理中,依次点开: 系统工具\任务计划程序\任务计划执行库
菜单栏: 操作\创建任务
  1. 创建任务界面\常规页签 
    • 填写名称,比如: RunCMDAdmin
    • 勾选 使用最高权限运行
  2. 创建任务界面\操作页签
    • 点击 [新建]
  3. 新建操作界面\
    • 程序或脚本: C:\Windows\System32\cmd.exe 
    • 起始于(可选): D:\Tom\Documents
      • 说明: 起始于路径,可以定义打开cmd时的初始位置,对于需要将命令执行结果写入文本文件的需要。可以输入保存文件的位置。
    • 点击[确定]
计划任务建好,可以右键计划任务名称,选择运行看看。
打开的cmd是管理员权限,且过程没有弹出UAC警告。

2.2 快捷方式

桌面空白处右键菜单 选择 新建\快捷方式
快捷方式的位置填写: schtasks.exe /run /tn "RunCMDAdmin" 
点击 下一步 填写快捷方式名称: cmdAdmin 点击[完成]

2.3 运行

双击创建的快捷方式就会发现不会弹出 UAC 并且 [以管理员身份运行] 了。 

2.4 更便捷的UAC白名单小工具

第三方小工具,把前面的计划任务到快捷方式的操作打包成的便捷的小工具。
约50k的小工具,界面很简单,下载下来就能用。原理就是前面的添加计划任务方式。

3. 不提供管理员权限-RUNASINVOKER

强制软件 [以普通用户身份运行] 以取消 UAC 提示。参照原文连接:

3.1 RUNASINVOKER

regedit 打开注册表编辑器
计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
进入 Layers 文件夹后,新建一个 [字符串值]。
字符串名称就是你指定的软件完整路径, 无论路径里有没有空格都不需要加上引号!比如: 
F:\Program Files\HoYoPlay\games\Genshin Impact game\GenshinImpact.exe

然后右键刚刚新建的字符串 - 修改 - 数值数据:RUNASINVOKER
完成,可以回到桌面打开GenshinImpact看看,没有UAC警告,运行正常。

注意:如果你打算添加新字符串值时,发现该注册表项已存在了,那么说明你设置过该软件的 兼容性(右键 - 属性 - 兼容性 选项卡),遇到这种情况,你只需追加到最后就行了。
例如注册表已存在的数值数据为:~ WIN7RTM
那么就改成:~ WIN7RTM RUNASINVOKER

3.2 补充说明

原文添加了 WeGame 的 RUNASINVOKER。我这里添加了 GenshinImpact。
想想也是,作为普通游戏,只是在首次安装游戏时需要权限。平时运行时并不需要管理员权限。
最多在新账户首次登录时或许需要权限,比如将用户信息写入注册表,或者建立新账户目录等... 并不需要打开游戏时就获取管理员权限。
安全的做法是打开游戏并不需要管理员权限,但当修改新账号时触发新账号验证程序的时刻触发 UAC 警告。提升权限完成验证。完成后则回到普通用户模式运行程序。

总结一下,游戏类的都可以用这种方式规避UAC警告。不要使用前面计划任务提权的方式。
如果游戏程序拥有管理员权限,那么在你全屏沉浸式游玩的过程中,游戏程序会不会在后台做些奇怪的事。若设置为RUNASINVOKER,那么UAC会阻挡奇怪的事情发生。

注意事项:这种方法仅适用于需要较低权限运行的程序,对于需要管理员权限才能正常工作的程序,应谨慎使用,以免影响程序功能。

4. 应用程序兼容性工具包 (ACT)

Application Compatibility Toolkit
Microsoft应用程序兼容性工具包(ACT)是一种生命周期管理工具,可帮助识别和管理整个应用程序组合,降低解决应用程序兼容性问题所涉及的成本和时间,并帮助快速部署 Windows 和 Windows 更新。 
Windows 10 应用程序兼容性工具包随 Windows 10 ADK 一起发布: 

使用 应用程序兼容性工具包 ACT ,避免UAC警告。操作过程貌似繁琐。相关帖子很多,但都是很多年前的。
现在,ACT已经集成到 Windows10 ADK(生成WindowsPE就需要用这个ADK)
有兴趣的人可以自己下载安装看看。

Blender-Gears

导航 (返回顶部) 1. Gear 2. 齿轮分类 2.1 根据齿轮轴相对位置 Relative axis position 2.2 以传动比分类 2.3 非刚性齿轮 Non-rigid 3. Gear建模 3.1 手动建模 3.2 插件建模 3.3 精确建...