当前位置: 首页 > ops >正文

第25章学习笔记|额外的提示、技巧与技术(PowerShell 实战版)

第25章学习笔记|额外的提示、技巧与技术(PowerShell 实战版)

关键词:Profile 自定义、提示符/颜色、进阶运算符、字符串/日期处理、WMI 时间、参数默认值、脚本块


1)自定义 Shell:Profile、提示符与颜色

1.1 Profile 脚本是什么

每次打开 PowerShell,托管应用程序(控制台、ISE 等)都会尝试加载一组“开机自启”的脚本,即 Profile,用来预置你的环境(加载模块/PSDrive、设置变量、函数、路径等)。
常见加载顺序(存在则执行):

  1. $PSHome\Profile.ps1(所有用户、所有宿主)
  2. $PSHome\Microsoft.PowerShell_profile.ps1(所有用户、仅控制台)
    $PSHome\Microsoft.PowerShellISE_profile.ps1(所有用户、仅 ISE)
  3. $Home\Documents\WindowsPowerShell\Profile.ps1(当前用户、所有宿主)
  4. $Home\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1(当前用户、仅控制台)
    $Home\Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1(当前用户、仅 ISE)

提醒:

  • 64 位与 32 位 PowerShell 各自有一套目录,模块/扩展的可用性不一定相同。
  • Profile 受执行策略影响(Get-ExecutionPolicy);AllSigned 需要签名,Restricted 将阻止脚本执行。
  • 需要跨宿主共享初始化,优先在“当前用户、所有宿主”的 Profile 编写公共部分。

示例 Profile(最小化)

# 加载常用模块/PSDrive
Import-Module ActiveDirectory
# 设定起始目录
Set-Location C:\
# 调整消息颜色(见 1.3)
(Get-Host).PrivateData.ErrorForegroundColor   = 'DarkRed'
(Get-Host).PrivateData.WarningForegroundColor = 'Yellow'
(Get-Host).PrivateData.VerboseForegroundColor = 'Cyan'

1.2 自定义提示符(Prompt)

提示符由内置函数 Prompt 生成;在 Profile 中覆盖即可。

默认行为(简化理解):显示 PS <当前路径>>,调试或嵌套会话加前缀。

自定义示例

function Prompt {$time = (Get-Date).ToShortTimeString()"$time [$env:COMPUTERNAME]:> "
}

效果:6:07 PM [CLIENT01]:>

技巧:双引号会做变量插值;如果提示符逻辑复杂,尽量保持纯计算 + 轻量字符串,避免频繁耗时命令。

1.3 调整颜色(控制台宿主)

  • 窗口整体前景/背景:右键窗口左上角 → 属性 → “颜色”。
  • 各种消息颜色(脚本可控,建议写入 Profile):
$pd = (Get-Host).PrivateData
$pd.ErrorForegroundColor   = 'Green'       # or DarkRed/Yellow/Blue/Cyan/Magenta/White/Black + Dark*
$pd.WarningForegroundColor = 'Yellow'
$pd.VerboseForegroundColor = 'Cyan'
$pd.DebugForegroundColor   = 'Gray'
$pd.ProgressForegroundColor= 'White'

ISE 对颜色支持与控制台不同;有的设置在 ISE 中不会生效。


2)进阶运算符速通

2.1 -as / -is

  • -as:尝试类型转换,失败返回 $null
    1000/3 -as [int]333
  • -is:判断对象是否该类型,返回 True/False
    "SERVER-R2" -is [string]True

2.2 -replace(字符串替换,支持正则)

"192.168.34.12" -replace '34','15'   # 192.168.15.12

2.3 -join / -split(拼接与拆分)

$ary = 'one','two','three'
$ary -join '|'              # one|two|three
"Server1`tWindows`tEast" -split "`t"  # \t 制表符

2.4 -contains / -in(集合包含)

$set = 'abc','def','ghi'
$set -contains 'abc'        # True
'abc' -in $set              # True
# 注意:模糊匹配请用 -like / -match,而非 -contains
'this' -like '*his*'        # True

3)字符串与日期对象常用方法

3.1 System.String

"Hello".ToUpper()
"  Don".Trim()
"SERVER-R2".IndexOf('-')    # 6

大多数场景用运算符更直观(如 -replace/-split),但索引、Trim/ToLower/ToUpper 这些方法非常顺手。

3.2 System.DateTime

$now = Get-Date
$now.AddDays(-90).ToShortDateString()  # 90天前(短日期)
$now.Month                             # 取月份

“To*String”家族受本机区域设置影响。


