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

第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.dtcms.com/a/360356.html

相关文章:

  • 蓓韵安禧活性叶酸源于上市企业生产
  • 网站漏洞早发现:cpolar+Web-Check安全扫描组合解决方案
  • 5w2h构建数据仓库与sow
  • H264几个参数说明
  • 大话 IOT 技术(4) -- 答疑篇
  • [光学原理与应用-355]:ZEMAX - 设置 - 系统检查与系统测试
  • k8s三阶段项目
  • 物理气相沉积(PVD)技术及应用现状和发展趋势
  • FreeRTOS深入理解
  • 数据库索引abc,请问查询哪些字段能命中索引
  • 平滑滤波器(Smooth Filter)的MATLAB与Verilog仿真设计与实现
  • 关于Ctrl+a不能全选的问题
  • 封装哈希表
  • 机器视觉opencv教程(四):图像颜色识别与颜色替换
  • 【开题答辩全过程】以 基于SpringBoot的流浪猫狗领养系统为例,包含答辩的问题和答案
  • C语言中如何使用NULL
  • 【Linux】系统部分——ELF文件格式与动态库加载
  • Asible管理变量和事实和实施任务控制
  • 科学研究系统性思维的方法体系:研究设计相关模版
  • 【Unity3D实例-功能-切换武器】切换武器(一)动画配置
  • IAR 用JLINK 下载代码设置步骤
  • FLEXPART 拉格朗日粒子扩散模式建模技术及研究大气污染物源-汇关系中的实践
  • 订餐后台管理系统-day06菜品分类模块
  • 工业软件领域SAAS模式为何不能得到普及?
  • 上海交大具身导航中的感知智能、社会智能和运动智能全面综述
  • 网络端口与服务对应表 - 白帽子安全参考指南
  • Android开发-设计规范
  • 安装proteus,并实现stm32仿真
  • 当 AI 开始 “筛选” 信息:算法偏见会加剧认知鸿沟吗?如何构建公平的 AI 生态?
  • 深入解析 Oracle 并发与锁机制:高并发环境下的数据一致性之道