系统学习 Windows 学习路径:从 CMD 到 PowerShell、系统网络,再到 WSL 与 Server

PowerShell

启动并区分 PowerShell 5.1 与 7.x,管理脚本环境。

补充说明

PowerShell 是面向对象的命令行外壳和脚本语言:cmdlet 输出 .NET 对象而不是文本,管道传递对象,因此可以用 Where-Object、Select-Object 继续加工。Windows 自带的是 powershell.exe(5.1,.NET Framework),pwsh.exe 是独立安装的 7.x(.NET),两者并存且配置、模块路径不同;用 $PSVersionTable 的 PSEdition(Desktop/Core)判断。PowerShell 是宿主程序而不是 cmdlet,没有管道输出和别名;具体命令通过 powershell.exe 或 pwsh.exe 启动。

边界:执行策略(Execution Policy)只限制脚本加载,不是安全边界,不能代替 ACL、签名和最小权限;它也不影响交互式命令和 -Command 字符串。$PROFILE 中的函数、别名和模块会改变命令解析结果,排障和计划任务要用 -NoProfile 复现干净环境。32 位与 64 位进程看到的注册表和 System32 不同(SysWOW64 重定向)。

权限:运行交互式会话通常不需要管理员;系统级安装 7.x、写入系统级模块目录、执行需要提权的 cmdlet 才需要管理员。7.x 差异:只有 pwsh 支持 ForEach-Object -Parallel、三元运算符等新语法;5.1 不支持这些语法,脚本若要兼容 5.1 就不要使用。

常用示例

# 1. 确认版本、版本线和宿主,排障第一步
PS C:\> $PSVersionTable | Format-List

# 2. 用干净会话执行一条命令,排除 profile 干扰
PS C:\> powershell.exe -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).Caption"

# 3. 7.x 差异:用 pwsh 执行脚本文件,参数按 -File 传入
PS C:\> pwsh -NoProfile -File .\report.ps1 -Days 7

# 4. 查看各作用域的执行策略,定位“脚本被阻止”来自哪一层
PS C:\> Get-ExecutionPolicy -List

# 5. 确认当前进程位数,排查注册表和 System32 重定向
PS C:\> [Environment]::Is64BitProcess; [Environment]::Is64BitOperatingSystem

# 6. 统计当前会话可见的管理类命令数量
PS C:\> (Get-Command -Module Microsoft.PowerShell.Management).Count

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 怎样一眼判断当前会话是 Windows PowerShell 5.1 还是 PowerShell 7.x?
  2. 执行策略阻止 .ps1 运行,是否说明当前用户没有文件读取权限?
  3. 计划任务调用 PowerShell 时,为什么建议加 -NoProfile,复杂命令为什么优先 -File?
答案
  1. 看 $PSVersionTable.PSVersion 和 PSEdition:5.1 是 Desktop,7.x 是 Core;再看宿主是 powershell.exe 还是 pwsh.exe。
  2. 不是;执行策略是脚本加载策略,不是 ACL 安全边界,文件权限要单独用 ACL 判断。
  3. -NoProfile 排除 profile 的函数、别名和模块副作用;-File 避免多层引号和变量提前展开。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令