4)WMI 日期时间处理(ConvertToDateTime

WMI 中的时间戳如:20150317090459.125599+480,需转换。

$os = Get-WmiObject Win32_OperatingSystem
$os.ConvertToDateTime($os.LastBootUpTime)

投影到对象属性

Get-WmiObject Win32_OperatingSystem |Select-Object BuildNumber, CSName,@{Name='LastBootTime';Expression={ $_.ConvertToDateTime($_.LastBootUpTime) }}

5)给参数设默认值($PSDefaultParameterValues

对任意命令的任意参数设“懒加载默认”,在未显式传参时生效(适合放到 Profile)。

所有命令都默认带 Credential

$cred = Get-Credential -UserName 'Administrator' -Message 'Enter Admin Credential'
$PSDefaultParameterValues['*:Credential'] = $cred

Invoke-Command 需要时临时提示

$PSDefaultParameterValues['Invoke-Command:Credential'] = {Get-Credential -UserName 'Administrator' -Message 'Enter Administrator Credential'
}

作用域规则:在控制台设置→对整个会话有效;在脚本内设置→仅该脚本作用域有效(不会污染全局)。
文档:help about_Parameters_Default_Values


6)脚本块(ScriptBlock)——PowerShell 的“匿名函数”

  • 结构:{ <一组命令> };很多参数都接收脚本块(如 Where-Object -FilterScriptForEach-Object -ProcessInvoke-Command -ScriptBlockSelect-ObjectExpression 等)。
  • 变量调用执行:& $block

示例

$TopMem = {Get-Process | Sort-Object VM -Descending | Select-Object -First 10
}
& $TopMem

7)实战清单 & 易错提醒

立即可做

  • 新建/编辑 Profile,放入:常用模块、起始目录、提示符、颜色、参数默认值。
  • 为常用命令加默认 -Credential、默认 -ComputerName、默认 -Verbose(酌情)。
  • 把常用一次性查询封装为脚本块或函数,减少重复输入。

坑点回避

  • 32/64 位环境与 ISE/控制台差异:模块可用性、颜色行为不完全一致。
  • 执行策略阻止 Profile:先 Get-ExecutionPolicy,必要时 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
  • -contains精确集合包含;模糊匹配请用 -like-match
  • 字符串分隔符中的转义:制表符用 "`t",反斜杠/点号在正则里要转义。

8)一页速查(可贴在 Profile 顶部注释)

# Profile 位置(当前用户)
#   $Home\Documents\WindowsPowerShell\Profile.ps1
# 自定义提示符
function Prompt { "$(Get-Date -f T) [$env:COMPUTERNAME]:> " }
# 消息颜色
$pd = (Get-Host).PrivateData
$pd.ErrorForegroundColor   = 'DarkRed'
$pd.WarningForegroundColor = 'Yellow'
$pd.VerboseForegroundColor = 'Cyan'
# 参数默认值
$PSDefaultParameterValues['*:Verbose'] = $true      # 默认显示详细输出(可按需)
# 常用运算符示例
#  -as/-is;-replace;-join/-split;-contains/-in;-like/-match

http://www.xdnf.cn/news/19294.html

相关文章:

  • Qt Core 之 QString
  • PyTorch 张量(Tensor)详解:从基础到实战
  • 【深度学习】配分函数:近似最大似然与替代准则
  • python复杂代码如何让ide自动推导提示内容
  • 编写Linux下usb设备驱动方法:disconnect函数中要完成的任务
  • More Effective C++ 条款20:协助完成返回值优化(Facilitate the Return Value Optimization)
  • 每日算法题【栈和队列】:栈和队列的实现、有效的括号、设计循环队列
  • [软考中级]嵌入式系统设计师—考核内容分析
  • Redis持久化之AOF(Append Only File)
  • Java基础知识(十二)
  • 8.31【Q】CXL-DMSim:
  • vue3+vite+ts 发布npm 组件包
  • Deep Think with Confidence:llm如何进行高效率COT推理优化
  • 第24章学习笔记|用正则表达式解析文本文件(PowerShell 实战)
  • zkML-JOLT——更快的ZK隐私机器学习:Sumcheck +Lookup
  • Pytest 插件介绍和开发
  • leetcode 260 只出现一次的数字III
  • COLA:大型语言模型高效微调的革命性框架
  • 免费电脑文件夹加密软件
  • 基于Adaboost集成学习与SHAP可解释性分析的分类预测
  • 【K8s】整体认识K8s之存储--volume
  • 在win服务器部署vue+springboot + Maven前端后端流程详解,含ip端口讲解
  • Transformer架构三大核心:位置编码(PE)、前馈网络(FFN)和多头注意力(MHA)。
  • 学习Python中Selenium模块的基本用法(12:操作Cookie)
  • TFS-2005《A Possibilistic Fuzzy c-Means Clustering Algorithm》
  • 使用 Python 自动化检查矢量面数据的拓扑错误(含导出/删除选项)
  • 算法题(196):最大异或对
  • 特殊符号在Html中的代码及常用标签格式的记录
  • Qt组件布局的经验
  • 线程池、锁策略