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

发布于:2025-09-01 ⋅ 阅读:(13) ⋅ 点赞:(0)

第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